python - 如何在 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”
我的错是什么?
如果我用“匹配”更改“术语”,它会返回一些东西(不是零结果),但我想使用“术语”,因为我只想过滤精确值
蟒蛇弹性搜索
解决方案
您将text
字段与default analyzer
.
因此ID
将存储id
在索引中。您可以通过http://host:port/indexName/_analyze
API 确认。
Term
查询不是full text search
查询意味着它们没有被分析。而match
查询是全文查询。
因此,当您搜索时ID
,它期望ID
在索引中。因此,当您使用术语时,它不会返回任何内容。
所以你需要设置mapping
使用term
查询。设置keyword
为country_id
。然后它不会被分析,并且会在你写的时候被存储。然后同样可以搜索。
或者
您可以default keyword
在查询时使用字段版本 -country_id.keyword
用于术语查询和country_id
匹配查询。
推荐阅读
- php - PHP 表格 + pdfMake + AngularJS
- javascript - javascript如何将090(数字)转换为'090'(字符串)?
- php - 我正在尝试直接指向 a 内的链接,但我不知道出了什么问题
- java - Weather App,如何从MapActivity获取经纬度
- c# - 我的 poer up 的冷却时间不会恢复我的玩家大小
- c++ - 具有通用大小 C++ 的通用数组
- php - PHP json_decode 中的有效 JSON 结果引发语法错误
- javascript - 为什么按索引插入节点的方法不起作用?
- xamarin - 不是程序集的有效资源名称
- java - @QuerydslPredicate 抛出异常