performance - 在 Elasticsearch 中通过 _id 查询路由获取以提高性能?
问题描述
我有一个包含数亿个文档的 Elasticsearch 索引,主要用于“通过 id 获取”查询。
我考虑在索引时添加到文档的路由。路线将是一个从 0 到 9 的随机数。
稍后,此路由将位于带有文档 ID 的 URL 中,它将用于获取文档。目前我在URL中只有文档 ID,但也计划添加路由。新 URL 将如下所示https://tarta.ai/ j/ [route] /[doc id]。
我想知道它会减少在索引中查找文档所需的时间吗?我的建议是,在这种情况下,Elasticsearch 不会在所有分片中查找文档,而是仅在具有此特定路径的分片中查找。
一些弹性搜索规范:
- 索引大小为 110GB。
- 文档数量为 3600 万,但我们每天都在增加数十万。
- 5个碎片。
- 16GB RAM 和 2 核 vm 和 1t SSD。
解决方案
路由在搜索(即POST index/_search
)时特别有用,因为 ES 不会搜索索引的所有分片,而是只搜索路由值解析到的单个分片。
如果您routing
在索引文档时指定一个值,则在获取该文档时必须指定相同的路由值,没有其他选择。
# index with routing
PUT index/_doc/1?routing=123
# returns the document
GET index/_doc/1?routing=123
# returns nothing
GET index/_doc/1
如果在索引文档时没有指定任何路由值,ES 将使用 ID 作为路由值并将文档存储在该路由值解析到的分片上。所以当获取这样一个没有任何路由值的文档时,ES 会知道使用 ID 作为路由值,这就是为什么你不必指定它(尽管你可以)。
# index without routing
PUT index/_doc/1
# returns the document
GET index/_doc/1
# returns the document as well
GET index/_doc/1?routing=1
这意味着对于 GET 操作,路由或不路由没有区别,主要是搜索,路由具有附加值。
使用路由时,您需要确保的另一件事是您的 ID 应该是“均衡的”,以便它们的哈希可以解析为具有相似概率的任何分片。如果不是这种情况,您将面临在索引中创建热点的风险,即某些分片可能比其他分片大。
推荐阅读
- reactjs - 在github中发布应用程序后获取空白页面
- excel - 我如何比较两个数据范围,然后复制和粘贴不匹配的范围
- vb.net - 你如何关闭form1,打开form2并在返回form1并关闭form2后不久?我在参考时遇到问题
- python - 在 JupyterHub 中阻止 pip 安装
- javafx - Javafx 焦点侦听器无法与鼠标按下事件正常工作
- javascript - 如何在 Node.JS 的一个函数中使用来自 MySQL 的响应?
- c# - .NET 进行检查算术的最快方法
- java - 通过子类的实例调用时,如何在超类方法中使用子类的静态字段?
- java - 基于角色的登录后,Spring Boot 应用程序显示“白级错误”
- google-api - Google MyBusiness API 是否有新的范围来取代 plus.business.manage