【问题标题】:Query DSL in ElasticSearch - term query在 ElasticSearch 中查询 DSL - 术语查询
【发布时间】:2016-07-04 09:42:12
【问题描述】:

我是弹性搜索中查询 DSL 的新手。我正在尝试用 python 来查询弹性搜索中的索引。 以下是我尝试过滤以使用查询的文档。

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

但是,如果在查询中,我将“term”替换为“match”,它会给我想要的结果。让我知道我在哪里犯了错误。

【问题讨论】:

    标签: python elasticsearch querydsl


    【解决方案1】:

    除非您将字段“name”的映射指定为 {“index”:“not_analyzed”},否则它将默认为“analyzed”,这意味着字符串值在索引时将被“分解”方便全文搜索。

    “term”查询将查找文本的完全匹配,但如果“Verizon”被索引为 ["Ver", "izon"],则情况并非如此。我对如何分解文本的细节不是很熟悉,但是根据您的示例,这似乎是问题所在。

    一个好的起点是对“not_analyzed”字段使用“term”,对“analyzed”字段使用“match”。

    【讨论】:

    • 谢谢!这很有帮助!
    猜你喜欢
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    相关资源
    最近更新 更多