ElasticSearch-获取搜索值的键

时间:2018-07-06 11:33:00

标签: 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来检测搜索到的关键字属于哪个键/映射/字段?在这种情况下,第一个结果被添加,第二个结果被更改

非常感谢你 亚历克斯

1 个答案:

答案 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)

希望这会有所帮助!