ES语法(一)概括

一、语法

1、请求方式

Elasticsearch(ES)使用基于 JSON 的查询 DSL(领域特定语言)来与数据交互。

一个 ElasticSearch 请求和任何 HTTP 请求一样由若干相同的部件组成:

复制代码
curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'

|-------------------|--------------------------------------------------------------------------------------|
| 被 < > 标记的部件 | 含义 |
| VERB | 适当的 HTTP 方法 或 谓词 : GET`、 `POST`、 `PUT`、 `HEAD 或者 `DELETE`。 |
| PROTOCOL | http 或者 https`(如果你在 ElasticSearch 前面有一个 `https 代理) |
| HOST | ElasticSearch 集群中任意节点的主机名,或者用 localhost 代表本地机器上的节点。 |
| PORT | 运行 ElasticSearch HTTP 服务的端口号,默认是 9200 。 |
| PATH | API 的终端路径(例如 _count 将返回集群中文档数量)。Path 可能包含多个组件,例如:_cluster/stats 和 _nodes/stats/jvm 。 |
| QUERY_STRING | 任意可选的查询字符串参数 (例如 pretty 将格式化地输出 JSON 返回值,使其更容易阅读) |
| BODY | 一个 JSON 格式的请求体 (如果请求需要的话) |

2、大小写敏感

es是大小写敏感的。

二、请求类型

1、GET请求

GET 请求通常用于查询操作;

它会通过 URL 参数传递请求数据,查询条件较简单时适用。

2、POST请求

POST 请求通常用于提交数据,如添加或更新文档;

也可用于执行复杂的查询:复杂查询或聚合(特别是当查询语句较大时,无法通过 URL 传递)

三、查询返回结果

执行命令:索引库名称/_search

空搜索的结果为:

复制代码
{
  "took": 2,		# 该命令请求花费了多长时间,单位:毫秒。
  "timed_out": false,		# 搜索是否超时
  "_shards": {		# 搜索分片信息
    "total": 3,		# 搜索分片总数
    "successful": 3,		# 搜索成功的分片数量
    "skipped": 0,		# 没有搜索的分片,跳过的分片
    "failed": 0		# 搜索失败的分片数量
  },
  "hits": {		# 搜索结果集。需要的一切数据都是从hits中获取
    "total": 21798,		# 返回多少条数据
    "max_score": 1,		#返回结果中,最大的匹配度分值
    "hits": [		# 默认查询前十条数据,根据分值降序排序,这里为了节省地方,把默认查询的前十条数据删了9条,只剩下一条数据
      {
        "_index": "",		# 索引库名称
        "_type": "",		# 类型名称
        "_id": "",		# 该条数据的id
        "_score": 1,		# 关键字与该条数据的匹配度分值
        "_routing": "",		# routing参数是一个可选参数,默认使用文档的_id值,用于计算文档所属分片
        "_source": {		# 索引库中类型,返回结果字段,不指定的话,默认全部显示出来
          "id": 1,
          "orderNo": "",
          "appId": "",
          "componentAppId": "",
          "settleNo": "",
          "outSettleNo": "",
          "settleAmount": 5,
          "orderAmount": 7,
          "settleStatus": 3,
          "paymentChannel": 1,
          "version": 2,
          "settleTime": ,
          "createTime": ,
          "updateTime": ,
          "promotionAccountId": "",
          "invoiceStatus": 1,
          "promotionTypeValue": 0,
          "commissionRateFeeCentAmount": 0,
          "commissionChargeFeeCentAmount": 0,
          "promotionFeeCentAmount": 2,
          "developerPromotionFeeCentAmount": 0,
          "promotionType": ""
        }
      }
    ]
  }
}

按照从上到下的顺序,一共四个返回值,took,timed_out,_shards,hits。

1、took

该命令请求花费了多长时间,单位:毫秒。

2、timed_out

搜索是否超时。

3、shards

搜索分片信息。

(1)total

搜索分片总数。

(2)successful

搜索成功的分片数量。

(3)skipped

没有搜索的分片,跳过的分片。

(4)failed

搜索失败的分片数量。

4、hits

搜索结果集,需要的一切数据都是从hits中获取。

(1)total

返回多少条数据。

(2)max_score

返回结果中,最大的匹配度分值。

(3)hits

默认查询前十条数据,根据分值降序排序。

(4)_index

