在ElasticSearch中使用单个查询进行多次搜索

时间:2020-10-19 10:17:44

标签: elasticsearch elasticsearch-dsl elasticsearch-dsl-py

我有一个数据集,其中包含可通过三个字段(例如“名称”,“时间戳记”和“国家/地区”)识别的文档。现在,我使用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个查询。
我正在寻找的是一个查询,该查询将获取三个字段标识符的列表,并返回与之匹配的所有文档,无论顺序如何。
我曾尝试使用OR + AND,但不幸的是,性能仍然很差,尽管至少我没有进行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秒。

0 个答案:

没有答案
相关问题