{
  "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 基础设置

配置项

作用

number_of_shards

1

索引分片数。学习/单机环境用 1 即可;生产环境根据数据量设置(如 3~10)

number_of_replicas

0

副本数。单节点设 0,否则 ES 会因无法分配副本而报 yellow 状态

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 组合

分析器名

分词器

过滤器

用途

plm_chinese

ik_max_word

lowercase

中文细粒度分词(索引时用)

plm_chinese_smart

ik_smart

lowercase + plm_synonyms

中文智能分词 + 同义词扩展

plm_english

standard

lowercase + stop + porter_stem + asciifolding

英文:小写化、去停用词、词干提取、ASCII转换

plm_chinese_mix

ik_max_word

lowercase + asciifolding

中英混合文本

part_number_search

part_number_split

lowercase

零件号精确搜索

part_number_prefix

part_number_split

lowercase + part_ngram

零件号前缀搜索

prefix_search

standard

lowercase + part_ngram

通用前缀搜索

关键概念stop(去掉 the/a/an 等停用词)、porter_stem(running→run 词干化)、asciifolding(café→cafe 去重音)都是 ES 内置 filter,无需定义。


三、mappings 部分

3.1 字段类型速查

字段

类型

说明

docId, docNumber, docType...

keyword

精确匹配,不分析,用于过滤/排序/聚合

titleZh

text

全文搜索,使用自定义分析器

fileSizeKb

integer

数值类型

createdAt

date

日期类型

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": { /* 你的字段 */ }
  }
}