ElasticSearch 索引库操作之Mapping映射属性
ElasticSearch 索引库操作之Mapping映射属性
在使用Elasticsearch进行数据存储和检索时,Mapping映射属性是一个非常重要的概念。它类似于关系型数据库中的表结构定义,用于描述文档字段的结构和数据类型。本文将详细介绍Elasticsearch中Mapping映射属性的相关知识,包括常见的字段数据类型、Mapping属性以及具体案例分析。
Mapping概述
在Elasticsearch中,mapping
是用来定义文档字段的结构和数据类型的,类似于关系型数据库中的表结构定义。为了将数据存储到Elasticsearch索引库中,我们首先需要定义字段的映射规则。常见的映射属性包括字段的数据类型、是否创建索引、是否进行分词等。
常见的字段数据类型(type)
String 类型
text:用于长文本,需要分词处理,适用于需要进行全文搜索的字段。例如文章内容、描述等。
keyword:用于短文本或不可分词的字段,通常用于精确匹配,如品牌名称、IP地址、国家名称等。
数值类型:Elasticsearch 支持多种数值类型,与Java的数值类型一致。
byte
:1字节short
:2字节integer
:4字节long
:8字节float
:单精度浮点数double
:双精度浮点数布尔类型 (
boolean
):用于表示true
或false
值。日期类型 (
date
):日期在Elasticsearch中以字符串或毫秒值表示。需要注意的是,JSON文档没有专门的日期类型,日期会被序列化为字符串或毫秒值。对象类型 (
object
):支持嵌套的JSON对象,表示一个字段本身包含多个子字段。这种类型通常会嵌套多个字段,需要使用properties
来定义子字段。
常见的Mapping 属性
index
:指定字段是否需要创建倒排索引。true
(默认):字段会创建索引,可以进行搜索和排序。false
:字段不会创建索引,不能用于搜索和排序。analyzer
:分词器,用于指定字段分词规则。仅适用于
text
类型字段,用于文本的分词。常用分词器包括
ik_max_word
、standard
等。对于keyword
、数值、布尔等类型的字段,不需要指定analyzer
。properties
:用于定义嵌套对象类型(object
)字段的子字段。如果一个字段是对象类型,它可能包含多个子字段,这时需要通过properties
来指定这些子字段的类型和其他属性。
具体案例分析
以一个用户信息文档为例,分析如何为每个字段设置适当的映射:
age(年龄)
类型:
integer
或byte
index
:根据业务需求,通常需要进行排序或过滤,使用true
。analyzer
:不需要。解释:年龄是数字类型,不需要分词,选择
integer
或byte
类型即可。weight(体重)
类型:
float
index
:根据业务需求,如果需要参与排序,可以设置true
。analyzer
:不需要。解释:体重是浮动的数值,选择
float
类型。isMarried(婚姻状态)
类型:
boolean
index
:如果需要按婚姻状态筛选,设置true
。analyzer
:不需要。解释:婚姻状态是布尔类型,只需设置为
boolean
类型。info(描述信息)
类型:
text
index
:true
(通常需要搜索描述信息)。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
属性定义子字段。