Elasticsearch 8.x 的 Mapping 和常见字段类型
什么是 Mapping
- 类似于数据库中的表结构定义 schema
- 定义索引中的字段的名称,字段的数据类型,比如字符串、数字、布尔等
查看索引库的字段类型
shell
## 格式
GET /<index_name>/_mapping
## 实例
GET /my_index/_mappingDynamic Mapping(动态映射)
- 用于在索引文档时自动检测和定义字段的数据类型
- 当我们向索引中添加新文档时,Elasticsearch 会自动检测文档中的各个字段,并根据它们的值来尝试推断字段类型
- 常见的字段类型包括文本(text)、关键词(keyword)、日期(date)、数值(numeric)等
- 动态映射具备自动解析和创建字段的便利性,但在某些情况下,由于字段类型的不确定性,动态映射可能会带来一些问题
- 例如字段解析错误、字段类型不一致等,如果对字段类型有明确的要求,最好在索引创建前通过显式映射定义来指定字段类型
ElasticSearch 常见的数据类型
在 ES 7.x 后有两种字符串类型:Text 和 Keyword
| 类型 | 描述 |
|---|---|
| Text | 用于 全文搜索 的字符串类型,支持分词和索引建立 |
| Keyword | 用于 精确匹配 的字符串类型,不进行分词,适合用作过滤和聚合操作。 |
| Numeric | 包括整数类型(long、integer、short、byte)和浮点数类型(double、float)。 |
| Date | 用于存储日期和时间的类型。 |
| Boolean | 用于存储布尔值(true 或 false)的类型。 |
| Binary | 用于存储二进制数据的类型。 |
| Array | 用于存储数组或列表数据的类型。 |
| Object | 用于存储复杂结构数据的类型 |
最高频使用的数据类型
text 字段类型
- text 类型主要用于全文本搜索,适合存储需要进行全文本分词的文本内容,如文章、新闻等。
- text 字段会对文本内容进行分词处理,将文本拆分成独立的词项(tokens)进行索引
- 分词的结果会建立倒排索引,使搜索更加灵活和高效。
- text 字段在搜索时会根据分词结果进行匹配,并计算相关性得分,以便返回最佳匹配的结果。
keyword 字段类型
- keyword 类型主要用于精确匹配和聚合操作,适合存储不需要分词的精确值,如 ID、标签、关键字等。
- keyword 字段不会进行分词处理,而是将整个字段作为一个整体进行索引和搜索。
- 这使得搜索只能从精确的值进行匹配,而不能根据词项对内容进行模糊检索。
- keyword 字段适合用于过滤和精确匹配,同时可以进行快速的基于精确值的聚合操作。
总结
- 在选择 text 字段类型和 keyword 字段类型时,需要根据具体的需求进行权衡和选择。
- 如果需要进行全文本检索,并且希望根据分词结果计算相关性得分,以获得最佳的匹配结果,则选择 text 字段类型。
- 如果需要进行精确匹配、排序或聚合操作,并且不需要对内容进行分词,则选择 keyword 字段类型。
案例实战
创建索引
shell
PUT /my_index
{
"mappings": {
"properties": {
"title": {
"type": "text"
},
"tags": {
"type": "keyword"
},
"publish_date": {
"type": "date"
},
"rating": {
"type": "float"
},
"is_published": {
"type": "boolean"
},
"author": {
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "integer"
}
}
},
"comments": {
"type": "nested",
"properties": {
"user": {
"type": "keyword"
},
"message": {
"type": "text"
}
}
}
}
}
}插入文档
shell
POST /my_index/_doc/1
{
"title": "朔风最近正在学习 Elasticsearch Introduction",
"tags": ["search", "big data", "distributed system", "朔风"],
"publish_date": "2025-01-01",
"rating": 4.5,
"is_published": true,
"author": {
"name": "John Doe",
"age": 30
},
"comments": [
{
"user": "Alice",
"message": "Great article!"
},
{
"user": "Bob",
"message": "Very informative."
}
]
}查询匹配关键词的文档一
shell
GET /my_index/_search
{
"query": {
"match": {
"title": "Elasticsearch"
}
}
}查询匹配关键词的文档二
tags 为 keyword 字段类型,无法搜索
shell
GET /my_index/_search
{
"query": {
"match": {
"tags": "data"
}
}
}
朔风