ElasticSearch的客户端操作

ElasticSearch的客户端操作

1、客户端介绍

官方文档地址: https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html 
实际开发中,有多种方式操作Elasticsearch:
客户端工具:发送http请求(RESTful风格)操作:9200端口
使用Postman发送请求直接操作
使用ElasticSearch-head-master图形化界面插件操作
使用Elastic官方数据可视化的平台Kibana进行操作【推荐】
Java代码操作:9300端口
Elasticsearch提供的Java API 客户端进行操作
Spring Data ElasticSearch 持久层框架进行操作
官网支持的客户端访问方式:
https://www.elastic.co/guide/en/elasticsearch/client/index.html

在这里插入图片描述

2、索引库操作

使用Kibana进行以下实验,进行Restful接口访问
索引库操作,完成对索引的增、删、查操作

1. 创建索引库(index)

发送请求:
# 在kibana中,不用写地址和端口,/shopping是简化写法,真实请求地址是:http://127.0.0.1:9200/shopping
# 请求方法:PUT
PUT /shopping
响应结果:
#! Deprecation: the default number of shards will change from [5] to [1] in 7.0.0; if you wish to continue using the default of [5] shards, you must manage this on the create index request or with an index template
{"acknowledged" : true,"shards_acknowledged" : true,"index" : "shopping"
}

“acknowledged” : true, 代表操作成功
“shards_acknowledged” : true, 代表分片操作成功
“index” : “shopping” 表示创建的索引库名称
注意:创建索引库的分片数默认5片,在7.0.0之后的ElasticSearch版本中,默认1片;

重复添加:报错,已经存在
在这里插入图片描述

2. 查看所有索引(index)

发送请求:

# 请求方法:GET
GET /_cat/indices?v

响应结果:
在这里插入图片描述

表头的含义(查看帮助信息:GET /_cat/indices?help)
health 当前服务器健康状态:
green(集群完整) yellow(单点正常、集群不完整) red(单点不正常)
status 索引打开、关闭状态
index 索引名
uuid 索引统一编号
pri 主分片数量
rep 副分片数量
docs.count 可用文档数量
docs.deleted 文档删除状态(逻辑删除,段合并时被清理)
store.size 主分片和副分片整体占空间大小
pri.store.size 主分片占空间大小

3. 查看某个索引(index)

发送请求:

# 请求方法:GET
GET /shopping
响应结果:
{"shopping" : {"aliases" : { },"mappings" : { },"settings" : {"index" : {"creation_date" : "1586587411462","number_of_shards" : "5","number_of_replicas" : "1","uuid" : "VCl1hHsJQDe2p2dn46o0NA","version" : {"created" : "6080199"},"provided_name" : "shopping"}}}
}
内容解释:
{"shopping【索引库名】" : {"aliases【别名】" : { },"mappings【映射】" : { },"settings"【索引库设置】 : {"index【索引】" : {"creation_date【创建时间】" : "1586587411462","number_of_shards【索引库分片数】" : "5","number_of_replicas【索引库副本数】" : "1","uuid【唯一标识】" : "VCl1hHsJQDe2p2dn46o0NA","version【版本】" : {"created" : "6080199"},"provided_name【索引库名称】" : "shopping"}}}
}

4. 删除索引(index)

发送请求:

# 请求方法:DELETE
DELETE /shopping
响应结果:
{"acknowledged" : true
}

3、类型及映射操作

类型(type)及(mapping)操作

1. 创建类型映射

有了索引库,等于有了数据库中的database。
接下来就需要建索引库(index)中的类型(type)了,类似于数据库(database)中的表(table)。创建数据库表需要设置字段名称,类型,长度,约束等;索引库也一样,在创建索引库的类型时,需要知道这个类型下有哪些字段,每个字段有哪些约束信息,这就叫做映射(mapping)。
给shopping这个索引库添加了一个名为product的类型,并且在类型中设置了4个字段:
title:商品标题
subtitle: 商品子标题
images:商品图片
price:商品价格

