elasticsearch - 在 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 秒。
解决方案
推荐阅读
- module - 使用来自另一个项目的组件和模块 angular5
- powershell - Invoke-WebRequest Links 属性值以 about:// 开头
- windows-installer - WPF 应用程序在我启动时崩溃
- excel - 有没有其他方法可以解析带有不规则表格的 Excel 文件?
- javascript - 如何通过 jQuery 的 $.ajax() 函数在 php 中传递数据值?
- c++ - 从二进制文件加载列表后,我的代码似乎进入了无限循环
- azure - 如何从 Azure 策略调用 REST 函数
- android - 如何从 JSON 文件添加图像 URL
- .net - 指定的deps.json [path\App.Web.Site\App.Web.deps.json] 不存在
- arguments - 在 shell 脚本中激活 conda 环境时如何传递命令行参数