首页 > 解决方案 > 如何在 ElasticSearch 中正确使用“术语”过滤器?

问题描述

我在我的代码中使用弹性搜索(Python 3.6):

result_search = es.search(index="area", body={
                "query": { 
                    "bool": { 
                    
                    "filter": [ 
                        { "term":  { "country_id": "ID" }}
                    ]
                    }
                }
                })

但它返回

{'took': 0,
 'timed_out': False,
 '_shards': {'total': 1, 'successful': 1, 'skipped': 0, 'failed': 0},
 'hits': {'total': {'value': 0, 'relation': 'eq'},
  'max_score': None,
  'hits': []}}

在数据中,country_id 字段中有“ID”

我的错是什么?

如果我用“匹配”更改“术语”,它会返回一些东西(不是零结果),但我想使用“术语”,因为我只想过滤精确值

蟒蛇弹性搜索

标签: pythonelasticsearch

解决方案


您将text字段与default analyzer.

因此ID将存储id在索引中。您可以通过http://host:port/indexName/_analyzeAPI 确认。

Term查询不是full text search查询意味着它们没有被分析。而match查询是全文查询。

因此,当您搜索时ID,它期望ID在索引中。因此,当您使用术语时,它不会返回任何内容。

所以你需要设置mapping使用term查询。设置keywordcountry_id。然后它不会被分析,并且会在你写的时候被存储。然后同样可以搜索。

或者

您可以default keyword在查询时使用字段版本 -country_id.keyword用于术语查询和country_id匹配查询。


推荐阅读