ElasticSearch分词器插件与Restful-API应用实战(二)
我们上一篇介绍一些比较简单的esApi的使用,本章主要给大家展示一些批量操作和DSL语言入门。
文档批量操作api
创建index 索引,并设置默认的分词器-ik
PUT /dxt
{
"settings": {
"index":{
"analysis.analyzer.default.type":"ik_max_word"
}
}
}
批量增删改查 _bulk
{“actionName”:{“index”:“indexName”,"_type":“typeName”,"_id":“id”}}
{“field1”:“value1”,“field2”:“value2”}
actionName表示操作型:create,index,delete,update
- create 批量创建 如果已经存在会报错
- index 存在就全量替换,不存在就创建
- delete 批量删除
- update 支持指定 部分变量更新
POST /dxt/_bulk
{"create":{"_type":"_doc","_id":"1"}}
{"name":"张三","age":"11","address":"广州天河区"}
{"create":{"_type":"_doc","_id":"2"}}
{"name":"李四","age":"18","address":"广州长隆乐园"}
{"create":{"_type":"_doc","_id":"3"}}
{"name":"马六","age":"26","address":"广州水上乐园"}
{"create":{"_type":"_doc","_id":"4"}}
{"name":"无疫烦","age":"21","address":"广州动物园"}
{"create":{"_type":"_doc","_id":"5"}}
{"name":"六六","age":"35","address":"北京朝阳区"}
{"create":{"_type":"_doc","_id":"6"}}
{"name":"裁缝机","age":"66","address":"北京朝阳区"}
{"create":{"_type":"_doc","_id":"7"}}
{"name":"法外狂徒-张三","age":"36","address":"无法无天"}
局部更新 update
POST /dxt/_bulk
{"update":{"_id":"6"}}
{"doc":{"name":"六六66"}}
{"update":{"_id":"7"}}
{"doc":{"name":"七七77"}}
批量查询 _mget
GET index/_mget
GET _mget
{
"docs": [
{
"_index":"dxt",
"_id": "3"
},
{
"_index":"dxt",
"_id": "4"
}
]
}
GET dxt/_mget
{
"docs": [
{
"_id": "1"
},
{
"_id": "3"
}
]
}
DSL语言
基于json格式来定义查询。
DSL由叶子查询子句和复合查询子句两种子句组成。
叶子查询-单条件
模糊匹配
通过前缀或者正则等匹配等。
精确匹配
根据条件获取完全匹配的数据
两种匹配形式对应的DSL语言的特点对比
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2YfNWawNCM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPB5UNBR1T1cGRPpHOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZwpmLzIjZhZGM3UmNyYWN2EzYiNWOjRjNihzNjdDZxETO4czLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
DLS-Query查询
精确查询-term
term 表示是一个整体 ,不会被es去分词,整个去匹配
POST /dxt/_search
{
"query": {
"term": {
"name": "张三"
}
}
}
模糊查询-match(单个)
es根据分词关键字match比较
POST /dxt/_search
{
"query": {
"match": {
"address": "广州"
}
}
}
模糊查询-multi_match(多个)
条件去多指定数据字段field去匹配
表示我 查询‘无’ 从"name","address"中匹配
POST /dxt/_search
{
"query": {
"multi_match": {
"query": "无",
"fields": ["name","address"]
}
}
}
模糊查询-query_string-可以多个条件
#可以不指定字段,也可以指定字段。
POST /dxt/_search
{
"from": 1,
"size": 2,
"query": {
"query_string": {
"default_field": "{field}", //默认指定字段
"fields": ["",""], //多条件 多字段
"query": "北京 or 广州"
}
}
}
根据范围排序 和分页
_source定义我们需要的字段。
如果读者按我前面的创建数据的age来排序,会被一个报错拦截,原因就是我们的age是字符串,es在排序字符串的时候会狠消耗资源,不建议这么做,所以如果需要排序,则一定需要根据数字来进行。他默认fielddata字段是关闭的。
GET /dxt/_search
{
"query": {
"range": {
"age": {
"gte": 10,
"lte": 20
}
}
},
"from": 0,
"size": 1,
"sort": [
{
"age": {
"order": "desc"
}
}
],
"_source": "age"
}
DLS-Filter查询
bool.filter关键字
filter形式搜索
“_score” : 0.0 无分值的,速度快
GET /dxt/_search
{
"query": {
"bool": {
"filter": {
"term": {
"name": "张三"
}
}
}
}
}
ES基本数据类型
字符串: text 和 keyword。
在存储的时的区别。
text: 是会被分词器来拆分的,拆分后倒排索引,不能用作排序和聚合。
keyword: 属性算作一个整体,不会被分词器拆开。
数值型: long、integer、short、byte、double、float
日期型: date
布尔型: boolean
ES这些类型是可以在我们去存放数据的时候,动态映射的,也可以类似关系数据库,去指定字段名和字段数据类型。
Elasticsearch并发控制
ES主要是通过乐观锁的机制,配合版本号来控制并发。
ES的优势之一就是它本身支持分布式结构,有自己的并发控制,其采用的是通过版本Version形式来处理并发。
ES.7的自带乐观锁的api参数
if_seq_no=版本值 &if_primary_term=文档位置。
这两个参数在我们查询索引数据的时候,会有对应的参数属性:_seq_no 和 _primary_term.
POST es-test/_doc/2?if_seq_no=59&if_primary_term=1
{
"name":"2"
}
我们在请求es更新数据的时候,带上当前的if_seq_no=版本值 &if_primary_term=文档位置,如果执行失败则报错提示,我们可以根据错误做重试机制,或者相关提示。
总结
我们本章主要是通过kibana可是工具去调用es的一些批量api,并且使用了一些较为复杂的DSL语言去查询数据,后续我们也会通过Java操作ES,做一些封装和实战。
感谢阅读,希望对你有所启发和思考~
ElasticSearch-深入理解数据检索与写入原理(四)
我是 祥天 ,期望在提高自己的同时,输出较高质量的分享,感谢各位读者的:点赞、收藏 和 评论 ,我们一起加油~