天天看点

ElasticSearch批量操作文本与DSL语言入门(三)

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语言的特点对比

ElasticSearch批量操作文本与DSL语言入门(三)

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批量操作文本与DSL语言入门(三)

感谢阅读,希望对你有所启发和思考~

ElasticSearch-深入理解数据检索与写入原理(四)

我是 祥天 ,期望在提高自己的同时,输出较高质量的分享,感谢各位读者的:点赞、收藏 和 评论 ,我们一起加油~

继续阅读