文本 主要是记录一些 有关于ElasticSearch的DSL语句的使用
上一篇文章 说明了 索引库操作 以及 类型及映射操作 本文将详细说明其他的使用语法
具体操作
1.文档操作【基本的CURD】
1.1 新建文档
发送请求
POST /shopping/product
{
“title”:”小米手机”,
“images”:”http://www.youngdonkey.cn/xm.jpg",
“price”:3999.00
}
响应结果
{
“_index” : “shopping”,
“_type” : “product”,
“_id” :
“indGaHEB1ahbZ0SRrXt3”,
“_version” : 1,
“result” : “created”,
“_shards” : {
“total” : 2,
“successful” : 1,
“failed” : 0
},
“_seq_no” : 0,
“_primary_term” : 1
}响应结果解释
{
“_index【索引库】” : “shopping”,
“_type【类型】” : “product”,
“_id【主键id】” :
“indGaHEB1ahbZ0SRrXt3”,
“_version【版本】” : 1,
“result【操作结果】” : “created”,
“_shards【分片】” : {
“total【总数】” : 2,
“successful【成功】” : 1,
“failed【失败】” : 0
},
“_seq_no” : 0,
“_primary_term” : 1
}可以看到结果显示为:
created
,是创建成功了。另外,需要注意的是,在响应结果中有个
_id
字段,这个就是这条文档数据的唯一标识
,以后的增删改查都依赖这个id作为唯一标示。可以看到id的值为:indGaHEB1ahbZ0SRrXt3,这里我们新增时没有指定id,所以是ES帮我们随机生成的id。多创建几条数据:
POST /shopping/product/2
{
“title”:”华为手机”,“images”:”http://www.youngdonkey.cn/hw.jpg",
“price”:4999.00
}POST /shopping/product/3
{
“title”:”小米电视”,“images”:”http://www.youngdonkey.cn/xmds.jpg",
“price”:5999.00
}
1.2 查看文档
发送请求
GET /shopping/product/indGaHEB1ahbZ0SRrXt3
响应结果
{
“_index” : “shopping”,
“_type” : “product”,
“_id” : “indGaHEB1ahbZ0SRrXt3“,
“_version” : 1,
“_seq_no” : 0,
“_primary_term” : 1,
“found” : true,
“_source” : {
“title” : “小米手机”,
“images” : “http://www.youngdonkey.cn/xm.jpg“,
“price” : 3999.0
}
}响应结果解释
{
“_index【索引库】” : “shopping”,
“_type【类型】” : “product”,
“_id【主键id】” : “indGaHEB1ahbZ0SRrXt3”,
“_version【版本】” : 1,
“_seq_no” : 0,
“_primary_term” : 1,
“found【查询结果】” : true,
“_source【源文档信息】” : {
“title” : “小米手机”,
“images” : “http://www.youngdonkey.cn/xm.jpg“,
“price” : 3999.0
}
}
- _source:源文档信息,所有的数据都在里面。
- _id:这条文档的唯一标示
- found:查询结果,返回true代表查到,false代表没有
1.3 自定义id新建文档
发送请求
POST /shopping/product/1
{
“title”:”小米手机”,
“images”:”http://www.youngdonkey.cn/xm.jpg",
“price”:3999.00
}
响应结果
- {
“_index” : “shopping”,
“_type” : “product”,
“_id”- “1”,
“_version” : 1,
“result” : “created”,
“_shards” : {
“total” : 2,
“successful” : 1,
“failed” : 0
},
“_seq_no” : 1,
“_primary_term” : 1
}主键id变为指定的id
1.4 修改文档(覆盖方式)
请求url不变,请求体变化,会将原有数据内容覆盖。
发送请求
POST /shopping/product/1
{
“title”:”华为手机”,
“images”:”http://www.youngdonkey.cn/hw.jpg",
“price”:4999.00
}
响应结果
{
“_index” : “shopping”,
“_type” : “product”,
“_id” : “1”,
“_version” : 2**,**
“result” : “updated”,
“_shards” : {
“total” : 2,
“successful” : 1,
“failed” : 0
},
“_seq_no” : 2,
“_primary_term” : 1
}可以看到result结果是:updated,使用GET /shopping/product/1查询,发现数据被更新。
1.5 根据id修改某一字段
发送请求
POST /shopping/product/1/_update
{
“doc”: {
“price”:3000.00
}
}
响应结果
{
“_index” : “shopping”,
“_type” : “product”,
“_id” : “1”,
“_version” : 2,
“result” : “updated”,
“_shards” : {
“total” : 2,
“successful” : 1,
“failed” : 0
},
“_seq_no” : 8,
“_primary_term” : 1
}
1.6 删除一条文档
删除一个文档不会立即从磁盘上移除,它只是被标记成已删除(逻辑删除)。
Elasticsearch会在段合并时(磁盘碎片整理)进行删除内容的清理。
发送请求
DELETE /shopping/product/JjauJ3UBlTmhEoyGRo1A
响应结果
{
“_index” : “shopping”,
“_type” : “product”,
“_id” : “JjauJ3UBlTmhEoyGRo1A”,
“_version” : 2,
“result” : “deleted”,
“_shards” : {
“total” : 2,
“successful” : 1,
“failed” : 0
},
“_seq_no” : 7,
“_primary_term” : 5
}可以看到result结果是:deleted,数据被删除。如果删除不存在的文档,result:not_found
{
“_index” : “shopping”,
“_type” : “product”,
“_id” : “11”,
“_version” : 1,
“result” : “not_found”,
“_shards” : {
“total” : 2,
“successful” : 1,
“failed” : 0
},
“_seq_no” : 0,
“_primary_term” : 1
}
1.7 根据条件 删除文档
发送请求
POST /shopping/product/_delete_by_query
{
“query”:{
“match”:{
“title”:”手机”
}
}
}响应结果
{
“took” : 23,
“timed_out” : false,
“total” : 4,
“deleted” : 4,
“batches” : 1,
“version_conflicts” : 0,
“noops” : 0,
“retries” : {
“bulk” : 0,
“search” : 0
},
“throttled_millis” : 0,
“requests_per_second” : -1.0,
“throttled_until_millis” : 0,
“failures” : [ ]
}响应结果解释
{
“took【耗时】” : 23,
“timed_out【是否超时】” : false,
“total【总数】” : 4,
“deleted【删除总数】” : 4,
“batches” : 1,
“version_conflicts” : 0,
“noops” : 0,
“retries” : {
“bulk” : 0,
“search” : 0
},
“throttled_millis” : 0,
“requests_per_second” : -1.0,
“throttled_until_millis” : 0,
“failures” : [ ]
}
2.请求体查询 【基本查询】
2.1 请求体查询
Elasticsearch基于JSON提供完整的查询DSL来定义查询。
DSL(Domain Specific Language):领域特定语言
2.2 基础数据
POST /shopping/product/1
{
“title”:”小米手机”,
“images”:”http://www.youngdonkey.cn/xm.jpg",
“price”:3999.00
}
POST /shopping/product/2
{
“title”:”华为手机”,
“images”:”http://www.youngdonkey.cn/hw.jpg",
“price”:4999.00
}
POST /shopping/product/3
{
“title”:”小米电视”,
“images”:”http://www.youngdonkey.cn/xmds.jpg",
“price”:5999.00
}
2.3 基本查询
2.3.1 查询所有(match_all)
发送请求:
GET /shopping/_search
{
“query”: {
“match_all”: {}
}
}响应结果
{
“took” : 0,
“timed_out” : false,
“_shards” : {
“total” : 5,
“successful” : 5,
“skipped” : 0,
“failed” : 0
},
“hits” : {
“total” : 3,
“max_score” : 1.0,
“hits” : [
{
“_index” : “shopping”,
“_type” : “product”,
“_id” : “2”,
“_score” : 1.0,
“_source” : {
“title” : “华为手机”,
“images” : “http://www.youngdonkey.cn/hw.jpg",
“price” : 4999.0
}
},
{
“_index” : “shopping”,
“_type” : “product”,
“_id” : “1”,
“_score” : 1.0,
“_source” : {
“title” : “小米手机”,
“images” : “http://www.youngdonkey.cn/xm.jpg",
“price” : 3999.0
}
},
{
“_index” : “shopping”,
“_type” : “product”,
“_id” : “3”,
“_score” : 1.0,
“_source” : {
“title” : “小米电视”,
“images” : “http://www.youngdonkey.cn/xmds.jpg",
“price” : 5999.0
}
}
]
}
}请求解释
GET /{索引库}/_search
{
“query”:{
“查询类型”:{
“查询条件”:”查询条件值”
}
}
}
“query”:这里的query代表一个查询对象,里面可以有不同的查询属性
“查询类型”:例如:match_all(代表查询所有), match,term , range 等等
“查询条件”:查询条件会根据类型的不同,写法也有差异
响应结果解释
{
“took【查询花费时间,单位毫秒】” : 1,
“timed_out【是否超时】” : false,
“_shards【分片信息】” : {
“total【总数】” : 5,
“successful【成功】” : 5,
“skipped【忽略】” : 0,
“failed【失败】” : 0
},
“hits【搜索命中结果】” : {
“total【命中总数】” : 3,
“max_score【所有查询结果中,文档的最高得分】” : 1.0,
“hits【命中结果集合】” : [
{
“_index” :
“shopping”,
“_type” :
“product”,
“_id” : “2”,
“_score” : 1.0,
“_source” : {
“title” : “华为手机”,
“images” : “http://www.youngdonkey.cn/hw.jpg“,
“price” : 4999.0
}
},
。。。
}
]
}
}
2.3.2 匹配查询(match)
match类型查询,会把查询条件进行分词,然后进行查询,多个词条之间是or的关系
发送请求
GET /shopping/_search
{
“query”: {
“match”: {
“title”: “小米手机”
}
}
}
响应结果
{
“took” : 2,
“timed_out” : false,
“_shards” : {
“total” : 5,
“successful” : 5,
“skipped” : 0,
“failed” : 0
},
“hits” : {
“total” : 3,
“max_score” : 0.5753642,
“hits” : [
{
“_index” :
“shopping”,
“_type” :
“product”,
“_id” : “1”,
“_score” : 0.5753642,
“_source” : {
“title” : “小米手机”,
“images” : “http://www.youngdonkey.cn/xm.jpg“,
“price” : 3999.0
}
},
{
“_index” :
“shopping”,
“_type” :
“product”,
“_id” : “2”,
“_score” : 0.2876821,
“_source” : {
“title” : “华为手机”,
“images” : “http://www.youngdonkey.cn/hw.jpg“,
“price” : 4999.0
}
},
{
“_index” :
“shopping”,
“_type” :
“product”,
“_id” : “3”,
“_score” : 0.2876821,
“_source” : {
“title” : “小米电视”,
“images” : “http://www.youngdonkey.cn/xmds.jpg“,
“price” : 5999.0
}
}
]
}
}在上面的案例中,不仅会查询到电视,而且与小米相关的都会查询到。
某些情况下,我们需要更精确查找,我们希望这个关系变成and,可以这样做:
GET /shopping/_search
{
“query”: {
“match”: {
“title”: {
“query”: “小米手机”,
“operator”:
“and”
}
}
}
}响应结果
{
“took” : 11,
“timed_out” : false,
“_shards” : {
“total” : 5,
“successful” : 5,
“skipped” : 0,
“failed” : 0
},
“hits” : {
“total” : 1,
“max_score” : 0.5753642,
“hits” : [
{
“_index” : “shopping”,
“_type” : “product”,
“_id” : “1”,
“_score” : 0.5753642,
“_source” : {
“title” : “小米手机”,
“images” : “http://www.youngdonkey.cn/xm.jpg“,
“price” : 3999.0
}
}
]
}
}
2.3.3 多字段匹配查询(multi_match)
multi_match与match类似,不同的是它可以在多个字段中查询。
发送请求
GET /shopping/_search
{
“query”: {
“multi_match”: {
“query”: “小米”,
“fields”: [“title”,”subtitle”]
}
}
}响应结果
{
“took” : 2,
“timed_out” : false,
“_shards” : {
“total” : 5,
“successful” : 5,
“skipped” : 0,
“failed” : 0
},
“hits” : {
“total” : 2,
“max_score” : 0.2876821,
“hits” : [
{
“_index” : “shopping”,
“_type” : “product”,
“_id” : “1”,
“_score” : 0.2876821,
“_source” : {
“title” : “小米手机”,
“images” : “http://www.youngdonkey.cn/xm.jpg",
“price” : 3999.0
}
},
{
“_index” : “shopping”,
“_type” : “product”,
“_id” : “3”,
“_score” : 0.2876821,
“_source” : {
“title” : “小米电视”,
“images” : “http://www.youngdonkey.cn/xmds.jpg",
“price” : 5999.0
}
}
]
}
}2.3.4 关键词 精准查询(term)
term查询,精确的关键词匹配查询,不对查询条件进行分词。
发送请求
GET /shopping/_search
{
“query”: {
“term”: {
“title”: {
“value”: “小米”
}
}
}
}响应结果
{
“took” : 0,
“timed_out” : false,
“_shards” : {
“total” : 5,
“successful” : 5,
“skipped” : 0,
“failed” : 0
},
“hits” : {
“total” : 2,
“max_score” : 0.2876821,
“hits” : [
{
“_index” : “shopping”,
“_type” : “product”,
“_id” : “1”,
“_score” : 0.2876821,
“_source” : {
“title” : “小米手机”,
“images” : “http://www.youngdonkey.cn/xm.jpg",
“price” : 3999.0
}
},
{
“_index” : “shopping”,
“_type” : “product”,
“_id” : “3”,
“_score” : 0.2876821,
“_source” : {
“title” : “小米电视”,
“images” : “http://www.youngdonkey.cn/xmds.jpg",
“price” : 5999.0
}
}
]
}
}
2.3.5 多关键词 准确查询(terms)
terms 查询和 term 查询一样,但它允许你指定多值进行匹配。
如果这个字段包含了指定值中的任何一个值,那么这个文档满足条件,类似于mysql的 in
发送请求
GET /shopping/_search
{
“query”: {
“terms”: {
“price”: [
“3999”,
“5999”
]
}
}
}响应结果
{
“took” : 3,
“timed_out” : false,
“_shards” : {
“total” : 5,
“successful” : 5,
“skipped” : 0,
“failed” : 0
},
“hits” : {
“total” : 2,
“max_score” : 1.0,
“hits” : [
{
“_index” : “shopping”,
“_type” : “product”,
“_id” : “1”,
“_score” : 1.0,
“_source” : {
“title” : “小米手机”,
“images” : “http://www.youngdonkey.cn/xm.jpg",
“price” : 3999.0
}
},
{
“_index” : “shopping”,
“_type” : “product”,
“_id” : “3”,
“_score” : 1.0,
“_source” : {
“title” : “小米电视”,
“images” : “http://www.youngdonkey.cn/xmds.jpg",
“price” : 5999.0
}
}
]
}
}
3 请求体查询 【结果过滤】
3.1 指定查询字段
默认情况下,ElasticSearch在搜索的结果中,会把文档中保存在_source的所有字段都返回。
如果我们只想获取其中的部分字段,我们可以添加_source的过滤
发送请求
GET /shopping/_search
{
“_source”: [“title”,”price”],
“query”: {
“terms”: {
“price”: [
“3999”
]
}
}
}响应结果
{
“took” : 1,
“timed_out” : false,
“_shards” : {
“total” : 5,
“successful” : 5,
“skipped” : 0,
“failed” : 0
},
“hits” : {
“total” : 1,
“max_score” : 1.0,
“hits” : [
{
“_index” : “shopping”,
“_type” : “product”,
“_id” : “1”,
“_score” : 1.0,
“_source” : {
“price” : 3999.0,
“title” : “小米手机”
}
}
]
}
}
3.2 过滤 指定 字段 includes 和 excludes
也可以通过
- includes:指定 想要显示的 字段
- excludes:指定 想要排除的 字段
二者是可选的
发送请求
GET /shopping/_search
{
“_source”: {“includes”:[“title”,”price”]},
“query”: {
“terms”: {
“price”: [
“3999”
]
}
}
}响应结果
{
“took” : 1,
“timed_out” : false,
“_shards” : {
“total” : 5,
“successful” : 5,
“skipped” : 0,
“failed” : 0
},
“hits” : {
“total” : 1,
“max_score” : 1.0,
“hits” : [
{
“_index” : “shopping”,
“_type” : “product”,
“_id” : “1”,
“_score” : 1.0,
“_source” : {
“price” : 3999.0,
“title” : “小米手机”
}
}
]
}
}