elasticsearch mapping 映射
Mapping 作用
定义index 中的字段名、字段的类型,包括相关 配置setting
如果没有手动配置mapping, Elasticsearch 默认会自动解析出类型,以每个字段第一次出现为准。
手动配置 mapping
PUT /user/
{
"mappings": {
"doc": {
"properties": {
"name": {
"type": "text",
"fields": {
"firstname": {
"type": "keyword",
"ignore_above": 256
}
}
},
"age": {
"type": "long",
"index": false
},
"job": {
"type": "keyword"
},
"intro":{
"type":"text"
},
"create_time": {
"type": "date",
"format": "epoch_second"
}
}
}
}
}
name: text类型,可分词,支持模糊索引
name.firstname: keyword类型, 只能精确配置,不支持分词, 超过256字符不索引没法被搜索
age:long类型,精确匹配
job: keyword类型, 只能精确匹配,不分词
intro: text类型, 分词,模糊检索
create_time:date类型,时间戳
字符串类型
有 text 和 keyword 2钟, 其中text支持分词, 用于全文搜索; keyword不支持分词, 用于聚合和排序;
模糊搜索 + 精确匹配 一般是 name 或 title 字段。
"name":{
"type": "text",
"analyzer": "ik_smart", # 该字段使用ik分词
"fields": {
"firstname": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
数字类型
long、integer、short、byte、double、float、scaled_float(缩放类型浮点数,要与缩放因子一起使用, 例如价格56.78,缩放因子为100,那么存起来就是5678)、half_float(半精度浮点数)
日期类型
date:可以是格式化的日期字符串、秒级时间戳、毫秒级时间戳, 但在elasticsearch内部会被转化成long类型表示的毫秒级时间戳。
布尔类型
boolean:true、false、“true”、“false”
二进制类型
binary:接收 base64 编码的字符串,默认不存储(store 属性取值为 false,store属性官方文档),也不可被搜索。
"pic": {"type": "binary"}
范围类型
integer_range, float_range, long_range, double_range, date_range
复杂数据类型
数组类型:
数据中元素的类型必须是一致的。字符型数组、整型数组、对象数组
Object对象类型: json 对象类型
写入到es中后,文档会被索引成简单的 key-value 对,例如:
{
“region”: "US",
”manager“:{
“age”: 30,
"name": {
"first":"John",
"last": "Smith"
}
}
}
| |
| | 转换成:
\ /
{
"region": "US",
"manager.age": 30,
"manager.name.first": "John",
"manager.name.last": "Smith"
}
嵌套类型 nested
它允许对象数组以可以彼此独立查询的方式进行索引,使用例子查看父子与嵌套关系中的嵌套关系。
nested
的 彼此独立查询
是指:
如果使用 Object
类型存储查询有时会出现下面问题:
# 某文档结构
PUT /my_index/my_type/1
{
"group": "fans",
"user":[
{
"first": "John",
"last": "Smith"
},
{
"first": "Alice",
"last": "White"
}
]
}
user
字段会被动态添加为 Object 类型,最后会被转换为以下扁平形式:
{
"group": "fans",
"user.first": ["alice", "john"],
"user.last": ["smith", "white"]
}
user.fist
和 user.last
转为扁平化后变为多值字段,first 和 last 的关联关系就丢失了。执行以下搜索会搜到上面的结果:
GET /my_index/_search
{
"query": {
"bool": {
"must": [
{"match": {"user.first": "Alice"}},
{"match": {"user.last": "Smith"}}
]
}
}
}
然而事实上不应该匹配到的,如果要索引对象数组并且要避免产生上述问题,就应该使用 nested 对象类型而不是 Object类型, nested 对象类型可以保持数组中每个对象的独立性:
PUT /my_index
{
"mappings": {
"my_type": {
"properties":{
"type": "nested"
}
}
}
}
特定专用类型
ip类型:用于存储ipv4、ipv6
地理坐标类型:geo_point “lat”: 41.12, “lon”: -71.34
地理形状类型:geo_shape
completion类型: completion提供自动补全建议
token count类型:用来统计夫字段生成的index的数量
推荐阅读
-
elasticsearch mapping 映射
-
elasticsearch mapping之一:引入mapping
-
elasticsearch映射相关字段定义,属性定义,及动态映射(marvel插件方式)mapping
-
mapping.xml POJO的映射文件
-
(四)elasticsearch之mapping详解和数据类型
-
初识搜索引擎_手动建立和修改mapping 及 定制string类型数据是否分词
-
ElasticSearch入门-结构定义之Mapping
-
初识搜索引擎_mapping核心数据以及dynamic mapping
-
Bowtie2 基因组mapping
-
MyBatis快速入门之环境搭建和单表映射