如何在庞大的数据集中进行繁重的查询?
How to improvise on heavy should queries in huge data set?
我的任务涉及使用弹性搜索 (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 秒。这是预期的事情吗?或者我获取值的实现有问题?
鉴于您正在检索文档的 ID,我可以假设您没有执行查询,而是扫描并检索满足您查询的所有文档。
现在,第一个查询是一个交集,而第二个查询是一个并集。
鉴于这些词出现在 5874、270419 和 397829 文档中,交集的最大长度为 5874,而并集的长度为 397829。这些是您的 ES 集群将为这两种情况返回的文档数量。
两种情况所用时间的巨大差异是因为要返回的文档数量。对于扫描,您必须执行分页(通过滚动)并循环重复。如果文档数量增加,这将需要时间。
如果您只是执行具有一定大小限制的查询而不是扫描,那么这两种情况很可能几乎同时完成。
我的任务涉及使用弹性搜索 (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 秒。这是预期的事情吗?或者我获取值的实现有问题?
鉴于您正在检索文档的 ID,我可以假设您没有执行查询,而是扫描并检索满足您查询的所有文档。
现在,第一个查询是一个交集,而第二个查询是一个并集。 鉴于这些词出现在 5874、270419 和 397829 文档中,交集的最大长度为 5874,而并集的长度为 397829。这些是您的 ES 集群将为这两种情况返回的文档数量。
两种情况所用时间的巨大差异是因为要返回的文档数量。对于扫描,您必须执行分页(通过滚动)并循环重复。如果文档数量增加,这将需要时间。
如果您只是执行具有一定大小限制的查询而不是扫描,那么这两种情况很可能几乎同时完成。