Mapping类型
- Numeric: 包括整数类型(long, integer, short, byte) 和 浮点类型(double, float)
- Date: 用于存储日期和时间类型
- Boolean:用于存储布尔类型(true, false)
- Binary: 用于存储二进制类型数据
- Array: 用于存储数组或列表类型数据
- Object: 用于存储复杂结构类型数据
常见并且很关键的数据类型
-
text字段类型:
(1). text类型主要用于全文本搜索,适合存储需要进行全文本分词的文本内容,比如文章,新闻,描述等。
(2). text字段会对文本内容进行分词处理,将文本拆分成独立的词项进行搜索
(3). 分词的结果会建立倒排索引,使搜索更加灵活高效
(4). text字段在搜索时会根据分词结果进行匹配,并计算出相关得分,以便返回最佳结果
-
keyword字段类型:
(1). keyword类型主要用于精确匹配和聚合操作, 适合存储不需要分词的精确值,比如ID, 标签等
(2). keyword类型的字段不会进行分词处理,而是将整一个字段作为整体进行搜索,差一个单词都搜不出来
(3). 不能进行模糊查询
(4). keyword字段适合用于过滤和精准匹配,同时可以进行快速的基于精确值的聚合操作
-
总节:
(1). 在选择text还是keyword类型时, 需要根据具体需求来衡量选择,看这个字段能不能做模糊查询,如果要做模糊查询,那就用text字段
(2). 如果需要全文本搜索,并且希望根据分词进行模糊查询,并得到匹配得分,就用text
(3). 如需精确匹配,排序或者聚合操作,并且不会对该字段进行模糊查询,比如身份证号等关键信息,则选择keyword类型
ES配置字段类型相关的命令
该命令时在kibana中使用的,如果时postman,请加上http://ip:port/
1. 创建索引,并指定字段的类型
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"
}
}
}
}
}
}
插入对应数据,并使es本身自带的_id为1
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."
}
]
}
2. 查询title字段,并模糊匹配关键字, title是text类型的
GET /my_index/_search
{
"query": {
"match": {
"title": "Elasticsearch"
}
}
}
3. 查询tags字段,并精准匹配数组中的某个值,tags是keyword类型的
GET /my_index/_search
{
"query": {
"match": {
"tags": "big data"
}
}
}