分页查询是在查询体内设置查询的当前位置与每页显示条数:
{ "query":{ "match_all":{//全库查询 } }, "from": 0,//查询从当前位置开始 "size": 2 //每页显示2条数据 } |
|
{ "query":{//查询操作 "match_all":{//全库查询 } }, "from": 0,//查询起始位置 "size": 2,//每页显示条数 "_source":["title","kinds"] //指定显示的列 } |
|
3.8 查询排序
{ "query":{ "match_all":{ } }, "from": 0, "size": 3, "sort":{//排序 "price":{//排序列 "order":"desc"//排序方式 } } } |
- 全文检索
ES将存入的文档进行分词操作,然后将其存入到倒排索引中,检索是根据倒排索引内的关键字匹配文档。
如果在查询时,向完全匹配查询的结果,那么条件中的match关键字应换为match_phrase
4.1高亮显示的设置
如果想将查询结果中的某些列高亮显示,需要进行如下设置:
高亮结果设置: |
- 聚合操作
聚合操作使用aggs进行
分组操作请求正文: { "aggs": { //聚合操作 "price_group": { //名称,自定义 "term": { //分组 "field": "price" //分组字段 } } } } 以上方式会显示具体数据,如果不想显示具体数据可设置具体数据不显示 |
|
常见的聚合函数:
标识 | 名称 | 用途 |
terms | 分组 | 对查询数据进行分组操作 |
avg | 求平均值 | 对查询数据求平均值 |
sum | 求和 | 对查询数据进行求和处理 |
- 映射关系
映射关系,主要用于ES控制是否需要分词等属性设置。映射关系的设置,通过请求正文中的properties属性设置
映射关系设置: |
|
执行结果: mapping中设置的信息可以使用Get查看 |
|
标识 | 名称 | 用途 | 值介绍 | 示例 |
index | 表示是否能够被索引查询 | 设置是否能够作为查询条件查询 | true:能被索引查询 false:不能被索引查询 | 例如:如果设置了name不能被索引查询那么如果name作为查询条件,是不能够查询到数据的 |
type | 类型 | 如果某一列被设置了不能被分词,那么这一列如果作为查询条件时,需要全匹配 | text:文本,可以被分词 keywords:不能被分词 | 例如:name设置了不可分词,那么查询时,需要使用全的名称来进行查询。比如张三,如果不支持分词需要使用完整的“张三”查询,而“张”则不被支持 |
- JAVA与ES实现
添加依赖:
<dependencies> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>7.17.6</version> </dependency> <!-- elasticsearch客户端--> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.17.6</version> </dependency> <!-- elasticsearch依赖log4j--> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.17.2</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.17.2</version> </dependency> <!-- jackson-databind--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version> 2.13.3</version> </dependency> <!-- 单元测试--> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> <version>5.9.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.24</version> </dependency> </dependencies> |
7.1 连接ES
//创建elasticsearch客户端 RestHighLevelClient restHighLevelClient = new RestHighLevelClient( RestClient.builder( new HttpHost(URL,PORT,"http"))); //关闭连接客户端 restHighLevelClient.close(); |
7.2 indices() .create方法创建索引创建索引
封装连接
public class EsConn { private static final String URL="124.71.74.18"; private static final int PORT=9200; public static RestHighLevelClient getConnection(){ //创建elasticsearch客户端 RestHighLevelClient restHighLevelClient = new RestHighLevelClient( RestClient.builder( new HttpHost(URL,PORT,"http"))); return restHighLevelClient; } } |
以下所有示例均使用封装的工具类获取连接对象
使用indices() .create创建索引 |
RestHighLevelClient connection = EsConn.getConnection();//获取连接对象 //获取创建索引请求对象 CreateIndexRequest indexRequest = new CreateIndexRequest("sys_user");//创建一个创建索引请求对象 CreateIndexResponse response = connection .indices() .create(indexRequest, RequestOptions.DEFAULT);//创建索引,RequestOptions为默认选项 boolean acknowledged = response.isAcknowledged();//响应状态,创建成功会返回true //关闭连接客户端 restHighLevelClient.close(); |
7.3 indices().delete方法删除索引
使用indices().delete方法删除索引 |
RestHighLevelClient connection = EsConn.getConnection(); //创建请求对象 DeleteIndexRequest sys_user = new DeleteIndexRequest("sys_user"); // AcknowledgedResponse delete = connection.indices().delete(sys_user, RequestOptions.DEFAULT); boolean acknowledged = delete.isAcknowledged();//获取响应结果,删除成功返回true //关闭连接客户端 restHighLevelClient.close(); |
7.4 indices().get方法查询索引
使用indices()对象的get方法获取索引 |
RestHighLevelClient connection = EsConn.getConnection(); //创建一个获取索引的对象 GetIndexRequest getIndexRequest = new GetIndexRequest("user"); GetIndexResponse response = connection .indices() .get(getIndexRequest, RequestOptions.DEFAULT); System.out.println(response.getAliases());//别名操作 System.out.println(response.getDataStreams()); System.out.println(response.getIndices()); System.out.println(response.getDefaultSettings()); System.out.println(response.getMappings()); System.out.println(response.getSettings()); connection.close(); |
7.5 index方法新增数据
使用连接对象的index方法插入数据 |
ObjectMapper objectMapper = new ObjectMapper(); RestHighLevelClient connection = EsConn.getConnection(); IndexRequest indexRequest = new IndexRequest("sys_user"); // 设置id indexRequest.id("10001"); User user = new User(); user.setName("张三"); user.setSex(true); user.setAge(18); user.setTel("120"); //向Es中以JSON格式存储 String userJson = objectMapper.writeValueAsString(user);//将对象转换为json字符串 IndexRequest source = indexRequest.source(userJson, XContentType.JSON); IndexResponse response = connection.index(indexRequest, RequestOptions.DEFAULT); //写入ES结果 System.out.println(response.getResult());//获取ES的状态CREATED 创建成功,UPDATED 更新,DELETED 删除 System.out.println(response.getId());//获取数据id System.out.println(response.getShardId());//获取分片id System.out.println(response.getShardInfo());//获取分片信息 System.out.println(response.getIndex()); System.out.println(response.getVersion()); System.out.println(response.getSeqNo()); System.out.println(response.getType()); System.out.println(response.getPrimaryTerm()); |
7.6 update方法修改数据
使用连接对象的update方法修改 |
RestHighLevelClient connection = EsConn.getConnection(); //获取索引 UpdateRequest updateRequest = new UpdateRequest();//创建更新索引请求对象 UpdateRequest userIndex = updateRequest.index("sys_user");//设置索引 userIndex.id("10001"); updateRequest.doc(XContentType.JSON, "age", 20); UpdateResponse response = connection.update(updateRequest, RequestOptions.DEFAULT); System.out.println(response.getResult());//修改完成返回UPDATED connection.close(); |
7.7 delete方法删除数据
使用连接对象的delete方法删除 |
RestHighLevelClient connection = EsConn.getConnection(); DeleteRequest deleteRequest = new DeleteRequest(); deleteRequest.index("sys_user"); deleteRequest.id("10001"); //以上两步合并后:deleteRequest.index("sys_user").id("10001"); DeleteResponse response = connection.delete(deleteRequest, RequestOptions.DEFAULT); System.out.println(response.getResult());//删除失败返回NOT_FOUND,删除成功返回DELETED connection.close(); |
7.8 bulk方法批量操作
7.8.1实现批量新增
实现原理:将要新增的IndexRequest对象逐一添加到BulkRequest中去再通过bulk执行批量新增
使用bulk实现批量插入 |
RestHighLevelClient connection = EsConn.getConnection(); BulkRequest bulkRequest = new BulkRequest(); //new IndexRequest().index("sys_user").id("10002").source(XContentType.JSON,"name","lisi"); bulkRequest.add(new IndexRequest().index("sys_user").id("10002").source(XContentType.JSON,"name","lisi")); bulkRequest.add(new IndexRequest().index("sys_user").id("10003").source(XContentType.JSON,"name","lisi")); bulkRequest.add(new IndexRequest().index("sys_user").id("10004").source(XContentType.JSON,"name","lisi")); bulkRequest.add(new IndexRequest().index("sys_user").id("10005").source(XContentType.JSON,"name","lisi")); bulkRequest.add(new IndexRequest().index("sys_user").id("10006").source(XContentType.JSON,"name","lisi")); BulkResponse response = connection.bulk(bulkRequest, RequestOptions.DEFAULT); System.out.println(response.getIngestTook()); System.out.println(response.getItems()); System.out.println(response.getTook()); System.out.println(response.getIngestTookInMillis()); connection.close(); |
7.8.2 实现批量删除
实现原理:将删除数据的DeleteRequest对象逐一添加到BulkRequest对象中再通过bulk执行批量删除
RestHighLevelClient connection = new RestHighLevelClient(RestClient .builder(new HttpHost(URL,PORT))); BulkRequest bulkRequest = new BulkRequest(); bulkRequest.add(new DeleteRequest().index("sys_user").id("10001")); bulkRequest.add(new DeleteRequest().index("sys_user").id("10002")); bulkRequest.add(new DeleteRequest().index("sys_user").id("10003")); BulkResponse responses = connection.bulk(bulkRequest, RequestOptions.DEFAULT); System.out.println(responses.getTook()); System.out.println(responses.getItems()); connection.close(); |
7.9 search方法全量查询
原理:
|
query方法中选择matchAllQuery()是查询所有 |
RestHighLevelClient connection = EsConn.getConnection(); //查询请求 SearchRequest searchRequest = new SearchRequest(); searchRequest.indices("sys_user"); //SearchSourceBuilder SearchSourceBuilder query = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()); //构造查询条件 searchRequest.source(query); SearchResponse response = connection.search(searchRequest, RequestOptions.DEFAULT); //获取查询结果 SearchHits hits = response.getHits(); //获取查询条数 TotalHits totalHits = hits.getTotalHits(); TimeValue took = response.getTook(); // SearchHit[] hits1 = hits.getHits(); System.out.println("totalHits"+totalHits); System.out.println("took"+took); System.out.println("hits"+hits); System.out.println("hits1"+hits1); List<SearchHit> collect = Arrays.stream(hits1).collect(Collectors.toList()); System.out.println("collect"+collect); connection.close(); |
条件查询使用:termQuery |
RestHighLevelClient connection = EsConn.getConnection(); SearchRequest searchRequest = new SearchRequest(); searchRequest.indices("sys_user"); SearchSourceBuilder query = new SearchSourceBuilder() .query(QueryBuilders //条件查询 .termQuery("name","zhangsan")); searchRequest.source(query); SearchResponse response = connection.search(searchRequest, RequestOptions.DEFAULT); SearchHits hits = response.getHits(); SearchHit[] hits1 = hits.getHits(); if(hits1.length==0){ System.out.println("未查询到数据"); return; } else { List<SearchHit> collect = Arrays.stream(hits1).collect(Collectors.toList()); System.out.println(collect); } //释放资源 connection.close(); |
QueryBuilders中的方法
方法标识 | 方法名称 | 用途 | 示例 |
matchAllQuery | 匹配所有查询 | 查询全索引内数据 | |
termQuery
| 条件查询(7个重载方法) | ||
- 介绍
Elasticsearch是一款分布式、高扩展、高实时的搜索与数据分析引擎,为所有类型的数据提供近乎实时的搜索和分析,支持RESTful风格
RESTful,REST表示资源状态转换,例如HTTP协议就遵循了这个协议
Elasticsearch也是一个面向文档型的数据库,其内的Index(索引)可以看做是一个库,Type(类型)相当于表,Type的概念已逐渐被弱化,在7.X后被移除,Documents(文档)相当于表的行,Fields(字段)相当于列
倒排索引:根据关键字查询主键ID然后在关联文档内容
正排(正向)索引:根据主键索引查询文档内容然后再检索关键字
- 介绍
Elasticsearch是一款分布式、高扩展、高实时的搜索与数据分析引擎,为所有类型的数据提供近乎实时的搜索和分析,支持RESTful风格
RESTful,REST表示资源状态转换,例如HTTP协议就遵循了这个协议
Elasticsearch也是一个面向文档型的数据库,其内的Index(索引)可以看做是一个库,Type(类型)相当于表,Type的概念已逐渐被弱化,在7.X后被移除,Documents(文档)相当于表的行,Fields(字段)相当于列
倒排索引:根据关键字查询主键ID然后在关联文档内容
正排(正向)索引:根据主键索引查询文档内容然后再检索关键字
- 安装
1.1 基于docker环境的elasticsearch的安装
1.1.1常规安装
设置: http.host:0.0.0.0
docker run -d -p 9200:9200 -p 9300:9300 --name es\ -e "discovery.type=single-node"\ -e ES_JAVA_OPTS="-Xms512m -Xmx512m"\ -v /usr/local/bin/elasticsearch/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml\ -v /usr/local/bin/elasticsearch/data:/usr/share/data\ -v /usr/local/bin/elasticsearch/plugins:/usr/share/elasticsearch/plugins\ -d elasticsearch:7.17.4
./elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.17.4/elasticsearch-analysis-ik-7.17.4.zip 如果./elasticsearch-plugin提示找不到这个命令,则直接使用elasticsearch-plugin运行
|
1.1.2使用docker-compose的安装与配置
详情参考:docker-compose.yml文件配置: |
docker-compose.yml文件配置:
version: "3.1"
services:
elasticsearch:
image: elasticsearch:7.17.4
# restart: always # 总是重启,服务挂了后会自动重启。如果有问题的话会一直重启
container_name: elasticsearch
environment: #可以在elasticsearch.yml文件中配置
- node.name=elasticsearch #设置节点名称
- cluster.name=es-docker-cluster #设置集群名称
- discovery.seed_hosts=es01
- discovery.type=single-node #以单节点模式启动
# - cluster.initial_master_nodes=elasticsearch #集群名称,节点模式是单节点模式不配置该项
- ES_JAVA_OPTS=-Xms512m -Xmx512m # 设置jvm内存使用大小
ports:
- 9200:9200
- 9300:9300
volumes:
- ./elasticsearch/plugins:/usr/share/elasticsearch/plugins # 插件文件挂载
#- ./elasticsearch/data:/usr/share/elasticsearch/data # 数据文件挂载
#- ./elasticsearch/log:/user/share/elasticsearch/logs # 日志
kibana:
image: kibana:8.4.1
restart: always
container_name: kibana
ports:
- 5601:5601
environment:
- elasticsearch_url=http://IP:PORT //自行更改
depends_on:
- elasticsearch
基础操作
3.1 创建Index
使用PUT方法访问ES,会自动创建一个Index。Index相当于一个表。
PUT方法请求具有幂等性!
|
3.2 获取索引
获取索引使用GET方法进行请求
|
|
3.3 删除索引
删除索引使用DELETE方法请求
删除索引,使用DELETE请求 |
索引删除成功后使用GET请求将不能再获取 |
索引删除后还可以使用相同名称创建 |
3.3 添加文档数据
添加文档数据使用POST请求,POST不是幂等性的。注意:下表内绿色的部分可根据实际情况进行替换。并且_doc 可以改为_create
在_doc后不指定ID的话ES会自动生成一个随机的ID作为本次添加数据的ID |
|
|
|
http://ip:port/indexName/_create/id 第二次使用同一个ID创建异常: |
注意事项: 1. 使用_create添加数据,无论put还是post只能执行1次,否则会出现异常 2. 使用_doc添加数据,第一次添加是创建,第二次添加是更新 (无论POST与PUT) |
3.3 数据查询
查询使用GET方法请求,在索引名称后使用_doc
|
|
|
3.4 修改
3.4.1完全覆盖的修改
可以使用PUT或者POST请求,配置_doc实现完全覆盖的修改,建议使用PUT
|
|
3.4.2 局部数据更新
局部更新使用POST,配置_update实现。更新时,指定更新部分即可
修改是需要设置报文: { "doc":{ "title": "XX电脑" //要修改的对象,已经修改的值 } } 修改前: 修改后 |
3.5 删除
数据的删除使用DELETE请求,资源地址不变:http://ip:port/indexName/_doc/id。 删除后的数据再执行删除会提示找不到 多次删除,删除失败: |
3.6 条件查询
条件查询使用GET方法,配合_search使用,在其后跟上:?q= 字段:值
http:// ip:port/_search?q=条件字段:字段值 通过请求路径进行查询 |
{ "query":{ //查询操作 "match":{//查询类型-匹配查询 "title":"小米" //查询条件 } } } |
|
{ "query":{ //查询操作 "match_all":{//查询类型-全量查询 } } } |
|
{ "query":{ //查询 "bool":{ "must":[ //must查询,一下所有条件都必须是true {//条件1 "match"://匹配查询 { "title":"手机" } }, {//条件2 "match"://匹配查询 { "category":"小米" } } ] } } } |
{ "query":{ //查询 "bool":{ "should":[ //should查询,以下所有条件只要有一个为true,即可 {//条件1 "match"://匹配查询 { "title":"手机" } }, {//条件2 "match"://匹配查询 { "category":"小米" } } ] } } } |
{ "query":{ "bool":{ "should":[ { "match": { "title":"手机" } }, { "match": { "category":"电脑" } } ], "filter":{//范围查询 "range":{//范围 "price":{//价格 "gt":1000//大于1000 } } } } } } |
3.7 分页查询
分页查询是在查询体内设置查询的当前位置与每页显示条数:
{ "query":{ "match_all":{//全库查询 } }, "from": 0,//查询从当前位置开始 "size": 2 //每页显示2条数据 } |
|
{ "query":{//查询操作 "match_all":{//全库查询 } }, "from": 0,//查询起始位置 "size": 2,//每页显示条数 "_source":["title","kinds"] //指定显示的列 } |
|
3.8 查询排序
{ "query":{ "match_all":{ } }, "from": 0, "size": 3, "sort":{//排序 "price":{//排序列 "order":"desc"//排序方式 } } } |
- 全文检索
ES将存入的文档进行分词操作,然后将其存入到倒排索引中,检索是根据倒排索引内的关键字匹配文档。
如果在查询时,向完全匹配查询的结果,那么条件中的match关键字应换为match_phrase
4.1高亮显示的设置
如果想将查询结果中的某些列高亮显示,需要进行如下设置:
高亮结果设置: |
- 聚合操作
聚合操作使用aggs进行
分组操作请求正文: { "aggs": { //聚合操作 "price_group": { //名称,自定义 "term": { //分组 "field": "price" //分组字段 } } } } 以上方式会显示具体数据,如果不想显示具体数据可设置具体数据不显示 |
|
常见的聚合函数:
标识 | 名称 | 用途 |
terms | 分组 | 对查询数据进行分组操作 |
avg | 求平均值 | 对查询数据求平均值 |
sum | 求和 | 对查询数据进行求和处理 |
- 映射关系
映射关系,主要用于ES控制是否需要分词等属性设置。映射关系的设置,通过请求正文中的properties属性设置
映射关系设置: |
|
执行结果: mapping中设置的信息可以使用Get查看 |
|
标识 | 名称 | 用途 | 值介绍 | 示例 |
index | 表示是否能够被索引查询 | 设置是否能够作为查询条件查询 | true:能被索引查询 false:不能被索引查询 | 例如:如果设置了name不能被索引查询那么如果name作为查询条件,是不能够查询到数据的 |
type | 类型 | 如果某一列被设置了不能被分词,那么这一列如果作为查询条件时,需要全匹配 | text:文本,可以被分词 keywords:不能被分词 | 例如:name设置了不可分词,那么查询时,需要使用全的名称来进行查询。比如张三,如果不支持分词需要使用完整的“张三”查询,而“张”则不被支持 |
- JAVA与ES实现
添加依赖:
<dependencies> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>7.17.6</version> </dependency> <!-- elasticsearch客户端--> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.17.6</version> </dependency> <!-- elasticsearch依赖log4j--> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.17.2</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.17.2</version> </dependency> <!-- jackson-databind--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version> 2.13.3</version> </dependency> <!-- 单元测试--> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> <version>5.9.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.24</version> </dependency> </dependencies> |
7.1 连接ES
//创建elasticsearch客户端 RestHighLevelClient restHighLevelClient = new RestHighLevelClient( RestClient.builder( new HttpHost(URL,PORT,"http"))); //关闭连接客户端 restHighLevelClient.close(); |
7.2 indices() .create方法创建索引创建索引
封装连接
public class EsConn { private static final String URL="124.71.74.18"; private static final int PORT=9200; public static RestHighLevelClient getConnection(){ //创建elasticsearch客户端 RestHighLevelClient restHighLevelClient = new RestHighLevelClient( RestClient.builder( new HttpHost(URL,PORT,"http"))); return restHighLevelClient; } } |
以下所有示例均使用封装的工具类获取连接对象
使用indices() .create创建索引 |
RestHighLevelClient connection = EsConn.getConnection();//获取连接对象 //获取创建索引请求对象 CreateIndexRequest indexRequest = new CreateIndexRequest("sys_user");//创建一个创建索引请求对象 CreateIndexResponse response = connection .indices() .create(indexRequest, RequestOptions.DEFAULT);//创建索引,RequestOptions为默认选项 boolean acknowledged = response.isAcknowledged();//响应状态,创建成功会返回true //关闭连接客户端 restHighLevelClient.close(); |
7.3 indices().delete方法删除索引
使用indices().delete方法删除索引 |
RestHighLevelClient connection = EsConn.getConnection(); //创建请求对象 DeleteIndexRequest sys_user = new DeleteIndexRequest("sys_user"); // AcknowledgedResponse delete = connection.indices().delete(sys_user, RequestOptions.DEFAULT); boolean acknowledged = delete.isAcknowledged();//获取响应结果,删除成功返回true //关闭连接客户端 restHighLevelClient.close(); |
7.4 indices().get方法查询索引
使用indices()对象的get方法获取索引 |
RestHighLevelClient connection = EsConn.getConnection(); //创建一个获取索引的对象 GetIndexRequest getIndexRequest = new GetIndexRequest("user"); GetIndexResponse response = connection .indices() .get(getIndexRequest, RequestOptions.DEFAULT); System.out.println(response.getAliases());//别名操作 System.out.println(response.getDataStreams()); System.out.println(response.getIndices()); System.out.println(response.getDefaultSettings()); System.out.println(response.getMappings()); System.out.println(response.getSettings()); connection.close(); |
7.5 index方法新增数据
使用连接对象的index方法插入数据 |
ObjectMapper objectMapper = new ObjectMapper(); RestHighLevelClient connection = EsConn.getConnection(); IndexRequest indexRequest = new IndexRequest("sys_user"); // 设置id indexRequest.id("10001"); User user = new User(); user.setName("张三"); user.setSex(true); user.setAge(18); user.setTel("120"); //向Es中以JSON格式存储 String userJson = objectMapper.writeValueAsString(user);//将对象转换为json字符串 IndexRequest source = indexRequest.source(userJson, XContentType.JSON); IndexResponse response = connection.index(indexRequest, RequestOptions.DEFAULT); //写入ES结果 System.out.println(response.getResult());//获取ES的状态CREATED 创建成功,UPDATED 更新,DELETED 删除 System.out.println(response.getId());//获取数据id System.out.println(response.getShardId());//获取分片id System.out.println(response.getShardInfo());//获取分片信息 System.out.println(response.getIndex()); System.out.println(response.getVersion()); System.out.println(response.getSeqNo()); System.out.println(response.getType()); System.out.println(response.getPrimaryTerm()); |
7.6 update方法修改数据
使用连接对象的update方法修改 |
RestHighLevelClient connection = EsConn.getConnection(); //获取索引 UpdateRequest updateRequest = new UpdateRequest();//创建更新索引请求对象 UpdateRequest userIndex = updateRequest.index("sys_user");//设置索引 userIndex.id("10001"); updateRequest.doc(XContentType.JSON, "age", 20); UpdateResponse response = connection.update(updateRequest, RequestOptions.DEFAULT); System.out.println(response.getResult());//修改完成返回UPDATED connection.close(); |
7.7 delete方法删除数据
使用连接对象的delete方法删除 |
RestHighLevelClient connection = EsConn.getConnection(); DeleteRequest deleteRequest = new DeleteRequest(); deleteRequest.index("sys_user"); deleteRequest.id("10001"); //以上两步合并后:deleteRequest.index("sys_user").id("10001"); DeleteResponse response = connection.delete(deleteRequest, RequestOptions.DEFAULT); System.out.println(response.getResult());//删除失败返回NOT_FOUND,删除成功返回DELETED connection.close(); |
7.8 bulk方法批量操作
7.8.1实现批量新增
实现原理:将要新增的IndexRequest对象逐一添加到BulkRequest中去再通过bulk执行批量新增
使用bulk实现批量插入 |
RestHighLevelClient connection = EsConn.getConnection(); BulkRequest bulkRequest = new BulkRequest(); //new IndexRequest().index("sys_user").id("10002").source(XContentType.JSON,"name","lisi"); bulkRequest.add(new IndexRequest().index("sys_user").id("10002").source(XContentType.JSON,"name","lisi")); bulkRequest.add(new IndexRequest().index("sys_user").id("10003").source(XContentType.JSON,"name","lisi")); bulkRequest.add(new IndexRequest().index("sys_user").id("10004").source(XContentType.JSON,"name","lisi")); bulkRequest.add(new IndexRequest().index("sys_user").id("10005").source(XContentType.JSON,"name","lisi")); bulkRequest.add(new IndexRequest().index("sys_user").id("10006").source(XContentType.JSON,"name","lisi")); BulkResponse response = connection.bulk(bulkRequest, RequestOptions.DEFAULT); System.out.println(response.getIngestTook()); System.out.println(response.getItems()); System.out.println(response.getTook()); System.out.println(response.getIngestTookInMillis()); connection.close(); |
7.8.2 实现批量删除
实现原理:将删除数据的DeleteRequest对象逐一添加到BulkRequest对象中再通过bulk执行批量删除
RestHighLevelClient connection = new RestHighLevelClient(RestClient .builder(new HttpHost(URL,PORT))); BulkRequest bulkRequest = new BulkRequest(); bulkRequest.add(new DeleteRequest().index("sys_user").id("10001")); bulkRequest.add(new DeleteRequest().index("sys_user").id("10002")); bulkRequest.add(new DeleteRequest().index("sys_user").id("10003")); BulkResponse responses = connection.bulk(bulkRequest, RequestOptions.DEFAULT); System.out.println(responses.getTook()); System.out.println(responses.getItems()); connection.close(); |
7.9 search方法全量查询
原理:
|
query方法中选择matchAllQuery()是查询所有 |
RestHighLevelClient connection = EsConn.getConnection(); //查询请求 SearchRequest searchRequest = new SearchRequest(); searchRequest.indices("sys_user"); //SearchSourceBuilder SearchSourceBuilder query = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()); //构造查询条件 searchRequest.source(query); SearchResponse response = connection.search(searchRequest, RequestOptions.DEFAULT); //获取查询结果 SearchHits hits = response.getHits(); //获取查询条数 TotalHits totalHits = hits.getTotalHits(); TimeValue took = response.getTook(); // SearchHit[] hits1 = hits.getHits(); System.out.println("totalHits"+totalHits); System.out.println("took"+took); System.out.println("hits"+hits); System.out.println("hits1"+hits1); List<SearchHit> collect = Arrays.stream(hits1).collect(Collectors.toList()); System.out.println("collect"+collect); connection.close(); |
条件查询使用:termQuery |
RestHighLevelClient connection = EsConn.getConnection(); SearchRequest searchRequest = new SearchRequest(); searchRequest.indices("sys_user"); SearchSourceBuilder query = new SearchSourceBuilder() .query(QueryBuilders //条件查询 .termQuery("name","zhangsan")); searchRequest.source(query); SearchResponse response = connection.search(searchRequest, RequestOptions.DEFAULT); SearchHits hits = response.getHits(); SearchHit[] hits1 = hits.getHits(); if(hits1.length==0){ System.out.println("未查询到数据"); return; } else { List<SearchHit> collect = Arrays.stream(hits1).collect(Collectors.toList()); System.out.println(collect); } //释放资源 connection.close(); |
QueryBuilders中的方法
方法标识 | 方法名称 | 用途 | 示例 |
matchAllQuery | 匹配所有查询 | 查询全索引内数据 | |
termQuery | 条件查询(7个重载方法) | ||
7.9.1 排序
排序是在查询的基础上进行的,全量查询中的排序与分页一样都是在SearchSourceBuilder对象中进行设置。
原理:
|
详细代码可参考分页查询 |
7.9.2 排除与包含
排除与包含的原理同上边介绍的类似,都是在SearchSourceBuilder对象中设置需要排除与包含的内容。以下截取了部分代码,其他代码可参考分页查询 |
|
7.10 分页查询
分页查询的原理类似全量查询,主要是在构造查询条件的地方设置了分页属性具体见下表
原理:
|
示例: RestHighLevelClient connection = EsConn.getConnection(); //查询请求 SearchRequest searchRequest = new SearchRequest(); searchRequest.indices("sys_user"); //SearchSourceBuilder SearchSourceBuilder query = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()); //设置分页查询属性 query.from(0);//当前数据位置 query.size(2);//每页显示条数 //构造查询条件 searchRequest.source(query); SearchResponse response = connection.search(searchRequest, RequestOptions.DEFAULT); //获取查询结果 SearchHits hits = response.getHits(); //获取查询条数 TotalHits totalHits = hits.getTotalHits(); SearchHit[] hits1 = hits.getHits(); List<SearchHit> collect = Arrays.stream(hits1).collect(Collectors.toList()); System.out.println("collect"+collect); connection.close(); |
7.11 组合查询与范围查询
7.11.1 组合查询
组合查询的基本原理与分页查询类似,不同的地方在于需要在QueryBuilds对象中设置组合查询条件
原理:
|
|
7.11.2 范围查询
原理:
|
其他代码参考分页查询 |
标识 | 名称 |
gte | 大于等于 |
lte | 小于等于 |
gt | 大于 |
lt | 小于 |
7.12 模糊查询与高亮查询
7.12.1 fuzzyQuery模糊查询
原理:
|
|
7.12.2 高亮展示
//1. 获取连接对象 RestHighLevelClient connection = new RestHighLevelClient(RestClient .builder(new HttpHost(URL, PORT)));//获取连接对象 //2. 创建查询请求体构造器 SearchRequest searchRequest = new SearchRequest(); searchRequest.indices("sys_user");//要查询的索引 //3. 构造查询条件 TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "张"); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); //设置查询方式 sourceBuilder.query(termQueryBuilder); //构造高亮显示 HighlightBuilder highlightBuilder = new HighlightBuilder(); highlightBuilder.preTags("<font color='red'>");//设置标签前置 highlightBuilder.postTags("</font>");//设置后置标签 highlightBuilder.field("name");//设置高亮显示字段 //设置高亮显示对象 sourceBuilder.highlighter(highlightBuilder); //设置请求体 searchRequest.source(sourceBuilder); //ES响应 SearchResponse response = connection.search(searchRequest, RequestOptions.DEFAULT); SearchHits hits = response.getHits();//获取命中数据 SearchHit[] hits1 = hits.getHits(); List<SearchHit> collect = Arrays.stream(hits1).collect(Collectors.toList()); System.out.println(collect); connection.close(); |
7.13 最大值查询与分组查询
最大值与分组查询是属于聚合查询范畴,
原理:
|
|
- 高级篇
8.1 集群环境搭建
8.1.1 windows环境集群部署
8.2.2 linux环境集群部署
8.2.3 linux单节点部署
8.2 系统架构
8.3 故障处理与扩容
8.3.1 故障转移
8.3.2 应对故障
8.3.3 水平扩容
8.4 路由计算与分片控制
8.5 更新流程与批量操作流程
8.6 倒排索引
8.7 文档搜索
8.8 文档刷新、文档刷写、文档合并
8.9 文档分析
8.10 文档展示
- 框架集成
9.1 集成SpringData
9.2 集成SparkStreaming
9.3 集成Flink
- 优化
10.1 硬件选择
10.2 分片策略
10.3 路由选择
10.4 写入速度优化
10.5 内存设置
10.6 重要配置