0%

elasticsearch映射参数

Elasticsearch 映射参数详解:定制字段的索引与检索行为

映射参数(Mapping Parameters)是 Elasticsearch 中用于定制字段行为的核心配置,通过这些参数可以控制字段的分词方式、数据处理、索引策略等,以适配不同的业务场景。以下是 6.8.x 版本中常用映射参数的详细解析。

analyzer:字符串分词器配置

analyzer 用于指定索引时处理字符串字段的分词器,决定如何将文本拆分为词项(Term)。查询时的分词器由 search_analyzer 或默认规则决定。

核心作用

  • 定义字符串字段的分词逻辑(如中文分词、英文词干提取等)。
  • 支持预定义分析器(如 standardik_smart)或自定义分析器。

分析器查找顺序

  • 索引时:字段映射中定义的 analyzer → 索引设置中的 default 分析器 → 标准分析器(standard)。
  • 查询时:查询中指定的 analyzer → 字段映射的 search_analyzer → 字段映射的 analyzer → 索引设置的 default_search → 索引设置的 default → 标准分析器。

配置示例(自定义分析器)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
PUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": { // 自定义索引时分析器
"type": "custom",
"tokenizer": "standard", // 标准分词器
"filter": ["lowercase"] // 转小写过滤器
},
"my_search_analyzer": { // 自定义查询时分析器
"type": "custom",
"tokenizer": "standard",
"filter": ["lowercase", "stop"] // 额外添加停止词过滤
}
}
}
},
"mappings": {
"default": {
"properties": {
"title": {
"type": "text",
"analyzer": "my_analyzer", // 索引时用自定义分析器
"search_analyzer": "my_search_analyzer" // 查询时用另一分析器
}
}
}
}
}

注意

  • 文本字段(text)必须配置分析器,关键词字段(keyword)不分词,无需指定。
  • 中文分词需依赖第三方插件(如 IK 分词器),并在 analyzer 中指定(如 ik_max_word)。

normalizer:关键词标准化器

normalizer 仅用于 keyword 类型字段,在索引前对字段值进行标准化处理(如大小写转换、特殊字符处理),确保精确匹配的一致性。

核心作用

  • 统一 keyword 字段的格式(如将 “Hello”“HELLO” 统一为 “hello”)。
  • analyzer 的区别:normalizer 不分词,仅做字符级转换;analyzer 用于 text 字段,会分词。

配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
PUT my_index
{
"settings": {
"analysis": {
"normalizer": {
"my_normalizer": { // 自定义标准化器
"type": "custom",
"char_filter": [], // 字符过滤器(可选)
"filter": ["lowercase", "asciifolding"] // 转小写+ASCII折叠(如é→e)
}
}
}
},
"mappings": {
"default": {
"properties": {
"tag": {
"type": "keyword",
"normalizer": "my_normalizer" // 应用标准化器
}
}
}
}
}

// 插入数据时自动标准化
PUT my_index/default/1
{ "tag": "HELLO" } // 实际存储为 "hello"

// 查询时匹配标准化后的值
GET my_index/_search
{ "query": { "term": { "tag": "hello" } } } // 命中

boost:字段权重调整

boost 用于调整字段在相关性得分中的权重,权重越高,匹配该字段的文档得分越高。

核心说明

  • 索引时 boost:5.0 版本后废弃,不再支持在映射中配置(历史用法为 {"type": "text", "boost": 2})。
  • 查询时 boost:推荐使用,在查询语句中为字段临时加权,不影响索引结构。

配置示例(查询时加权)

1
2
3
4
5
6
7
8
9
10
11
GET my_index/_search
{
"query": {
"match": {
"title": {
"query": "elasticsearch",
"boost": 3 // 标题字段权重为3,高于默认的1
}
}
}
}

coerce:数据类型强制转换

coerce 控制是否自动将 “脏数据” 转换为字段声明的类型(如字符串转数字、浮点数转整数)。

核心作用

  • 容忍数据格式不严格的情况(如用户输入的数字带引号:"5" → 5)。
  • 禁用后,格式错误的数据会导致文档写入失败。

配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
PUT my_index
{
"mappings": {
"default": {
"properties": {
"age": {
"type": "integer",
"coerce": true // 允许字符串转整数(如"25"→25)
},
"score": {
"type": "integer",
"coerce": false // 禁用转换,仅接受纯整数(如25)
}
}
}
}
}

// 允许写入:age字段自动转换
PUT my_index/default/1
{ "age": "25", "score": 90 } // 成功

// 禁止写入:score字段格式错误
PUT my_index/default/2
{ "age": 30, "score": "95" } // 失败(score为字符串)

copy_to:多字段值合并

copy_to 允许将多个字段的值复制到一个 “聚合字段”,便于通过单个字段查询多个字段的内容(类似自定义 _all 字段)。

