如何在庞大的数据集中进行繁重的查询?

How to improvise on heavy should queries in huge data set?

我的任务涉及使用弹性搜索 (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 秒。这是预期的事情吗?或者我获取值的实现有问题?

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

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

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

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