Elasticsearch Shingle Token Filter替代方案 千万级文档自动补全优化咨询
现有Shingle方案优化建议
- 替换fielddata存储结构:fielddata是查询时动态加载到ES堆内存的列式结构,2000万级文档生成的shingle词条量可达数亿,全量加载耗时是超时的核心原因。可将
workDesc.suggestions字段调整为如下配置,使用索引时预写入磁盘的doc_values替代fielddata,聚合性能可提升10倍以上:
"suggestions" : { "type": "text", "analyzer": "ana_autocomplete", "fielddata": false, "index_options": "freqs" }
如果只需要精确匹配shingle词条,也可以直接将字段类型改为keyword,默认开启doc_values,聚合效率更高。
- 缩小聚合扫描范围:当前查询直接对全量词条做正则过滤,耗时极高。可以在聚合前新增前缀查询过滤符合条件的文档,大幅降低聚合计算量,优化后的查询示例如下:
GET tenderinfo_version_9/_search { "query": { "prefix": { "workDesc.suggestions": "civil" } }, "aggs": { "workDesc_111": { "terms": { "field":"workDesc.suggestions", "order":[{"_count":"desc"}], "size":10 } } }, "size":0, "_source":false }
- 基础设施优化:16GB内存的服务器建议给ES分配7-8GB堆内存(不超过物理内存的50%),剩余内存留给系统页缓存缓存索引文件;2000万文档的索引拆分为3-4个分片,利用多核CPU并发执行聚合任务,单分片大小控制在5GB以内符合ES最佳实践。
等效替代技术方案
- ES官方Completion Suggestor:这是ES专门为自动补全场景设计的功能,索引时会将补全词条构建为内存级FST(有限状态转换器),查询延迟为微秒级,完全适配2000万级数据量。仅需将
workDesc.suggestions字段类型设置为completion,保留原有ana_autocomplete分析器,调用官方_search端点的suggest功能即可,性能比terms聚合高100倍以上。 - 离线预聚合方案:如果自动补全词条不需要实时更新,可提前离线统计所有shingle词条的出现频次,单独存入一个仅包含
词条、频次两个字段的小索引,总词条量级最多为百万级,直接查询该小索引即可永远保持毫秒级响应。 - Edge Ngram前缀分词方案:如果业务仅需要前缀匹配补全,可将分析器替换为edge_ngram分词器,最小分词长度1、最大长度设置为补全允许的最大输入长度,查询时直接用term匹配不需要聚合,性能也远高于当前terms聚合方案。
内容的提问来源于stack exchange,提问作者ankur patel
相关产品推荐
相关产品推荐