发送请求:
# 请求方法:PUT
PUT /shopping/product/_mapping
{"properties": {"title":{"type": "text","analyzer": "ik_max_word"},"subtitle":{"type": "text","analyzer": "ik_max_word"},"images":{"type": "keyword","index": false},"price":{"type": "float","index": true}}
}	PUT /索引库名/_mapping/类型名称 或 索引库名/类型名称/_mapping
{"properties": {"字段名称":{"type【类型】": "类型","index【是否索引】": true,"store【是否存储】": false,"analyzer【分词器】": "具体分词器"}...}
}响应结果:
#! Deprecation: [types removal] Specifying types in put mapping requests is deprecated. To be compatible with 7.0, the mapping definition should not be nested under the type name, and the parameter include_type_name must be provided and set to false.
{"acknowledged" : true
}

说明:
#! 弃用:[类型删除]不建议在放置映射请求中指定类型。 为了与7.0兼容,映射定义不应嵌套在类型名称下,并且必须提供参数include_type_name并将其设置为false。

类型名称:就是前面将的type的概念,类似于数据库中的表 
字段名:任意填写,下面指定许多属性,例如:title、subtitle、images、price

type:类型,Elasticsearch中支持的数据类型非常丰富,说几个关键的:
①String类型,又分两种:
text:可分词
keyword:不可分词,数据会作为完整字段进行匹配
②Numerical:数值类型,分两类
基本数据类型:long、interger、short、byte、double、float、half_float
浮点数的高精度类型:scaled_float
③Date:日期类型
④Array:数组类型
⑤Object:对象
index:是否索引,默认为true,也就是说你不进行任何配置,所有字段都会被索引。
true:字段会被索引,则可以用来进行搜索
false:字段不会被索引,不能用来搜索
store:是否将数据进行独立存储,默认为false
原始的文本会存储在_source里面,默认情况下其他提取出来的字段都不是独立存储的,是从_source里面提取出来的。当然你也可以独立的存储某个字段,只要设置"store": true即可,获取独立存储的字段要比从_source中解析快得多,但是也会占用更多的空间,所以要根据实际业务需求来设置。
analyzer:分词器,这里的ik_max_word即使用ik分词器

2. 查看类型映射

发送请求:
# 请求方法:GET
GET /shopping/product/_mapping
响应结果:
{"shopping" : {"mappings" : {"product" : {"properties" : {"images" : {"type" : "keyword","index" : false},"price" : {"type" : "float"},"subtitle" : {"type" : "text","analyzer" : "ik_max_word"},"title" : {"type" : "text","analyzer" : "ik_max_word"}}}}}
}
3.	创建索引库同时进行映射配置(常用)
发送请求:
# 请求方法:PUT
PUT /shopping2
{"settings": {},"mappings": {"product":{"properties": {"title":{"type": "text","analyzer": "ik_max_word"},"subtitle":{"type": "text","analyzer": "ik_max_word"},"images":{"type": "keyword","index": false},"price":{"type": "float","index": true}}}}
}
响应结果:
{"acknowledged" : true,"shards_acknowledged" : true,"index" : "shopping2"
}

4、【文档操作】【基本CURD操作】

1. 新建文档

发送请求:
# 请求方法:POST
POST /shopping/product
{"title":"小米手机","images":"http://www.gulixueyuan.com/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.gulixueyuan.com/hw.jpg","price":4999.00
}POST /shopping/product/3
{"title":"小米电视","images":"http://www.gulixueyuan.com/xmds.jpg","price":5999.00
}

2. 查看文档

发送请求:
# 请求方法:GET
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.gulixueyuan.com/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.gulixueyuan.com/xm.jpg","price" : 3999.0}
}

• _source:源文档信息,所有的数据都在里面。
• _id:这条文档的唯一标示
• found:查询结果,返回true代表查到,false代表没有

3. 自定义id新建文档