索引库名称。

(5)_type

类型名称

(6)_id

该条数据的id。

(7)_score

关键字与该条数据的匹配度分值。

(8)_source

索引库中类型,返回结果字段,不指定的话,默认全部显示出来。

四、查询语法介绍

语法GET /索引/类型/_search 查询条件。

这个查询条件有两种写法,

1、URL 拼接

在GET的url中指定参数,这种方法比较简单。如

(1)查询所有

复制代码
GET /索引名称/_search

(2) 条件查询:

复制代码
GET /es-test/_search?q=blog

(3)分页查询:

复制代码
GET /es-test/_search?size=5&from=10
2、DSL(常用)

还有一种是ES查询表达式 (DSL) 检索,所有查询都以 JSON 格式表示,通常包含 queryfilter 字段。在执行查询时,通常向特定的索引发起请求,使用 HTTP 方法(GET 或 POST)。JSON 的常用字段有:

(1)sort

封装排序

(2) _source

指定查询结果的字段,不指定则默认返回所有字段

复制代码
GET /wtyy-test/user/_search
{
    "query":{"match_all":{}},
    "_source":["name","age"]
}
(3)query

封装查询条件

(4)分页条件

from、size

(5)highlight高亮

通常自己开发搜索引擎的时候,往往需要对搜索结果中的关键词高亮这种功能。注意,带条件查询高亮才生效,如无条件分页查询高亮是不生效的。

复制代码
GET  wtyy-test/user/_search
{
  "query": {
    "match": {
      "address": "北京"
    }
  },
  "highlight": {
    "fields": {
      "address": {}
    }
  }
}

返回:

复制代码
{
  "took": 61,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.7787034,
    "hits": [
      {
        "_index": "wtyy-test",
        "_type": "user",
        "_id": "1",
        "_score": 0.7787034,
        "_source": {
          "name": "王五1",
          "age": 1,
          "address": "湖北",
          "school": "测试学校"
        },
        "highlight": {
          "address": [
            "湖<em>北</em>"
          ]
        }
      }
    ]
  }
}

在返回体中有一个 highlight 字段,里面对 message 字段进行高亮处理: 关键词使用了 <em></em> 标签包围了。可以使用 css 修改对 <em> 标签的样式,以实现关键词高亮效果。

五、es的并发处理

使用的乐观锁 在 后面加上 version:

复制代码
POST  /user/student/1?version=3
{
  "name":"zyk",
  "age":0
}

只有version = 当前记录的version的时候才能修改成功。es 可以自动控制 vserion 通过 ,version_type指定 ,version_type=external 要求 version 大于当前的version ,version_type=internal 这个是默认值 ,必须等于当前的值<br>version_type=external_gte 大于等于当前的version<br>version_type=force 已经废弃了不能用了,我也不知道以前什么意思,提升, Validation Failed: ``1``: version type [force] may no longer be used

复制代码
POST  /user/student/1?version_type=external&version=505
{
  "name":"zyk",
  "age":0
}
相关推荐
uyeonashi3 分钟前
【Boost搜索引擎】构建Boost站内搜索引擎实践
开发语言·c++·搜索引擎
jiedaodezhuti6 小时前
ElasticSearch重启之后shard未分配问题的解决
笔记·elasticsearch
jiedaodezhuti6 小时前
为什么elasticsearch配置文件JVM配置31G最佳
大数据·jvm·elasticsearch
思通数据6 小时前
AI全域智能监控系统重构商业清洁管理范式——从被动响应到主动预防的监控效能革命
大数据·人工智能·目标检测·机器学习·计算机视觉·数据挖掘·ocr
lilye667 小时前
精益数据分析(55/126):双边市场模式的挑战、策略与创业阶段关联
大数据·人工智能·数据分析
white.tie7 小时前
Docker部署单节点Elasticsearch
elasticsearch·docker·jenkins
码上地球7 小时前
因子分析基础指南:原理、步骤与地球化学数据分析应用解析
大数据·数据挖掘·数据分析
胡小禾7 小时前
ES常识7:ES8.X集群允许4个 master 节点吗
大数据·elasticsearch·搜索引擎
火龙谷8 小时前
【hadoop】Kafka 安装部署
大数据·hadoop·kafka
强哥叨逼叨8 小时前
没经过我同意,flink window就把数据存到state里的了?
大数据·flink