2016-07-04 2 views
0

신축성있는 검색에서 DSL을 처음 사용했습니다. 나는 탄성 검색에서 색인을 쿼리하는 파이썬을 시도하고있다. 다음은 쿼리를 사용하여 필터링하려고하는 문서입니다. 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'} 

나는 파이썬에서 아래 필터 쿼리를 사용하고,이 문서를 효율적으로 활용하려면 다음

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"필드에 "용어"를 사용하고 "분석 된"필드에 "일치"를 사용하는 것입니다.

+0

고마워요! 이것은 많은 도움이 !! –