2016-07-04 13 views
0

私は弾性検索のクエリDSLには初めてです。私は、Elastic Searchでインデックスを照会するためにpythonを試しています。 以下は、クエリを使用してフィルタリングしようとしているドキュメントです。ElasticSearchでのDSLクエリ - 用語クエリ

{u'_id': u'5', 
    u'_index': u'data', 
    u'_score': 1.0, 
    u'_source': {u'attributes': {u'Accepts Credit Cards': False, 
     u'Parking': {u'garage': False, 
     u'lot': False, 
     u'street': False, 
     u'valet': False, 
     u'validated': False}, 
     u'Price Range': 2}, 
    u'business_id': u'HZdLhv6COCleJMo7nPl-RA', 
    u'categories': [u'Shopping', 
     u'Home Services', 
     u'Internet Service Providers', 
     u'Mobile Phones', 
     u'Professional Services', 
     u'Electronics'], 
    u'city': u'Pittsburgh', 
    u'full_address': u'301 South Hills Village\nPittsburgh, PA 15241', 
    u'hours': {u'Friday': {u'close': u'17:00', u'open': u'10:00'}, 
     u'Monday': {u'close': u'21:00', u'open': u'10:00'}, 
     u'Saturday': {u'close': u'21:00', u'open': u'10:00'}, 
     u'Sunday': {u'close': u'18:00', u'open': u'11:00'}, 
     u'Thursday': {u'close': u'17:00', u'open': u'10:00'}, 
     u'Tuesday': {u'close': u'21:00', u'open': u'10:00'}, 
     u'Wednesday': {u'close': u'21:00', u'open': u'10:00'}}, 
    u'latitude': 40.35762, 
    u'longitude': -80.05998, 
    u'name': u'Verizon', 
    u'neighborhoods': [], 
    u'open': True, 
    u'review_count': 5, 
    u'stars': 2.5, 
    u'state': u'PA', 
    u'type': u'business'}, 
    u'_type': u'business'} 

この文書を取得するために、私はPythonで以下のフィルタクエリを使用しています:

es.search(index = 'data', doc_type = 'business', body = { 
'query' : { 
    'filtered' : { 
       'filter' : { 
          'bool' : { 
            'must' : {'term' : {'name' : 'Verizon'}} 
            } 
          } 
       } 
      } 
}) 

をしかし、私はこのクエリとは、ヒットを取得していないのです。クエリで、私は「一致」と「用語」を交換する場合

{u'_shards': {u'failed': 0, u'successful': 5, u'total': 5}, 
u'hits': {u'hits': [], u'max_score': None, u'total': 0}, 
u'timed_out': False, 
u'took': 1} 

しかし、それは私に望ましい結果を与える:ここで私が取得していた結果です。私が間違っている箇所を教えてください。

答えて

0

"name"フィールドのマッピングを{"index": "not_analyzed"}に指定しない限り、デフォルトで "分析"されます。つまり、文字列の値が '全文検索を容易にするために索引付けされています。

"用語"クエリはテキストの完全一致を検索しますが、 "Verizon"が["Ver"、 "izon"]としてインデックス付けされている場合、これは当てはまりません。私は、テキストがどのように分解されているかの詳細をよく知っているわけではありませんが、あなたの例に基づいて、これは問題のようです。

"not_analyzed"フィールドに "term"を使用し、 "分析済み"フィールドに "match"を使用するのがよいでしょう。

+0

ありがとうございました!これは大いに役立ちます! –

関連する問題