elasticsearch - 如何在庞大的数据集中对繁重的查询进行即兴创作?
问题描述
我的任务涉及使用弹性搜索(5.6)来运行格式的查询
- 字 1 与字 2 与字 3
QueryBuilder builders = QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("text", "word1"))
.must(QueryBuilders.matchQuery("text", "word2"))
.must(QueryBuilders.matchQuery("text", "word3"));
- 字 1 或字 2 或 字 3
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 集群将为这两种情况返回的文档数量。
这两种情况所用时间的巨大差异是因为要返回的文档数量。对于扫描,您必须执行分页(通过滚动)并循环重复。如果文档数量增加,这将需要时间。
如果您只是执行具有一定大小限制的查询而不是扫描,那么这两种情况很可能在几乎相同的时间内完成。
推荐阅读
- python - Python import Julia 导致脚本的其他部分冻结
- progressive-web-apps - PWA,如何在 iOS 上捏和放大网站内容?
- tibco - 如何在 TIBCO 的发送 HTTP 请求活动中传递“x-www-form-urlencoded”POSTMAN 参数?
- linux - 有什么方法可以将 snap 与 crouton 集成在一起吗?
- python - 使用唯一键和条件合并两个熊猫数据框
- java - 如何编写jsp代码以接受来自固定商店的订单并显示并包含用户可以选择和订购的物品列表
- php - 减少 if elseif 块 Laravel 过滤器
- wordpress - 如何在 html 页面中显示 [woocommerce_my_account] 短代码
- python-3.x - 为什么我在 python 中运行此代码时出现输入错误?
- angular - Angular 6 服务工作者正在缓存字体真棒图标,无法在离线模式下检索它们