巨型 Elasticsearch 查询

闪光山羊

我有一个 must 和 must_not 项目的列表,我目前在一个巨大的查询中拥有这些项目,但我想知道这是否是解决问题的最佳方法。

查询示例:

{"query":{ "bool" : { "must" : {"match" : {"tag":"apple"}}, "must_not": [{ 
 "match": { "city": "new york" }},{ "match": { "name": "pizza" }},...........
]}}}

我有 470 个必须项目和 485 个 must_not 项目,它们是数据的白名单/黑名单类型的规则。分析内置于 spark 中,数据存放在弹性搜索中。我传递给 spark 的查询是一个查询,其中一个 must 后跟所有 485 个 must_not 项目。您可以猜到查询本身相当大,大约需要 2 秒才能返回结果。我正在为每个必须项目提交这种类型的查询,因此通过了 470 个查询。此应用程序目前需要大约 22 分钟才能完成。

我的问题 - 这是解决这个问题的最佳方法吗,考虑到巨大的查询,这对 elasticsearch 来说甚至是一个好问题吗?我之前曾尝试在仅通过 must_not 数据的查询后对数据执行火花连接,这比 470 个弹性搜索单个查询花费的时间要长得多。我使用了广播散列连接,因为必须的数据比结果数据帧小。

感谢您的帮助。

恩卡斯图里

每次调用查询都涉及以下开销:

  • 查询准备和提交
  • Spark - 弹性搜索握手。
  • 在弹性上执行查询。(涉及索引扫描等...)
  • 序列化和反序列化
  • 网络传输。

下面提出的解决方案将通过避免一些开销(如下所列)来提高性能。

  • 查询准备和提交
  • Spark - 弹性搜索握手。
  • 在弹性上执行查询。(涉及索引扫描等...)

如果您不需要分离单个查询执行结果的文档(470 个必须),理想的方法是使用 @khachik 建议的 OR 运算符构建一个布尔术语。

如果您需要分离,两种可能的解决方案

解决方案1:

构建弹性查询以返回在匹配条件中具有 must_not 的脚本字段(和您选择的字段)。在您的情况下,它们将是 470 个脚本字段,每个 term 一个,其中每个字段都是布尔类型。如果存在“必须”术语,则值为 TRUE,否则为 FALSE。将结果缓存为 rdd 后,您可以使用您选择的过滤器运行多个查询。由于数据缓存在内存中,查询应该更快。

解决方案:2

首先在弹性端执行查询,只有 must_not。开发一个函数,在给定 [TOKEN,TAG_VALUE] 的情况下返回“TRUE”。现在使用该函数将 470 个布尔列附加到 RDD。缓存 RDD。现在,您可以通过使用简单过滤器运行查询来分离数据。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章