核心作用

  • 合并分散在多个字段中的相关信息(如 first_namelast_name 合并为 full_name)。
  • 原始字段仍可单独查询,聚合字段仅用于联合查询。

配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
PUT my_index
{
"mappings": {
"default": {
"properties": {
"first_name": {
"type": "text",
"copy_to": "full_name" // 复制到full_name
},
"last_name": {
"type": "text",
"copy_to": "full_name" // 复制到full_name
},
"full_name": { "type": "text" } // 聚合字段
}
}
}
}

// 插入数据
PUT my_index/default/1
{ "first_name": "John", "last_name": "Smith" }

// 通过聚合字段查询(匹配first_name或last_name)
GET my_index/_search
{
"query": {
"match": {
"full_name": "John Smith" // 等效于查询first_name或last_name
}
}
}

doc_valuesfielddata:排序与聚合支持

两者均为支持排序、聚合、脚本访问的数据结构,核心区别在于适用字段类型和存储方式。

doc_values

  • 作用:为非 text 字段(如 keyword、数字、日期)提供排序 / 聚合支持,默认开启
  • 存储:索引时创建,磁盘存储,列存结构,适合大规模数据。
  • 禁用场景:确定字段无需排序 / 聚合时,禁用以节省磁盘空间。

fielddata

  • 作用:为 text 字段提供排序 / 聚合支持,默认关闭(因内存开销大)。
  • 存储:查询时动态创建,内存存储,适合小规模文本字段。

配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
PUT my_index
{
"mappings": {
"default": {
"properties": {
"tags": { // keyword类型,默认开启doc_values
"type": "keyword",
"doc_values": false // 禁用(无需排序/聚合)
},
"content": { // text类型,需手动开启fielddata
"type": "text",
"fielddata": true // 允许排序/聚合
}
}
}
}
}

dynamic:动态字段控制

dynamic 控制是否自动为文档中新增的未知字段创建映射。

取值说明

  • true:自动添加新字段到映射(默认)。
  • false:忽略新字段,不添加到映射(文档可写入,但新字段不可查)。
  • strict:检测到新字段时抛出异常,阻止文档写入。

配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
PUT my_index
{
"mappings": {
"default": {
"dynamic": false, // 全局禁用动态字段
"properties": {
"user": {
"properties": {
"name": { "type": "text" },
"settings": {
"dynamic": true // 子对象允许动态字段
}
}
}
}
}
}
}

enabled:字段内容是否解析

enabled 仅用于对象字段(object),控制 Elasticsearch 是否解析字段内容(仅影响索引,不影响 _source 存储)。

核心作用

  • enabled: false:跳过字段解析,字段内容仅作为原始 JSON 保存在 _source 中,不可查询、排序或聚合。
  • 适用场景:存储无需检索的冗余信息(如原始日志、复杂嵌套结构)。

配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
PUT my_index
{
"mappings": {
"default": {
"properties": {
"metadata": {
"type": "object",
"enabled": false // 不解析metadata内容,仅存储
},
"title": { "type": "text" } // 正常解析
}
}
}
}

// 插入数据
PUT my_index/default/1
{
"title": "测试文档",
"metadata": { "raw": "复杂结构,无需检索", "version": "1.0" }
}

// 无法查询metadata字段(未解析)
GET my_index/_search
{ "query": { "term": { "metadata.version": "1.0" } } } // 无结果

format:日期格式指定

format 用于 date 类型字段,指定可接受的日期格式(默认支持多种格式,如 yyyy-MM-dd、时间戳)。

配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
PUT my_index
{
"mappings": {
"default": {
"properties": {
"create_time": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" // 支持多种格式
}
}
}
}
}

// 允许写入的日期格式
PUT my_index/default/1 { "create_time": "2023-07-01 12:30:00" }
PUT my_index/default/2 { "create_time": "2023-07-01" }
PUT my_index/default/3 { "create_time": 1688183400000 } // 时间戳

其他常用参数

参数 作用说明 适用场景
ignore_above keyword 类型中,超过指定长度的字符串不索引(如 ignore_above: 20 过滤过长的关键词(如 URL、长 ID)
ignore_malformed 忽略格式错误的字段值(如字符串写入数字字段),不影响文档其他字段索引 容忍脏数据(如用户输入的非标准格式)
index_options 控制倒排索引存储的信息(docs/freqs/positions/offsets),影响短语查询、高亮等 精细化控制索引内容,平衡性能与功能
fields 同一字段以多种方式索引(如 text 用于搜索,keyword 用于聚合) 同时支持全文搜索和排序 / 聚合(如商品名称)
norms 存储相关性得分计算所需的标准化系数,禁用可节省内存(不影响精确匹配) 无需相关性排序的场景(如日志检索)
null_value null 值设置默认索引值(如 null_value: "NULL"),使空值可查询 需要统计或过滤空值字段的场景

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10