发送请求:
# 请求方法:POST
POST /shopping/product/1
{"title":"小米手机","images":"http://www.gulixueyuan.com/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

4. 修改文档(覆盖方式)

请求url不变,请求体变化,会将原有数据内容覆盖。

发送请求:
# 请求方法:POST
POST /shopping/product/1
{"title":"华为手机","images":"http://www.gulixueyuan.com/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查询,发现数据被更新。

5. 根据id修改某一个字段

发送请求:
# 请求方法:POST
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
}

可以看到result结果是:updated,使用GET /shopping/product/1查询,发现数据被更新。

6. 删除一条文档

删除一个文档不会立即从磁盘上移除,它只是被标记成已删除(逻辑删除)。
Elasticsearch会在段合并时(磁盘碎片整理)进行删除内容的清理。
发送请求:

# 请求方法:DELETE
DELETE /shopping/product/1
响应结果:
{"_index" : "shopping","_type" : "product","_id" : "1","_version" : 3,"result" : "deleted","_shards" : {"total" : 2,"successful" : 1,"failed" : 0},"_seq_no" : 3,"_primary_term" : 1
}

可以看到result结果是:deleted,数据被删除。如果删除不存在的文档,result:not_found
例如:

DELETE /shopping/product/11主键不存在
{"_index" : "shopping","_type" : "product","_id" : "11","_version" : 1,"result" : "not_found","_shards" : {"total" : 2,"successful" : 1,"failed" : 0},"_seq_no" : 0,"_primary_term" : 1
}

7. 根据条件删除文档

发送请求:
# 请求方法:DELETE
POST /shopping/_delete_by_query
{"query":{"match":{"title":"手机"}}
}
响应结果:
{"took" : 33,"timed_out" : false,"total" : 2,"deleted" : 2,"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【耗时】" : 33,"timed_out【是否超时】" : false,"total【总数】" : 2,"deleted【删除总数】" : 2,"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" : [ ]
}

5、【请求体查询】【基本查询】

1. 请求体查询
Elasticsearch基于JSON提供完整的查询DSL来定义查询。
DSL(Domain Specific Language):领域特定语言
在这里插入图片描述

2. 基础数据

POST /shopping/product/1
{"title":"小米手机","images":"http://www.gulixueyuan.com/xm.jpg","price":3999.00
}POST /shopping/product/2
{"title":"华为手机","images":"http://www.gulixueyuan.com/hw.jpg","price":4999.00
}POST /shopping/product/3
{"title":"小米电视","images":"http://www.gulixueyuan.com/xmds.jpg","price":5999.00
}

3. 基本查询

1) 查询所有(match_all)

发送请求:
# 请求方法:GET
#请求地址:http://127.0.0.1:9200/索引库名/_search
GET /shopping/_search
{"query": {"match_all": {}}
}
请求解释:
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.gulixueyuan.com/hw.jpg","price" : 4999.0}},{"_index" : "shopping","_type" : "product","_id" : "1","_score" : 1.0,"_source" : {"title" : "小米手机","images" : "http://www.gulixueyuan.com/xm.jpg","price" : 3999.0}},{"_index" : "shopping","_type" : "product","_id" : "3","_score" : 1.0,"_source" : {"title" : "小米电视","images" : "http://www.gulixueyuan.com/xmds.jpg","price" : 5999.0}}]}
}
响应结果解释:
{"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.gulixueyuan.com/hw.jpg","price" : 4999.0}},。。。}]}
}

2) 匹配查询(match)
match类型查询,会把查询条件进行分词,然后进行查询,多个词条之间是or的关系

发送请求:
# 请求方法:GET
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.gulixueyuan.com/xm.jpg","price" : 3999.0}},{"_index" : "shopping","_type" : "product","_id" : "2","_score" : 0.2876821,"_source" : {"title" : "华为手机","images" : "http://www.gulixueyuan.com/hw.jpg","price" : 4999.0}},{"_index" : "shopping","_type" : "product","_id" : "3","_score" : 0.2876821,"_source" : {"title" : "小米电视","images" : "http://www.gulixueyuan.com/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.gulixueyuan.com/xm.jpg","price" : 3999.0}}]}
}

