我的任务涉及使用弹性搜索(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秒。有什么期望吗?也许我获取值的实现存在问题?
答案 0 :(得分:1)
鉴于您正在检索文档的ID,因此我可以假设您不是在执行查询,而是在扫描并检索所有满足查询条件的文档。
现在,第一个查询是一个交集,而第二个查询是一个并集。 鉴于这些单词出现在5874、270419和397829文档中,相交处的最大长度为5874,而联合的长度为397829。这是这两种情况下ES集群将返回的文档数。 / p>
两种情况之间花费时间的巨大差异是由于要退回的文档数量所致。对于扫描,您必须执行分页(通过滚动)并循环重复。如果文档数量增加,那将需要时间。
如果仅执行具有一定大小限制的查询而不是扫描,那么两种情况下的查询完成时间可能几乎都相同。