elasticsearch - ElasticSearch - 获取搜索值的键
问题描述
我在我的 ES 中搜索关键字machine4 。我的python客户端很简单:
result = es.search('machine4', index='machines')
结果看起来像这样
[
{
"_score": 0.13424811,
"_type": "person",
"_id": "2",
"_source": {
"date": "**20180601**",
"deleted": [],
"changed": [
"machine1",
"machine2",
"machine3"
],
"**added**": [
"**machine4**",
"machine5"
]
},
"_index": "contacts"
},
{
"_score": 0.13424811,
"_type": "person",
"_id": "3",
"_source": {
"date": "**20180701**",
"deleted": [
"machine2"
],
"**changed**": [
"machine1",
"**machine4**",
"machine3"
],
"added": [
"machine7"
]
},
"_index": "contacts"
}
]
所以我们可以很容易地看到:在日期 20180601 中, machine4 属于添加的。在日期 20180701 , machine4 属于已更改。
我可以编写另一个函数来分析结果。基本上循环遍历每个项目的每个键,值并检查搜索的关键字是否属于,如下所示:
for result in search_results['hits']['hits']:
source_result = result['_source']
for key,value in source_result.items():
if 'machine4' in value:
print key
但是,我想知道 ES 是否有 API 来检测搜索的关键字属于哪个键/映射/字段?在这种情况下,添加第一个结果,并在第二个结果中更改
非常感谢亚历克斯
解决方案
简单的答案似乎是不,Elasticsearch 没有开箱即用的方法,因为 Lucene 没有它,根据这个线程
然而,Elasticsearch 有highlight的概念。这些可能很有用,但它们确实需要您了解匹配可能在哪些字段中。
ES Python 搜索文档建议没有办法将其作为搜索参数,但您可以创建自定义查询并将其作为q
参数传递。它看起来像:
q = {"query" : {"match": { "content": "'machine4'" }}, "highlight" : {"fields" : {"added" : {}, "updated": {}}}}
result = es.search(index='machines', q=q)
希望这有帮助!
推荐阅读
- python-3.x - Python .txt 文件无法正确读取
- django - 从 ManyToManyField 填充 MultipleChoiceField 值
- python - 如何在同一行打印这些字符?
- python - 将单词传递给函数
- c# - `Clicked` 和 `Command` 在同一个 Xamarin 视图上使用时如何工作?
- laravel - 如何将 PHPMailer 连接转换为 Laravel .env?
- excel - PowerShell - Import Excel then Export CSV without using Excel or COM
- machine-learning - 通过了解一些未来事件来增强预测
- javascript - 从 JSON 响应中删除属性
- mysql - 在这种情况下如何对 COUNT() 求和