如何在Elasticsearch中使用多分析器创建并合并索引
结论
该需求完全可以实现,以下是两种可行的实现方案,推荐优先使用第一种多字段映射方案。
方案1:多字段映射(生产环境推荐)
实现原理
给需要处理的文本字段配置两个独立的子字段,分别应用shingle分析器和autocomplete edge_ngram分析器,两者都是基于原始文本独立分词,查询时同时匹配两个子字段即可达到和合并索引完全一致的召回效果,配置灵活、调试成本低。
配置示例
{ "settings": { "analysis": { "filter": { "autocomplete_filter": { "type": "edge_ngram", "min_gram": 3, "max_gram": 20 }, "shingle_filter": { "type": "shingle", "min_shingle_size": 1, "max_shingle_size": 2, "output_unigrams": true } }, "analyzer": { // 生成shingle分词结果的分析器 "shingle_analyzer": { "type": "custom", "tokenizer": "standard", "filter": ["lowercase", "shingle_filter"] }, // 生成自动完成前缀的分析器,如果你需要整个短语的前缀,可将tokenizer换成keyword "autocomplete_analyzer": { "type": "custom", "tokenizer": "standard", "filter": ["lowercase", "autocomplete_filter"] } } } }, "mappings": { "properties": { "content": { // 替换为你实际的字段名 "type": "text", "fields": { "shingle": { "type": "text", "analyzer": "shingle_analyzer" }, "completion": { "type": "text", "analyzer": "autocomplete_analyzer" } } } } } }
查询示例
{ "query": { "multi_match": { "query": "搜索关键词", "fields": ["content.shingle", "content.completion"] } } }
你还可以给字段加权重,比如content.shingle^2让shingle匹配的结果优先级更高,更符合搜索排序预期。
方案2:单字段合并分词结果
如果你不需要单独调整两类分词的权重,希望查询时只查单个字段,可以用keyword_repeat过滤器复制原始token流,分别经过两类分词处理后去重合并,存入同一个字段的倒排索引中。
配置示例
{ "settings": { "analysis": { "filter": { "autocomplete_filter": { "type": "edge_ngram", "min_gram": 3, "max_gram": 20 }, "shingle_filter": { "type": "shingle", "min_shingle_size": 1, "max_shingle_size": 2, "output_unigrams": true }, "remove_dup": { "type": "remove_duplicates" } }, "analyzer": { "combined_analyzer": { "tokenizer": "standard", // 需要短语前缀的话换成keyword即可 "filter": [ "lowercase", "keyword_repeat", // 复制一份原始token流 "shingle_filter", // 第一份流生成shingle结果 "autocomplete_filter", // 第二份流生成前缀结果 "remove_dup" // 移除重复的token,减少存储占用 ] } } } }, "mappings": { "properties": { "content": { "type": "text", "analyzer": "combined_analyzer" } } } }
方案对比
- 多字段方案:灵活度更高,支持单独调整两类分词的查询权重,调试修改规则不需要重建全量索引,存储占用更低,优先选择。
- 单字段合并方案:不需要修改查询逻辑,直接查询单个字段即可,但生成的token数量更多,存储占用更高,规则调试成本更高。
内容的提问来源于stack exchange,提问作者quintin
相关产品推荐
相关产品推荐

