0

私はES v5.1.2を使用しており、ブールフィールドの不正なタイプを返すファセットに問題があります。ここで問題を再現し、実証するための最小限の設定です:エラスティックサーチブールファセットが間違ったタイプとして返​​されました

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} 

今すぐインデックスにいくつかの文書を作成し、ファセット検索を実行します。

>>> 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() 

個々の応答データが正しいになります

>>> 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 

つまり、検索結果にPythonブール値を逆シリアル化しました。ただし、集計のデータは正しくありません。

>>> 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)]} 

ファセットは(値、カウント、選択された)3タプルである必要があります。しかし、ブーリアン値は1と0に戻り、デシリアライズされなかったので、フロントエンドとテンプレートは整数型とブール型を区別できません。要約すると、期待と実際の動作は以下の通りである:

実際の動作を:

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

期待される動作:

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

私はここで間違って何をしているのですか? Booleanフィールドのファセット値を実際の検索結果と同様にファセット内で正しくデシリアライズするにはどうすればよいですか?

答えて

1
+0

バグのテストはありませんか? – wim

+0

私は少し夢中になり、テストなしで些細な修正をします:)テストカバレッジはまだ十分だと思っていて、迅速な解決が望ましいと考えていました。 –

+0

未定義コードは壊れたコードです。 ['FacetedResponse.facets'](https://github.com/elastic/elasticsearch-dsl-py/blob/d291eb55ef01f6bfa02835dcfd90276d5cd8871e/elasticsearch_dsl/faceted_search.py​​#L164-L167)は、[' Facet.get_values'](https: //github.com/elastic/elasticsearch-dsl-py/blob/d291eb55ef01f6bfa02835dcfd90276d5cd8871e/elasticsearch_dsl/faceted_search.py​​#L68)[バケット['key'] 'unchanged]を返すだけです(https://github.com/ elastic/elasticsearch-dsl-py/blob/d291eb55ef01f6bfa02835dcfd90276d5cd8871e/elasticsearch_dsl/faceted_search.py​​#L58)。私はコミットによって修正された問題を確信していません。 – wim

関連する問題