elasticsearch - 弹性搜索如何处理并行索引刷新请求?
问题描述
在我们的项目中,我们在每次创建/更新/删除操作后点击弹性搜索的索引刷新 api,以便立即进行搜索。
我想知道,如果在具有接近 250 万个文档的单个索引上对其刷新 api 发出多个并行请求,弹性搜索将如何执行?
有什么想法吗?建议?
解决方案
刷新是 ElasticSearch 要求 Lucene 分片在磁盘上提交修改并创建一个段的操作。如果您在每次操作后要求刷新,您将创建大量的微细分。
太多的分段会使您的搜索时间更长,因为您的分片需要按顺序搜索所有分段才能返回搜索结果。此外,它们消耗硬件资源。
每个段都消耗文件句柄、内存和 CPU 周期。更重要的是,每个搜索请求都要依次检查每个段;段越多,搜索就越慢。 来自权威指南
Lucene 会自动将这些段合并成更大的段,但这也是一项消耗 I/O 的任务。
您可以检查此以获取更多详细信息
但据我所知,刷新 25 亿个文档索引将需要与 2.5k 个文档索引相同的时间。此外,似乎(从这个问题)刷新是一个非阻塞操作。
但它对于弹性搜索集群来说是一个糟糕的模式。 您的应用程序的每个 CUD 操作是否都需要刷新?
推荐阅读
- c++ - Why does vc++ compiler cause this statistical pattern?
- javascript - 同位素向 div 添加随机样式
- java - 将控制权传递给超类时的方法绑定
- angular - 我们可以在 Angular 2 中创建多个具有相同名称的组件吗?
- javascript - Webpack 从 .jsx 文件中删除 css?
- c++ - 在 boost 中从 graphviz 读取的问题
- r - 从 rpart 决策树中提取变量标签
- python - Python XML 不是包错误
- java - 如何更改 JColorChooser 的 Swatches 组件的颜色?
- tfs - 为什么要过滤 TFS 事件通知?