首页 > 解决方案 > 在 ElasticSearch 中使用单个查询进行多个搜索

问题描述

我有一个数据集,其中包含可通过三个字段识别的文档,比如说“名称”、“时间戳”和“国家”。现在,我使用 elasticsearch-dsl-py,但我可以阅读本机 elasticsearch 查询,因此我也可以接受这些作为答案。
这是我通过三个字段获取单个文档的代码:

def get(name, timestamp, country):
    search = Item.search()
    search = search.filter("term", name=name)
    search = search.filter("term", timestamp=timestamp)
    search = search.filter("term", country=country)
    search = search[:1]
    return search.execute()[0]

这一切都很好,但有时我需要获取 200 多个项目,调用此函数意味着对 ES 进行 200 次查询。
我正在寻找的是一个单一的查询,它将获取三个字段标识符的列表并返回所有匹配它的文档,无论顺序如何。
我试过使用 ORs + ANDs 但不幸的是性能仍然很差,尽管至少我没有对服务器进行 200 次往返。

def get_batch(list_of_identifiers):
    search = Item.search()
    batch_query = None
    for ref in list_of_identifiers:
        sub_query = Q("match", name=ref["name"])
        sub_query &= Q("match", timestamp=ref["timestamp"])
        sub_query &= Q("match", country=ref["country"])
        if not batch_query:
            batch_query = sub_query
        else:
            batch_query |= sub_query
    search = search.filter(batch_query)
    return search.scan()

有没有更快/更好的方法来解决这个问题?
与在单个查询中使用应该/必须 (OR/AND) 相比,使用多重搜索是否会是更快的选择?

编辑:我尝试了多重搜索,时间几乎没有区别。我们在这里谈论秒。对于 6 个项目,获得结果需要 60 毫秒,对于 200 个项目,我们谈论的是 4-5 秒。

标签: elasticsearchelasticsearch-dslelasticsearch-dsl-py

解决方案


推荐阅读