首页 > 解决方案 > 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

解决方案


简单的答案似乎是不,Elasticsearch 没有开箱即用的方法,因为 Lucene 没有它,根据这个线程

然而,Elasticsearch 有highlight的概念。这些可能很有用,但它们确实需要您了解匹配可能在哪些字段中。

ES Python 搜索文档建议没有办法将其作为搜索参数,但您可以创建自定义查询并将其作为q参数传递。它看起来像:

q = {"query" : {"match": { "content": "'machine4'" }}, "highlight" : {"fields" : {"added" : {}, "updated": {}}}}
result = es.search(index='machines', q=q)

希望这有帮助!


推荐阅读