3) 多字段匹配查询(multi_match)
multi_match与match类似,不同的是它可以在多个字段中查询。

发送请求:
# 请求方法:GET
#fields属性:设置查询的多个字段名称
GET /shopping/_search
{"query": {"multi_match": {"query": "小米","fields": ["title","subtitle"]}}
}
响应结果:
{"took" : 1,"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.gulixueyuan.com/xm.jpg","price" : 3999.0}},{"_index" : "shopping","_type" : "product","_id" : "3","_score" : 0.2876821,"_source" : {"title" : "小米电视","images" : "http://www.gulixueyuan.com/xmds.jpg","price" : 5999.0}}]}
}

4) 关键词精确查询(term)
term查询,精确的关键词匹配查询,不对查询条件进行分词。

发送请求:
# 请求方法:GET
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.gulixueyuan.com/xm.jpg","price" : 3999.0}},{"_index" : "shopping","_type" : "product","_id" : "3","_score" : 0.2876821,"_source" : {"title" : "小米电视","images" : "http://www.gulixueyuan.com/xmds.jpg","price" : 5999.0}}]}
}

5) 多关键词精确查询(terms)
terms 查询和 term 查询一样,但它允许你指定多值进行匹配。
如果这个字段包含了指定值中的任何一个值,那么这个文档满足条件,类似于mysql的in

发送请求:
# 请求方法:GET
GET /shopping/_search
{"query": {"terms": {"price": [3999,5999]}}
}
响应结果:
{"took" : 0,"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.gulixueyuan.com/xm.jpg","price" : 3999.0}},{"_index" : "shopping","_type" : "product","_id" : "3","_score" : 1.0,"_source" : {"title" : "小米电视","images" : "http://www.gulixueyuan.com/xmds.jpg","price" : 5999.0}}]}
}

6、【请求体查询】【结果过滤】

1. 指定查询字段
默认情况下,ElasticSearch在搜索的结果中,会把文档中保存在_source的所有字段都返回。
如果我们只想获取其中的部分字段,我们可以添加_source的过滤

发送请求:
# 请求方法:GET
GET /shopping/_search
{"_source": ["title","price"],  "query": {"terms": {"price": [3999]}}
}
响应结果:
{"took" : 0,"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" : "小米手机"}}]}
}

2. 过滤指定字段:includes和excludes
我们也可以通过:
 includes:来指定想要显示的字段
 excludes:来指定不想要显示的字段
二者都是可选的。

发送请求:
# 请求方法:GET
GET /shopping/_search
{"_source": {"includes": ["title","price"]},  "query": {"terms": {"price": [3999]}}
}GET /shopping/_search
{"_source": {"excludes": ["images"]},  "query": {"terms": {"price": [3999]}}
}
响应结果:
{"took" : 0,"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" : "小米手机"}}]}
}

7、【请求体查询】【高级查询】

1. 布尔组合(bool)
bool把各种其它查询通过must(必须 )、must_not(必须不)、should(应该)的方式进行组合

发送请求:
# 请求方法:GET
GET /shopping/_search
{"query": {"bool": {"must": [{"match": {"title": "小米"}}],"must_not": [{"match": {"title": "电视"}}],"should": [{"match": {"title": "手机"}}]}}
}
响应结果:
{"took" : 2,"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.gulixueyuan.com/xm.jpg","price" : 3999.0}}]}
}

2. 范围查询(range)
range 查询找出那些落在指定区间内的数字或者时间。range查询允许以下字符:
操作符 说明
gt == (greater than) 大于>
gte == (greater than equal) 大于等于>=
lt == (less than) 小于<
lte == (less than equal) 小于等于<=

发送请求:
# 请求方法:GET
GET /shopping/_search
{"query": {"range": {"price": {"gte": 2500,"lte": 4000}}}
}
响应结果:
{"took" : 0,"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" : {"title" : "小米手机","images" : "http://www.gulixueyuan.com/xm.jpg","price" : 3999.0}}]}
}

