ElasticSearch复杂数据类型
最佳答案 问答题库638位专家为你答疑解惑
ElasticSearch入门到实战教程:点击查看
1. 对象类型(object)
一个字段下需要多种类型的属性字段,属性 attr
有身高、体重,添加映射语句如下:
POST indexname/_mapping
{"properties": {"attr": {"properties": {"height": {"type": "double"},"weight": {"type": "double"}}}}
}
对象类型新增数据语法
PUT indexname/_doc/1
{"attr": {"height": 176.3,"weight": 64}
}
筛选查询新增的数据
GET indexname/_search
{"query":{"term":{"attr.weight": "64"}}
}
2. 数组类型
ELasticsearch没有专用的数组类型,默认情况下任何字段都可以包含一个或者多个值,但是一个数组中的值要是同一种类型。
- 字符数组: [ “one”, “two” ]
- 整型数组:[1,3]
- 对象数组:[ { “name”: “长度”, “value”: “10” }, { “name”: “内存”, “value”: “16” }]
keyword数组,创建keyword字段
POST indexname/_mapping
{"properties": {"skills": {"type": "keyword"}}
}
新增数据
PUT indexname/_doc/2
{"skills": ["java", "c++"]
}
对象数组,创建对象字段
POST indexname/_mapping
{"properties": {"attrs": {"properties": {"name": {"type": "keyword"},"value": {"type": "keyword"}}}}
}
新增数据
PUT indexname/_doc/3
{"attrs": [{"name": "长度","value": "10"},{"name": "内存","value": "16"}]
}
3. 嵌套文档(nested)
nested嵌套类型是object中的一个特例,可以让对象数组
类型独立索引和查询。
项目场景中弥补对象数组的一些查询问题
接着前面创建的对象数组 attrs
先添加几条数据
POST _bulk
{"create":{"_index":"indexname","_id":20}}
{"attrs":[{"name":"长度","value":"64"},{"name":"内存","value":"32"}]}
{"create":{"_index":"indexname","_id":21}}
{"attrs":[{"name":"长度","value":"64"},{"name":"内存","value":"64"}]}
{"create":{"_index":"indexname","_id":22}}
{"attrs":[{"name":"长度","value":"64"}]}
现在业务需求:需要 属性=长度 且 值=32
的数据(目前数据里没有),我们来写查询语法。
GET indexname/_search
{"query": {"bool": {"must": [{"term": {"attrs.name": "长度"}},{"term": {"attrs.value": "32"}}]}}
}
运行后发现居然有数据,为什么呢?我们后面原理篇会讲。
怎么解决这种问题呢?使用
nested
类型即可解决。
添加映射字段
POST indexname/_mapping
{"properties": {"attrsNested": {"type": "nested","properties": {"name": {"type": "keyword"},"value": {"type": "keyword"}}}}
}
添加几条数据
POST _bulk
{"create":{"_index":"indexname","_id":20}}
{"attrsNested":[{"name":"长度","value":"64"},{"name":"内存","value":"32"}]}
{"create":{"_index":"indexname","_id":21}}
{"attrsNested":[{"name":"长度","value":"64"},{"name":"内存","value":"64"}]}
{"create":{"_index":"indexname","_id":22}}
{"attrsNested":[{"name":"长度","value":"64"}]}
查询数据
GET indexname/_search
{"query": {"nested": {"path": "attrsNested","query": {"bool": {"must": [{"term": {"attrsNested.name": "长度"}},{"term": {"attrsNested.value": "32"}}]}}}}
}
已经查不到数据了,问题完美解决
4. 子字段
text
类型不能用于排序、聚合。为什么呢?因为它的属性 fielddata
默认是false,设置为true就可以了,但是不建议使用,会增加内存的压力。
添加字段映射(不建议设置true):
POST indexname/_mapping
{"properties": {"address": {"type": "text","fielddata":true}}
}
直接使用 keyword
类型可以进行排序、聚合。
想必会有同学有疑问:
同样是字符串类型,干脆直接都用keyword类型不就行了。
如果你不需要 分词
那么你用keyword完全可以,如果你需要对字段值分词,那你还是需要用text。
那么有没有不增加压力,而且不用两个字段的方法呢? 当然有,就是做子字段!
POST indexname/_mapping
{"properties": {"address": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}}}
}
address
字段下增加了 keyword
名字的字段,类型是 keyword
,设置256长度
对应查询子字段keyword
的语句
GET indexname/_search
{"query": {"term":{"address.keyword": ""}}
}
5. 地理类型
geo_point
是地理类型。移动互联网的时代,移动设备越来越多,要根据地理位置搜索地址,可以把地址的经纬度数据设置地理数据类型。
POST indexname/_mapping
{"properties": {"location": {"type": "geo_point"}}
}
添加一条地理位置数据
PUT indexname/_doc/6
{"location": {"lat": 41.07,"lon": 116.64}
}
- lat(经度)
- lon(纬度)
根据(41.07,116.14)坐标,查询100km内的位置信息
GET indexname/_search
{"query": {"geo_distance": {"distance": "100km","location": {"lat": 41.07,"lon": 116.14}}}
}
根据(23.6,32.2)位置,对查询结果进行远近排序
GET indexname/_search
{"query": {"match_all": {}},"sort": [{"_geo_distance": {"location": "23.6,32.2","unit": "km"}}]
}
更多资料请看《ElasticSearch入门到实战教程》:点击查看
99%的人还看了
相似问题
- django ModelSerializer自定义显示字段
- 替换sql,某个字段特定容
- Java之反射获取和赋值字段
- java mybatisplus generator 修改字段类型
- 使用用户代理字段进行浏览器检测(判断页面运行环境)
- js数组操作——对象数组根据某个相同的字段分组
- spring boot加mybatis puls实现,在新增/修改时,对某些字段进行处理,使用的@TableField()
- 【IDEA 使用easyAPI、easyYapi、Apifox helper等插件时,导出接口文档缺少代码字段注释的相关内容、校验规则的解决方法】
- mysql取出组内按照某时间最新一条数据的其他字段
- 基于geotools24.0的创建自动增长主键id字段的方法
猜你感兴趣
版权申明
本文"ElasticSearch复杂数据类型":http://eshow365.cn/6-28016-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!