首页 > 解决方案 > 如何在庞大的数据集中对繁重的查询进行即兴创作?

问题描述

我的任务涉及使用弹性搜索(5.6)来运行格式的查询

    QueryBuilder builders = QueryBuilders.boolQuery()
                          .must(QueryBuilders.matchQuery("text", "word1"))
                          .must(QueryBuilders.matchQuery("text", "word2"))
                          .must(QueryBuilders.matchQuery("text", "word3"));


    QueryBuilder builders = QueryBuilders.boolQuery()
                  .should(QueryBuilders.matchQuery("text", "word1"))
                  .should(QueryBuilders.matchQuery("text", "word2"))
                  .should(QueryBuilders.matchQuery("text", "word3"));

Word 1 包含在 5874 个文档中,word2 包含在 270419 个文档中,word3 包含在 397829 个文档中。

我已经实现了获取文档 ID 的代码。

第一次查询所用的总时间为 2 秒,而第二次查询的时间急剧增加到 300 秒。这是预期的事情吗?或者我获取值的实现可能有问题?

标签: elasticsearchruntimequery-builder

解决方案


鉴于您正在检索文档的 ID,我可以假设您没有执行查询,而是扫描并检索满足您查询的所有文档。

现在,第一个查询是一个交集,而第二个查询是一个并集。鉴于这些词出现在 5874、270419 和 397829 文档中,交集的最大长度为 5874,而联合的长度为 397829。这些是您的 ES 集群将为这两种情况返回的文档数量。

这两种情况所用时间的巨大差异是因为要返回的文档数量。对于扫描,您必须执行分页(通过滚动)并循环重复。如果文档数量增加,这将需要时间。

如果您只是执行具有一定大小限制的查询而不是扫描,那么这两种情况很可能在几乎相同的时间内完成。


推荐阅读