3. 模糊查询(fuzzy)
返回包含与搜索字词相似的字词的文档。
编辑距离是将一个术语转换为另一个术语所需的一个字符更改的次数。这些更改可以包括:
更改字符(box → fox)
删除字符(black → lack)
插入字符(sic → sick)
转置两个相邻字符(act → cat)
为了找到相似的术语,fuzzy查询会在指定的编辑距离内创建一组搜索词的所有可能的变体或扩展。然后查询返回每个扩展的完全匹配。
通过fuzziness修改编辑距离。一般使用默认值AUTO,根据术语的长度生成编辑距离。
0…2
必须完全匹配
3…5
允许一次编辑

5
允许进行两次编辑

POST /shopping/product/4
{"title":"apple手机","images":"http://www.gulixueyuan.com/apple.jpg","price":5999.00
}POST /shopping/product/5
{"title":"apple","images":"http://www.gulixueyuan.com/apple.jpg","price":4999.00
}
发送请求:
# 请求方法:GET
GET /shopping/_search
{"query": {"fuzzy": {"title": {"value": "ccple"}}}
}	GET /shopping/_search
{"query": {"fuzzy": {"title": {"value": "ccple","fuzziness": 2}}}
}响应结果:
{"took" : 0,"timed_out" : false,"_shards" : {"total" : 5,"successful" : 5,"skipped" : 0,"failed" : 0},"hits" : {"total" : 0,"max_score" : null,"hits" : [ ]}
}	{"took" : 1,"timed_out" : false,"_shards" : {"total" : 5,"successful" : 5,"skipped" : 0,"failed" : 0},"hits" : {"total" : 2,"max_score" : 0.41588834,"hits" : [{"_index" : "shopping","_type" : "product","_id" : "4","_score" : 0.41588834,"_source" : {"title" : "apple手机","images" : "http://www.gulixueyuan.com/apple.jpg","price" : 5999.0}},{"_index" : "shopping","_type" : "product","_id" : "5","_score" : 0.17260925,"_source" : {"title" : "apple","images" : "http://www.gulixueyuan.com/apple.jpg","price" : 4999.0}}]}
}

8、【请求体查询】【查询排序】

1. 单字段排序
sort 可以让我们按照不同的字段进行排序,并且通过order指定排序的方式。desc降序,asc升序。

发送请求:
# 请求方法:GET
GET /shopping/_search
{"query": {"match_all": {}},"sort": [{"price": {"order": "desc"}}]
}
响应结果:
{"took" : 4,"timed_out" : false,"_shards" : {"total" : 5,"successful" : 5,"skipped" : 0,"failed" : 0},"hits" : {"total" : 5,"max_score" : null,"hits" : [{"_index" : "shopping","_type" : "product","_id" : "4","_score" : null,"_source" : {"title" : "apple手机","images" : "http://www.gulixueyuan.com/apple.jpg","price" : 5999.0},"sort" : [5999.0]},{"_index" : "shopping","_type" : "product","_id" : "3","_score" : null,"_source" : {"title" : "小米电视","images" : "http://www.gulixueyuan.com/xmds.jpg","price" : 5999.0},"sort" : [5999.0]},{"_index" : "shopping","_type" : "product","_id" : "5","_score" : null,"_source" : {"title" : "apple","images" : "http://www.gulixueyuan.com/apple.jpg","price" : 4999.0},"sort" : [4999.0]},{"_index" : "shopping","_type" : "product","_id" : "2","_score" : null,"_source" : {"title" : "华为手机","images" : "http://www.gulixueyuan.com/hw.jpg","price" : 4999.0},"sort" : [4999.0]},{"_index" : "shopping","_type" : "product","_id" : "1","_score" : null,"_source" : {"title" : "小米手机","images" : "http://www.gulixueyuan.com/xm.jpg","price" : 3999.0},"sort" : [3999.0]}]}
}

2. 多字段排序
假定我们想要结合使用 price和 _score(得分) 进行查询,并且匹配的结果首先按照价格排序,然后按照相关性得分排序:

