我在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来检测搜索到的关键字属于哪个键/映射/字段?在这种情况下,第一个结果被添加,第二个结果被更改
非常感谢你 亚历克斯
答案 0 :(得分:0)
简单的答案似乎是:不,Elasticsearch没有开箱即用的方法,因为根据this thread
,Lucene没有它。Elasticsearch具有highlights的概念。这些可能很有用,但它们确实需要您对匹配项可能位于的字段有所了解。
The ES Python search documentation建议您无法将其作为参数进行搜索,但是您可以创建一个自定义查询并将其作为q
参数传递。看起来像这样:
q = {"query" : {"match": { "content": "'machine4'" }}, "highlight" : {"fields" : {"added" : {}, "updated": {}}}}
result = es.search(index='machines', q=q)
希望这会有所帮助!