Skip to content
章节导航

Elasticsearch 8.x 的 Mapping 和常见字段类型

什么是 Mapping

  • 类似于数据库中的表结构定义 schema
  • 定义索引中的字段的名称,字段的数据类型,比如字符串、数字、布尔等

查看索引库的字段类型

shell
## 格式
GET /<index_name>/_mapping

## 实例
GET /my_index/_mapping

Dynamic 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"
    }
  }
}