发送请求:
# 请求方法:GET
GET /shopping/_search
{"query": {"match_all": {}},"sort": [{"price": {"order": "desc"}},{"_score":{"order": "desc"}}]
}
响应结果:
{"took" : 0,"timed_out" : false,"_shards" : {"total" : 5,"successful" : 5,"skipped" : 0,"failed" : 0},"hits" : {"total" : 5,"max_score" : null,"hits" : [{"_index" : "shopping","_type" : "product","_id" : "4","_score" : 1.0,"_source" : {"title" : "apple手机","images" : "http://www.gulixueyuan.com/apple.jpg","price" : 5999.0},"sort" : [5999.0,1.0]},{"_index" : "shopping","_type" : "product","_id" : "3","_score" : 1.0,"_source" : {"title" : "小米电视","images" : "http://www.gulixueyuan.com/xmds.jpg","price" : 5999.0},"sort" : [5999.0,1.0]},{"_index" : "shopping","_type" : "product","_id" : "5","_score" : 1.0,"_source" : {"title" : "apple","images" : "http://www.gulixueyuan.com/apple.jpg","price" : 4999.0},"sort" : [4999.0,1.0]},{"_index" : "shopping","_type" : "product","_id" : "2","_score" : 1.0,"_source" : {"title" : "华为手机","images" : "http://www.gulixueyuan.com/hw.jpg","price" : 4999.0},"sort" : [4999.0,1.0]},{"_index" : "shopping","_type" : "product","_id" : "1","_score" : 1.0,"_source" : {"title" : "小米手机","images" : "http://www.gulixueyuan.com/xm.jpg","price" : 3999.0},"sort" : [3999.0,1.0]}]}
}

9、【请求体查询】【高亮查询】

在进行关键字搜索时,搜索出的内容中的关键字会显示不同的颜色,称之为高亮。
在百度搜索"京东"
在这里插入图片描述

在京东网站搜索“小米”

在这里插入图片描述

高亮显示的html分析
通过开发者工具查看高亮数据的html代码实现:

在这里插入图片描述

高亮查询请求

ElasticSearch可以对查询内容中的关键字部分,进行标签和样式(高亮)的设置。
在使用match查询的同时,加上一个highlight属性:
pre_tags:前置标签
post_tags:后置标签
fields:需要高亮的字段
title:这里声明title字段需要高亮,后面可以为这个字段设置特有配置,也可以空

发送请求:
# 请求方法:GET
GET /shopping/_search
{"query": {"match": {"title": "华为"}},"highlight": {"pre_tags": "<font color='red'>","post_tags": "</font>","fields": {"title": {}}}
}
响应结果:
{"took" : 1,"timed_out" : false,"_shards" : {"total" : 5,"successful" : 5,"skipped" : 0,"failed" : 0},"hits" : {"total" : 1,"max_score" : 0.6931472,"hits" : [{"_index" : "shopping","_type" : "product","_id" : "2","_score" : 0.6931472,"_source" : {"title" : "华为手机","images" : "http://www.gulixueyuan.com/hw.jpg","price" : 4999.0},"highlight" : {"title" : ["<font color='red'>华为</font>手机"]}}]}
}

10、【请求体查询】【分页查询】

