0

J'utilise ES v5.1.2 et un problème avec les facettes renvoyant des types incorrects pour les champs booléens. Voici une configuration minimale de reproduire et de démontrer le problème:Les facettes booléennes Elasticsearch renvoyées en tant que type incorrect

from elasticsearch_dsl import DocType, FacetedSearch, TermsFacet 
from elasticsearch_dsl.field import Keyword, Integer, Boolean 

class Post(DocType): 
    comment = Keyword() 
    likes = Integer() 
    published = Boolean() 
    class Meta: 
     index = 'blog' 

class PostSearch(FacetedSearch): 
    index = 'blog' 
    doc_types = [Post] 
    fields = 'comment', 'likes', 'published' 
    facets = {k: TermsFacet(field=k) for k in fields} 

maintenant créer des documents dans l'index, et effectuer une recherche à facettes:

>>> Post.init() 
>>> Post(comment='potato', likes=42, published=True).save() 
True 
>>> Post(comment='spud', likes=12, published=False).save() 
True 
>>> Post(comment='foo', likes=7, published=True).save() 
True 
>>> search = PostSearch() 
>>> response = search.execute() 

Les données de réponse individuelle semble correcte:

>>> response.hits.total 
3 
>>> vars(response[0]) 
{'_d_': {u'comment': u'spud', u'likes': 12, u'published': False}, 
'meta': {u'index': u'blog', u'score': 1.0, u'id': u'AVofDCdDpUlHAgmQ...}} 
>>> response[0].published 
False 

Autrement dit, nous avons désérialisé les booléens Python sur les résultats de la recherche. Toutefois, les données dans les agrégations est incorrecte:

>>> response.facets.to_dict() 
{'comment': [(u'foo', 1, False), (u'potato', 1, False), (u'spud', 1, False)], 
'likes': [(7, 1, False), (12, 1, False), (42, 1, False)], 
'published': [(1, 2, False), (0, 1, False)]} 

Les facettes doivent être de 3-tuples de (valeur, compte, sélectionné). Mais les valeurs booléennes reviennent à 1 et à 0, elles ne sont pas désérialisées, donc le frontend et mes templates ne sont pas capables de distinguer un type entier d'un type booléen. Pour résumer, le comportement attendu et réel sont présentés ci-dessous:

Comportement réel:

>>> response.facets['published'] 
[(1, 2, False), (0, 1, False)] 

Comportement attendu:

>>> response.facets['published'] 
[(True, 2, False), (False, 1, False)] 

ce que je fais mal ici? Comment pouvons-nous rendre les valeurs de facettes d'un champ Boolean désérialisées correctement dans les facettes, comme elles le font dans les résultats de recherche réels?

Répondre

1

Ceci est un bug qui a été corrigé dans https://github.com/elastic/elasticsearch-dsl-py/issues/583

+0

Pas de test pour le bogue? – wim

+0

de temps en temps je deviens un peu fou et commets une correction triviale sans test:) Je pense que la couverture de test est encore assez bonne et espérait qu'une résolution rapide serait préférable. –

+0

Le code non testé est un code brisé. Le ['FacetedResponse.facets'] (https://github.com/elastic/elasticsearch-dsl-py/blob/d291eb55ef01f6bfa02835dcfd90276d5cd8871e/elasticsearch_dsl/faceted_search.py#L164-L167) utilise [' Facet.get_values'] (https: //github.com/elastic/elasticsearch-dsl-py/blob/d291eb55ef01f6bfa02835dcfd90276d5cd8871e/elasticsearch_dsl/faceted_search.py#L68) qui [renvoie simplement le 'bucket ['key']' inchangé] (https://github.com/ élastique/elasticsearch-dsl-py/blob/d291eb55ef01f6bfa02835dcfd90276d5cd8871f/elasticsearch_dsl/faceted_search.py ​​# L58). Je ne suis pas convaincu que le problème est résolu par le commit. – wim