ElasticSearch 索引库操作之Mapping映射属性

发布于:2025-02-10 ⋅ 阅读:(58) ⋅ 点赞:(0)

Mapping概述

在Elasticsearch中,mapping是用来定义文档字段的结构和数据类型的,类似于关系型数据库中的表结构定义。为了将数据存储到Elasticsearch索引库中,我们首先需要定义字段的映射规则。常见的映射属性包括字段的数据类型、是否创建索引、是否进行分词等。



常见的字段数据类型(type)

  • String 类型
    • text:用于长文本,需要分词处理,适用于需要进行全文搜索的字段。例如文章内容、描述等。
    • keyword:用于短文本或不可分词的字段,通常用于精确匹配,如品牌名称、IP地址、国家名称等。

  • 数值类型:Elasticsearch 支持多种数值类型,与Java的数值类型一致。
    • byte:1字节
    • short:2字节
    • integer:4字节
    • long:8字节
    • float:单精度浮点数
    • double:双精度浮点数

  • 布尔类型 (boolean):用于表示truefalse 值。

  • 日期类型 (date):日期在Elasticsearch中以字符串或毫秒值表示。需要注意的是,JSON文档没有专门的日期类型,日期会被序列化为字符串或毫秒值。

  • 对象类型 (object):支持嵌套的JSON对象,表示一个字段本身包含多个子字段。这种类型通常会嵌套多个字段,需要使用 properties 来定义子字段。



常见的Mapping 属性

  • index:指定字段是否需要创建倒排索引。
    • true(默认):字段会创建索引,可以进行搜索和排序。
    • false:字段不会创建索引,不能用于搜索和排序。

  • analyzer:分词器,用于指定字段分词规则。
    • 仅适用于 text 类型字段,用于文本的分词。
    • 常用分词器包括 ik_max_wordstandard 等。对于 keyword、数值、布尔等类型的字段,不需要指定 analyzer

  • properties:用于定义嵌套对象类型(object)字段的子字段。如果一个字段是对象类型,它可能包含多个子字段,这时需要通过 properties 来指定这些子字段的类型和其他属性。



具体案例分析

以一个用户信息文档为例,分析如何为每个字段设置适当的映射:

  • age(年龄)
    类型:integerbyte
    index:根据业务需求,通常需要进行排序或过滤,使用 true
    analyzer:不需要。
    解释:年龄是数字类型,不需要分词,选择 integerbyte 类型即可。

  • weight(体重)
    类型:float
    index:根据业务需求,如果需要参与排序,可以设置 true
    analyzer:不需要。
    解释:体重是浮动的数值,选择 float 类型。

  • isMarried(婚姻状态)
    类型:boolean
    index:如果需要按婚姻状态筛选,设置 true
    analyzer:不需要。
    解释:婚姻状态是布尔类型,只需设置为 boolean 类型。

  • info(描述信息)
    类型:text
    indextrue(通常需要搜索描述信息)。
    analyzer:需要分词器,例如 ik_max_word
    解释:描述信息是长文本,需要分词和创建倒排索引。

  • email(电子邮箱)
    类型:keyword
    index:通常情况下不需要搜索邮箱,因此设置 false
    analyzer:不需要。
    解释:邮箱是不可分词的字段,使用 keyword 类型。

  • scope(评分)
    类型:float
    index:根据需求,通常需要排序,设置 true
    analyzer:不需要。
    解释:评分通常是浮动值,且需要参与排序。

  • name(姓名)
    类型:object
    子字段:
    • firstName(名字):类型 keyword,不分词。
    • lastName(姓氏):类型 keyword,不分词。
      index:通常都设置为 true,除非不需要搜索。



总结

  • 字段数据类型:选择合适的字段类型,决定数据存储和查询效率。
  • 索引与分词器:根据字段是否需要参与搜索,选择是否创建索引,并为可分词的字段指定分词器。
  • 嵌套对象与子字段:使用 object 类型存储嵌套结构,使用 properties 属性定义子字段。