from:当前页的起始索引,默认从0开始。 from = (pageNum - 1) * size
size:每页显示多少条 
发送请求:
# 请求方法:GET
GET /shopping/_search
{"query": {"match_all": {}},"sort": [{"price": {"order": "desc"}},{"_score":{"order": "desc"}}],"from": 0,"size": 2
}响应结果:
{"took" : 0,"timed_out" : false,"_shards" : {"total" : 5,"successful" : 5,"skipped" : 0,"failed" : 0},"hits" : {"total" : 5,"max_score" : null,"hits" : [{"_index" : "shopping","_type" : "product","_id" : "4","_score" : 1.0,"_source" : {"title" : "apple手机","images" : "http://www.gulixueyuan.com/apple.jpg","price" : 5999.0},"sort" : [5999.0,1.0]},{"_index" : "shopping","_type" : "product","_id" : "3","_score" : 1.0,"_source" : {"title" : "小米电视","images" : "http://www.gulixueyuan.com/xmds.jpg","price" : 5999.0},"sort" : [5999.0,1.0]}]}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/95862.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nginx虚拟主机(server块)部署Vue项目

需求 配置虚拟主机&#xff0c;实现一个Nginx运行多个服务。 实现 使用Server块。不同的端口号&#xff0c;表示不同的服务&#xff1b;同时在配置中指定&#xff0c;Vue安装包所在的位置。 配置 Vue项目&#xff0c;放在 html/test 目录下。 config中的配置如下&#xf…

Docker 网络之 ipvlan 和 macvlan

Docker ipvlan 和 macvlan 引言 本文讲解了Docker 网络模式中的 ipvlan 和 macvlan 的区别,目前自己在生产环境中使用的 ipvlan 模式非常问题.也解决了实际业务问题. IPvlan L2 mode example ipvlan 无需网卡混杂模式 , 运行如下命令后可以生成一个 vlan 子接口 , 会和主网卡…

智慧园区,打造宜居未来之城

近年来&#xff0c;随着数字化和智能化的不断发展&#xff0c;智慧园区的概念正愈发受到关注。 智慧园区的定义十分广泛&#xff0c;它涵盖了城市规划、交通管理、环境保护、能源利用等多个领域。智慧园区以数字化、网络化、智能化为核心&#xff0c;旨在提升生活和工作的质量&…

【第三阶段】kotlin中使用带let的安全调用

let常常和&#xff1f;.配合使用&#xff0c;如果前面的对象为null,let不执行&#xff0c;能够执行到let里面 对象一定不为null 1.不为null fun main() {var name:String?"kotlin" //name是一个可空类型&#xff0c;发出广播&#xff0c;调用的地方必须补救措施var…

el-table 多个表格切换多选框显示bug

今天写了个功能&#xff0c;点击左侧的树做判断&#xff0c;一级树节点显示系统页面&#xff0c;二级树节点显示数据库页面&#xff0c;三级树节点显示表页面。 数据库页面和表页面分别有2个el-table ,上面的没有多选框&#xff0c;下面的有多选框 现在出现bug&#xff0c;在…

Kotlin~Bridge桥接模式

概念 抽象和现实之间搭建桥梁&#xff0c;分离实现和抽象。 抽象&#xff08;What&#xff09;实现&#xff08;How&#xff09;用户可见系统正常工作的底层代码产品付款方式定义数据类型的类。处理数据存储和检索的类 角色介绍 Abstraction&#xff1a;抽象 定义抽象接口&…

综述:计算机视觉中的图像分割

一、说明 这篇文章是关于图像分割的探索&#xff0c;这是解决计算机视觉问题&#xff08;如对象检测、对象识别、图像编辑、医学图像分析、自动驾驶汽车等&#xff09;的重要步骤之一。让我们从介绍开始。 二、图像分割介绍 图像分割是计算机视觉中的一项基本任务&#xff0c;涉…

内网隧道代理技术(十七)之 NPS的使用

NPS的介绍和使用 NPS介绍 nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发,可支持任何tcp、udp上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析等等……),此外还支持内网http代理、内网socks5代理、p2p等,…

自动驾驶技术:改变交通出行的未来

自动驾驶技术&#xff0c;这个让人充满期待的技术&#xff0c;正在改变我们的交通方式&#xff0c;带来一种全新的出行体验。它可以让汽车、无人机等交通工具像人类驾驶一样自主行驶&#xff0c;通过人工智能、视觉计算、雷达、监控装置和全球定位系统协同合作&#xff0c;实现…

支持M1 Syncovery for mac 文件备份同步工具

Syncovery for Mac 是一款功能强大、易于使用的文件备份和同步软件&#xff0c;适用于需要备份和同步数据的个人用户和企业用户。Syncovery 提供了一个直观的用户界面&#xff0c;使用户可以轻松设置备份和同步任务。用户可以选择备份的文件类型、备份目录、备份频率等&#xf…

