ES 索引配置文件解析
AI-摘要
KunKunYu GPT
AI初始化中...
介绍自己
生成本文简介
推荐相关文章
前往主页
前往tianli博客
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0,
"analysis": {
"filter": {
"plm_synonyms": {
"type": "synonym_graph",
"synonyms": [
"齿轮箱,变速箱 => 齿轮箱",
"马达,电机,motor => 电机",
"轴承,bearing => 轴承",
"密封圈,oil seal => 密封圈"
]
},
"part_ngram": { "type": "edge_ngram", "min_gram": 2, "max_gram": 10 }
},
"tokenizer": {
"part_number_split": { "type": "pattern", "pattern": "[-_/ xX]+" }
},
"analyzer": {
"plm_chinese": { "tokenizer": "ik_max_word", "filter": ["lowercase"] },
"plm_chinese_smart": { "tokenizer": "ik_smart", "filter": ["lowercase", "plm_synonyms"] },
"plm_english": { "tokenizer": "standard", "filter": ["lowercase", "stop", "porter_stem", "asciifolding"] },
"plm_chinese_mix": { "tokenizer": "ik_max_word", "filter": ["lowercase", "asciifolding"] },
"part_number_search": {
"tokenizer": "part_number_split",
"filter": ["lowercase"]
},
"part_number_prefix": {
"tokenizer": "part_number_split", "filter": ["lowercase", "part_ngram"]
},
"prefix_search": {
"tokenizer": "standard", "filter": ["lowercase", "part_ngram"]
}
}
}
},
"mappings": {
"properties": {
"docId": { "type": "keyword" },
"docNumber": { "type": "keyword" },
"titleZh": { "type": "text", "analyzer": "plm_chinese", "fields": { "raw": { "type": "keyword" }, "prefix": { "type": "text", "analyzer": "prefix_search" } } },
"titleEn": { "type": "text", "analyzer": "plm_english", "fields": { "raw": { "type": "keyword" } } },
"description": { "type": "text", "analyzer": "plm_chinese_mix" },
"docType": { "type": "keyword" },
"category": { "type": "keyword" },
"subcategory": { "type": "keyword" },
"partNumber": { "type": "text", "analyzer": "part_number_search", "fields": { "raw": { "type": "keyword" }, "prefix": { "type": "text", "analyzer": "part_number_prefix" } } },
"projectCode": { "type": "keyword" },
"productModel": { "type": "keyword" },
"status": { "type": "keyword" },
"version": { "type": "keyword" },
"author": { "type": "text", "analyzer": "plm_chinese", "fields": { "raw": { "type": "keyword" } } },
"department": { "type": "keyword" },
"tags": { "type": "keyword" },
"keywords": { "type": "text", "analyzer": "plm_chinese" },
"format": { "type": "keyword" },
"fileSizeKb": { "type": "integer" },
"securityLevel": { "type": "keyword" },
"supplier": { "type": "text", "analyzer": "plm_chinese", "fields": { "raw": { "type": "keyword" } } },
"supplierCode": { "type": "keyword" },
"createdAt": { "type": "date", "format": "strict_date_optional_time||epoch_millis" },
"updatedAt": { "type": "date", "format": "strict_date_optional_time||epoch_millis" },
"releasedAt": { "type": "date", "format": "strict_date_optional_time||epoch_millis" },
"bomChildren": {
"type": "nested",
"properties": {
"partNumber": { "type": "keyword" },
"quantity": { "type": "integer" },
"material": { "type": "keyword" }
}
},
"metadata": { "type": "flattened" }
}
}
}
这个配置文件分为两大块:settings(设置) 和 mappings(映射)。下面我按结构逐层讲解。
一、顶层结构
{
"settings": { ... }, // 索引级别设置:分片、副本、分析器
"mappings": { ... } // 字段映射:每个字段的类型和分析方式
}二、settings 部分
2.1 基础设置
2.2 analysis(文本分析)—— 核心学习重点
analysis 是 ES 中文检索的关键,包含三种子配置:filter(过滤器)→ tokenizer(分词器)→ analyzer(分析器)。
处理流程:文本 → tokenizer 分词 → filter 过滤 → 最终 token
"齿轮箱马达" → [tokenizer分词] → ["齿轮箱","马达"] → [filter过滤] → ["齿轮箱","电机"]① filter(过滤器)
"plm_synonyms": { // 同义词过滤器
"type": "synonym_graph", // 图形同义词,支持多词双向匹配
"synonyms": [
"齿轮箱,变速箱 => 齿轮箱", // 单向:输入"齿轮箱"或"变速箱",都转成"齿轮箱"
"马达,电机,motor => 电机", // 同上
"轴承,bearing => 轴承",
"密封圈,oil seal => 密封圈"
]
},
"part_ngram": { // N-gram 过滤器,用于前缀搜索
"type": "edge_ngram", // 边缘 N-gram:从词头逐步切分
"min_gram": 2, // 最小 2 个字符
"max_gram": 10 // 最大 10 个字符
}
edge_ngram示例:"ABC"→["AB", "ABC"],这样用户输入"AB"就能匹配到。
② tokenizer(分词器)
"part_number_split": {
"type": "pattern", // 正则分词器
"pattern": "[-_/ xX]+" // 遇到 - _ / 空格 x X 就切分
}示例:
"ABC-123 X456"→["ABC", "123", "456"],专用于零件号搜索。
③ analyzer(分析器)= tokenizer + filter 组合
关键概念:
stop(去掉 the/a/an 等停用词)、porter_stem(running→run 词干化)、asciifolding(café→cafe 去重音)都是 ES 内置 filter,无需定义。
三、mappings 部分
3.1 字段类型速查
3.2 多字段(multi-field)—— 重点
"titleZh": {
"type": "text",
"analyzer": "plm_chinese", // 主字段:全文搜索
"fields": {
"raw": { "type": "keyword" }, // 子字段:精确匹配/排序/聚合
"prefix": { "type": "text", "analyzer": "prefix_search" } // 子字段:前缀搜索
}
}同一份数据用
titleZh(全文)、titleZh.raw(精确)、titleZh.prefix(前缀)三种方式检索。
3.3 特殊类型
"bomChildren": {
"type": "nested", // 嵌套类型:保持对象数组独立性
"properties": { ... }
},
"metadata": { "type": "flattened" } // 扁平类型:整个对象当 keyword 处理
nested:普通 object 类型会把数组中所有对象的字段打平,导致交叉匹配错误。nested保持每个对象独立可查询。
flattened:适合存储不确定结构的元数据,节省映射数量(ES 默认限制 1000 个字段)。
四、学习建议:如何自己写配置文件
第一步:确定字段和类型
需要精确匹配? → keyword
需要全文搜索? → text + analyzer
是数字? → integer/long/float
是日期? → date
是嵌套对象? → nested / object第二步:根据需求设计分析器
中文? → ik_max_word / ik_smart
需要同义词? → synonym_graph filter
需要前缀搜索?→ edge_ngram filter
混合语言? → 组合多个 filter第三步:模板套用
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0,
"analysis": {
"analyzer": { /* 你的分析器 */ },
"filter": { /* 你的过滤器 */ },
"tokenizer":{ /* 你的分词器 */ }
}
},
"mappings": {
"properties": { /* 你的字段 */ }
}
}
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 Ron567
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果