如何在庞大的数据集中查询繁琐的查询?

时间:2019-06-05 17:09:25

标签: elasticsearch runtime query-builder

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

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


  • word1或word2或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秒。有什么期望吗?也许我获取值的实现存在问题?

1 个答案:

答案 0 :(得分:1)

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

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

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

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