一、语法
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 格式表示,通常包含 query
或 filter
字段。在执行查询时,通常向特定的索引发起请求,使用 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
}