如何在ElasticSearch中启用n-gram分词以支持ngram文本搜索
Elasticsearch N-Gram 分词配置指南
一、核心逻辑
要实现N-Gram分词,需先创建自定义分词器(包含N-Gram过滤器),再在索引字段映射中指定使用该分词器,替代默认的standard分词。
二、具体配置步骤
1. 创建带N-Gram分词器的索引
先定义索引的settings和mappings,示例如下:
PUT /my_ngram_index { "settings": { "analysis": { "analyzer": { "my_ngram_analyzer": { "tokenizer": "standard", "filter": ["lowercase", "my_ngram_filter"] } }, "filter": { "my_ngram_filter": { "type": "ngram", "min_gram": 2, // 最小分词长度,可按需调整 "max_gram": 5 // 最大分词长度,可按需调整 } } } }, "mappings": { "properties": { "target_field": { // 替换成你需要分词的字段名 "type": "text", "analyzer": "my_ngram_analyzer", // 索引阶段使用自定义分词器 "search_analyzer": "standard" // 搜索阶段可选standard,也可复用自定义分词器 } } } }
- 关键参数说明:
min_gram/max_gram:控制分词片段的长度范围,比如设置2-5,会把"elasticsearch"拆成"el""ela""elas"等2到5字符的片段search_analyzer:若设为standard,搜索词按标准分词后匹配索引中的N-Gram片段;若和索引分词器一致,搜索词也会被拆成N-Gram,适合全模糊匹配场景
2. 验证分词效果
用_analyze接口测试分词器是否生效:
POST /my_ngram_index/_analyze { "analyzer": "my_ngram_analyzer", "text": "elasticsearch" }
返回结果会显示拆分后的所有N-Gram片段,确认是否符合预期。
3. 通过Bulk API推送数据
索引创建完成后,正常使用Bulk API推送数据即可,目标字段会自动用配置的N-Gram分词器处理:
POST _bulk {"index": {"_index": "my_ngram_index", "_id": "1"}} {"target_field": "Elasticsearch is a distributed search engine"} {"index": {"_index": "my_ngram_index", "_id": "2"}} {"target_field": "N-gram分词适合前缀、中缀模糊搜索"}
4. 搜索测试
比如搜索"elastic",即使输入的是部分字符,也能匹配到包含"Elasticsearch"的文档:
POST /my_ngram_index/_search { "query": { "match": { "target_field": "elastic" } } }
三、注意事项
- 调整
min_gram和max_gram时要平衡性能与效果:过小会导致索引体积暴增,过大则失去模糊匹配的意义 - 已存在的索引无法直接修改字段分词器,需重建索引并迁移数据
- 若需要对搜索词也做N-Gram拆分,将
search_analyzer设为my_ngram_analyzer即可
内容的提问来源于stack exchange,提问作者mayur07
相关产品推荐
相关产品推荐