模型评估的常用指标

模型评估的指标 模型是在大量的数据集上训练而来的,无论一个模型是从零训练的还是基于某一个模型,通过微调方法得到的,靠人工评价模型的效果都是异常困难的。那么要想客观的、自动化的评价一个LLM模型,就需要能够选择正确评估模型效果的指标或者基准测试,来客观和自动化的…

FANUC机器人加减速倍率指令ACC的使用方法说明

FANUC机器人加减速倍率指令ACC的使用方法说明 单位有一台FANUC机器人(型号:M-900iB 360kg),偶尔会在启动的瞬间会报SRVO-050碰撞检测报警,而事实上机器人并没有开始移动或和其他工件产生碰撞,一直查了很长时间,也没有查到具体的原因,也尝试过重新进行负载推算,但是偶尔…

【Java】对象数组排序(Comparable接口/Comparator接口)

Comparable接口&#xff08;compareTo&#xff09; Arrays 类中的 sort 方法承诺可以对对象数组进行排序&#xff0c;但要求满足下列前提&#xff1a;对象所属的类必须实现了 Comparable 接口&#xff0c;且定义了compareTo方法。 Comparable接口的代码 public interface Comp…

CW4L2-3A-S电源滤波器

CW4L2-3A-T CW4L2-6A-T CW4L2-10A-T CW4L2-20A-T CW4L2-3A-S CW4L2-6A-S CW4L2-10A-S CW4L2-20A-S 安装位置应靠近电源线入口处&#xff0c;尽可能滤除沿电源线侵入和窜出的电磁干扰。 确保滤波器外壳与设备机箱良好电接触&#xff0c;并接好地线。 滤波器的输入输出…

Axios使用CancelToken取消重复请求

处理重复请求&#xff1a;没有响应完成的请求&#xff0c;再去请求一个相同的请求&#xff0c;会把之前的请求取消掉 新增一个cancelRequest.js文件 import axios from "axios" const cancelTokens {}export const addPending (config) > {const requestKey …

分类预测 | MATLAB实现WOA-CNN-BiLSTM-Attention数据分类预测

分类预测 | MATLAB实现WOA-CNN-BiLSTM-Attention数据分类预测 目录 分类预测 | MATLAB实现WOA-CNN-BiLSTM-Attention数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现WOA-CNN-BiLSTM-Attention数据分类预测&#xff0c;运行环境Matlab2023b及以上…

8月16日上课内容 部署LVS-DR群集

本章结构&#xff1a; 数据包流向分析: 数据包流向分析&#xff1a; &#xff08;1&#xff09;客户端发送请求到 Director Server&#xff08;负载均衡器&#xff09;&#xff0c;请求的数据报文&#xff08;源 IP 是 CIP,目标 IP 是 VIP&#xff09;到达内核空间。 &#xf…

【LeetCode75】第三十三题 二叉树的最大深度

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 从这一题开始&#xff0c;LeetCode75进入到了二叉树章节。 这边建议不熟悉二叉树的小伙伴可以先去做做力扣的前序遍历&#xff0c;中序遍…

Dubbo Spring Boot Starter 开发微服务应用

环境要求 系统&#xff1a;Windows、Linux、MacOS JDK 8 及以上&#xff08;推荐使用 JDK17&#xff09; Git IntelliJ IDEA&#xff08;可选&#xff09; Docker &#xff08;可选&#xff09; 项目介绍 在本任务中&#xff0c;将分为 3 个子模块进行独立开发&#xff…

谷歌在Chrome浏览器中推进抗量子加密技术

近日&#xff0c;Chromium博客上发表的一篇博文称&#xff0c;为了加强网络安全&#xff0c;应对迫在眉睫的量子计算机威胁&#xff0c;谷歌各个团队密切合作&#xff0c;为网络向抗量子密码学的过渡做好准备。 谷歌的Chrome团队在博客中写道&#xff0c;该项目涉及修订技术标准…