当前位置:   article > 正文

SpringBoot整合ElasticSearch7.6.2入门_springboot elasticsearch7

springboot elasticsearch7

一、前期准备

        ElasticSearch作为基于Lucene的一款分布式全文检索服务器,可以通过暴露restfulAPI操作索引、搜索,具备有实时搜索、稳定、可靠、快速、安装使用方便等特点,是目前使用最广泛的企业级搜索引擎。

        本期的目的就是——在springBoot项目当中,使用elasticSearch的java客户端,来实现与ES服务进行交互,涉及的内容主要包括以下几部分:

1、基本资料准备;

2、索引(index)的增删;

3、文档(document)的增删改和简单查;

4、文档(document)的DSL查询(重点)

        注意:所有的具体ES语法演示参照kibana来,结果展示参照head插件来和idea控制台,java代码交互借助idea来实现!

二、基本资料准备

1、springboot项目依赖

1.0 ES服务及插件版本

所用的ES、可视化管理插件kibana和es_head都用的7.6.2版本;

1.1 pom.xml

        注意:springBoot整合的elasticSearch是个混合依赖,ES服务的版本为7.6.2,所以请确保自己的ES服务版本要对齐,避免版本冲突问题;

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-web</artifactId>
  5. <version>2.3.2.RELEASE</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-test</artifactId>
  10. <version>2.3.2.RELEASE</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>junit</groupId>
  14. <artifactId>junit</artifactId>
  15. <version>4.13.2</version>
  16. <scope>test</scope>
  17. </dependency>
  18. <dependency>
  19. <groupId>org.springframework.boot</groupId>
  20. <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
  21. <version>2.3.2.RELEASE</version>
  22. </dependency>
  23. </dependencies>

spring-boot-starter-data-elasticsearch当中的子依赖及版本: 

1.2 配置类  

  • 核心启动器

  1. @SpringBootApplication
  2. public class ElasticSearchApplication {
  3. public static void main(String[] args) {
  4. SpringApplication.run(ElasticSearchApplication.class,args);
  5. }
  6. }
  • 管理ES java客户端的配置类 

  1. @Configuration
  2. public class ElasticSearchClientConfig {
  3. @Bean
  4. public RestHighLevelClient restHighLevelClient(){
  5. //获取可以用来操作ES的java客户端
  6. RestHighLevelClient restHighLevelClient = new RestHighLevelClient(
  7. RestClient.builder(new HttpHost("192.168.245.129", 9200,"http")));
  8. return restHighLevelClient;
  9. }
  10. }

 1.3 测试类

可以提前准备两个测试类(也可以后边再准备):

  1. import com.qf.ElasticSearchApplication;
  2. import org.elasticsearch.client.RestHighLevelClient;
  3. import org.junit.runner.RunWith;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.boot.test.context.SpringBootTest;
  6. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  7. /**
  8. * ClassName: TestDemo1
  9. *
  10. * @author Guan
  11. * Description : 本类主要是做索引(创建、删除、查询)、文档(创建、删除、修改、简单查询)的
  12. * date: 2024/1/29 22:47
  13. */
  14. @RunWith(SpringJUnit4ClassRunner.class)
  15. @SpringBootTest(classes = ElasticSearchApplication.class)
  16. public class TestDemo1 {
  17. @Autowired
  18. private RestHighLevelClient restHighLevelClient;
  19. }
  1. import com.qf.ElasticSearchApplication;
  2. import org.elasticsearch.client.RestHighLevelClient;
  3. import org.junit.runner.RunWith;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.boot.test.context.SpringBootTest;
  6. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  7. /**
  8. * ClassName: TestDemo2
  9. *
  10. * @author Guan
  11. * Description : 本类主要是做文档的DSL查询操作的!
  12. * date: 2024/1/29 22:50
  13. */
  14. @RunWith(SpringJUnit4ClassRunner.class)
  15. @SpringBootTest(classes = ElasticSearchApplication.class)
  16. public class TestDemo2 {
  17. @Autowired
  18. private RestHighLevelClient restHighLevelClient;
  19. }

三、索引相关操作

1、创建索引

  • 请求语法(kibana中书写)

 

  • java Client实现 

 在TestDemo1当中继续写,映射的那部分内容可以直接从kibana当中拷贝:

  1. @DisplayName("创建索引,同时创建映射")
  2. @Test
  3. public void testCreatIndex() throws Exception{
  4. //获取创建索引请求对象
  5. CreateIndexRequest createIndexRequest = new CreateIndexRequest("book");
  6. //设置索引的初始化设置
  7. createIndexRequest.settings(Settings.builder().
  8. put("number_of_shards",2).
  9. put("number_of_replicas", 1));
  10. //在index当中创建映射
  11. createIndexRequest.mapping("{\n" +
  12. " \"_source\": {\n" +
  13. " \"excludes\": [\"description\"]\n" +
  14. " },\n" +
  15. " \"properties\": {\n" +
  16. " \"id\": {\n" +
  17. " \"type\": \"keyword\"\n" +
  18. " },\n" +
  19. " \"name\": {\n" +
  20. " \"type\": \"text\",\n" +
  21. " \"analyzer\": \"ik_max_word\",\n" +
  22. " \"search_analyzer\": \"ik_smart\"\n" +
  23. " },\n" +
  24. " \"price\": {\n" +
  25. " \"type\": \"float\"\n" +
  26. " },\n" +
  27. " \"description\": {\n" +
  28. " \"type\": \"text\",\n" +
  29. " \"analyzer\": \"ik_max_word\",\n" +
  30. " \"search_analyzer\": \"ik_smart\"\n" +
  31. " },\n" +
  32. " \"timestamp\": {\n" +
  33. " \"type\": \"date\",\n" +
  34. " \"format\": \"yyyy-MM-dd HH:mm:ss || yyyy-MM-dd\"\n" +
  35. " }\n" +
  36. " }\n" +
  37. "}", XContentType.JSON);
  38. //根据索引操作客户端、获取创建索引请求的响应对象
  39. CreateIndexResponse createIndexResponse = restHighLevelClient.
  40. indices().create(createIndexRequest, RequestOptions.DEFAULT);
  41. //查看响应结果
  42. System.out.println(createIndexResponse.isAcknowledged());
  43. }

操作结果:

 2、删除索引

  • ES语法

 

  • java Client实现

  1. @DisplayName("删除索引")
  2. @Test
  3. public void testCreateMapping() throws Exception{
  4. //获取删除索引请求对象
  5. DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest();
  6. deleteIndexRequest.indices("book");
  7. //根据索引操作客户端,获取响应对象
  8. AcknowledgedResponse deleteResponse = restHighLevelClient.indices().
  9. delete(deleteIndexRequest, RequestOptions.DEFAULT);
  10. System.out.println("是否删除成功? "+deleteResponse.isAcknowledged());
  11. }

操作结果:

3、查看索引 

  • ES语法

  • java client的实现

  1. @DisplayName("查看索引")
  2. @Test
  3. public void testQueryIndex() throws Exception {
  4. //获取查询索引请求对象
  5. GetIndexRequest getIndexRequest = new GetIndexRequest("book");
  6. //根据索引操作客户端、获取响应对象
  7. GetIndexResponse getIndexResponse = restHighLevelClient.indices().
  8. get(getIndexRequest, RequestOptions.DEFAULT);
  9. //解析响应结果
  10. Map<String, Settings> settings = getIndexResponse.getSettings();
  11. System.out.println(settings.toString());
  12. }

查询结果:

四、文档相关操作

        由于ES在7.x版本之后,已经废除了type的概念,所以可以用_doc来替代之前所用的type_name。

1、创建文档

  • ES语法

  • java client实现

  1. @DisplayName("创建文档")
  2. @Test
  3. public void createDocument() throws Exception{
  4. //获取索引请求对象
  5. IndexRequest indexRequest = new IndexRequest("book","_doc","2");
  6. //创建文档
  7. indexRequest.source("{\n" +
  8. " \"id\": \"1002\",\n" +
  9. " \"name\": \"mybatis入门课程\",\n" +
  10. " \"decription\": \"mybatis入门课程主要是围绕着:原生jdbc案例分析、mybatis基本概念、mybatis的映射文件、mybatis的注解实现等几个方面入手;\",\n" +
  11. " \"timestamp\": \"2023-12-22\",\n" +
  12. " \"price\": 22.5\n" +
  13. "}",XContentType.JSON);
  14. //获取操作响应对象
  15. IndexResponse indexResponse = restHighLevelClient.
  16. index(indexRequest, RequestOptions.DEFAULT);
  17. //查看操作结果
  18. System.out.println(indexResponse.status());
  19. System.out.println(indexResponse.toString());
  20. }

ps:文件内容可以直接从kibana上边复制;

控制台显示结果:

head插件显示结果: 

 2、批量添加

  • ES语法

注意添加的时候,不论是对index的指定、document内容的指定,都要注意键值之间都不要写空格+花括号{}千万别换行,否则容易出现错误开始异常;

  • java client的实现 

  1. @DisplayName("批量添加文档")
  2. @Test
  3. public void testBulkAddDocument() throws Exception {
  4. //获取批量操作请求对象
  5. BulkRequest bulkRequest = new BulkRequest();
  6. //批量添加document
  7. bulkRequest.add(new IndexRequest("book", "_doc", "3").
  8. source("{\"id\":\"1003\",\"name\":\"安徒生童话\",\"decription\":\"《安徒生童话》是丹麦作家安徒生创作的童话集,共由166篇故事组成。该作爱憎分明,热情歌颂劳动人民、赞美他们的善良和纯洁的优秀品德;无情地揭露和批判王公贵族们的愚蠢、无能、贪婪和残暴。其中较为闻名的故事有:《小人鱼》《丑小鸭》《卖火柴的小女孩》、《拇指姑娘》等;\",\"timestamp\":\"2020-06-01\",\"price\":18.9}", XContentType.JSON));
  9. bulkRequest.add(new IndexRequest("book","_doc","4").
  10. source("{\"id\":\"1004\",\"name\":\"ElasticSearch\",\"description\":\"Elasticsearch 是一个分布式搜索引擎,底层基于 Lucene 实现。Elasticsearch 屏蔽了Lucene的底层细节,提供了分布式特性,同时对外提供了 Restful API。Elasticsearch以其易用性迅速赢得了许多用户 被用在网站搜索、日志分析等诸多方面。由于 ES强大的横向扩展能力, 甚至很多人也会直接把 ES 当做 NoSQL 来用;\",\"timestamp\":\"2019-11-11\",\"price\":25.7}",XContentType.JSON));
  11. //获取操作结果
  12. BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
  13. //查看操作结果
  14. System.out.println("是否失败?"+bulkResponse.hasFailures());
  15. }

操作结果:

控制台结果:

head插件显示结果:

3、修改文档 

  • ES语法

此处不论是put还是post,都可以实现document的修改操作!

  • java client实现

  1. @DisplayName("修改id为4的文档")
  2. @Test
  3. public void testUpdateDocument() throws Exception{
  4. //获取修改文档的请求对象
  5. UpdateRequest updateRequest = new UpdateRequest("book","_doc","4");
  6. //修改内容
  7. updateRequest.doc("{\n" +
  8. " \"id\": \"1004\",\n" +
  9. " \"name\": \"ElasticSearch入门教程\",\n" +
  10. " \"decription\": \"本课程主要是围绕着ES的基本概念、ES的下载安装、相关插件的学习、基本语法和java整合ES服务等展开;\",\n" +
  11. " \"timestamp\": \"2023-12-22\",\n" +
  12. " \"price\": 27.5\n" +
  13. "}",XContentType.JSON);
  14. //执行修改操作,获取响应对象
  15. UpdateResponse update = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
  16. //查看响应结果
  17. System.out.println(update.status());
  18. System.out.println(update.toString());
  19. }

具体操作结果:

控制台:

 head插件:

4、删除文档

  • ES语法

  • java client实现

  1. @DisplayName("删除文档")
  2. @Test
  3. public void testDeleteDocument() throws Exception{
  4. //创建删除文档请求对象
  5. DeleteRequest deleteRequest = new DeleteRequest("book","_doc","4");
  6. //获取响应对象
  7. DeleteResponse delete = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
  8. //解析响应结果
  9. System.out.println(delete.status());
  10. System.out.println(delete.getResult());
  11. }

具体操作结果:

5、简单查询document

  • ES语法 

  • java client实现

  1. @DisplayName("根据id简单查询稳定")
  2. @Test
  3. public void testQueryDocumentById() throws Exception{
  4. //获取查询文档id
  5. GetRequest getRequest = new GetRequest("book","_doc","1");
  6. //获取查询响应结果
  7. GetResponse getResponse = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);
  8. //解析查询结果
  9. System.out.println(getResponse.getSourceAsString());
  10. }

结果:

控制台结果:

五、文档查询的DSL操作 

        DSL(Domain Specific Language)是ES提出的基于json的搜索方式,在搜索的时候,只需要传入特定的json格式数据,就可以完成不同的搜索需求。

        DSL的搜索方式功能比URI的形式要更强大,一般在项目当中使用DSL的方式开完成搜索会比较多。注意:接下来的所有实现代码都是放在TestDemo2当中写的。

1、查询所有文档

  • ES语法:

  • javaClient的实现

  1. import com.qf.ElasticSearchApplication;
  2. import org.apache.lucene.search.TotalHits;
  3. import org.elasticsearch.action.search.SearchRequest;
  4. import org.elasticsearch.action.search.SearchResponse;
  5. import org.elasticsearch.client.RequestOptions;
  6. import org.elasticsearch.client.RestHighLevelClient;
  7. import org.elasticsearch.index.query.QueryBuilders;
  8. import org.elasticsearch.search.SearchHit;
  9. import org.elasticsearch.search.SearchHits;
  10. import org.elasticsearch.search.builder.SearchSourceBuilder;
  11. import org.junit.After;
  12. import org.junit.Before;
  13. import org.junit.Test;
  14. import org.junit.jupiter.api.DisplayName;
  15. import org.junit.runner.RunWith;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.boot.test.context.SpringBootTest;
  18. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  19. import java.text.SimpleDateFormat;
  20. /**
  21. * ClassName: TestDemo2
  22. *
  23. * @author Guan
  24. * Description : 本类主要是做文档的DSL查询操作的!
  25. * date: 2024/1/29 22:50
  26. */
  27. @RunWith(SpringJUnit4ClassRunner.class)
  28. @SpringBootTest(classes = ElasticSearchApplication.class)
  29. public class TestDemo2 {
  30. @Autowired
  31. private RestHighLevelClient restHighLevelClient;
  32. //提前准备好搜索的请求和响应变量
  33. SearchRequest searchRequest;
  34. SearchResponse searchResponse;
  35. @DisplayName("测试前作准备工作:获取searchRequest对象")
  36. @Before
  37. public void before(){
  38. searchRequest = new SearchRequest();
  39. searchRequest.indices("book");
  40. }
  41. @DisplayName("测试(搜索)过程结束之后,用于解析响应对象")
  42. @After
  43. public void after() throws Exception{
  44. //获取搜索匹配的结果
  45. SearchHits hits = searchResponse.getHits();
  46. //获取搜索的总记录(不是数)
  47. TotalHits totalHits = hits.getTotalHits();
  48. System.out.println(totalHits.toString());
  49. //获取匹配的文档
  50. SearchHit[] searchHits = hits.getHits();
  51. //涉及到日期对象,要做日期对象的转化
  52. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  53. for (SearchHit hit : searchHits) {
  54. //获取文档的id
  55. String id = hit.getId();
  56. //获取源文档的内容
  57. String sourceAsString = hit.getSourceAsString();
  58. System.out.println("id: "+id+" ,内容为:"+sourceAsString);
  59. }
  60. }
  61. @DisplayName("查询所有记录")
  62. @Test
  63. public void testSearchAll() throws Exception{
  64. //创建搜索源对象
  65. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  66. //设置搜索规则--查询所有
  67. searchSourceBuilder.query(QueryBuilders.matchAllQuery());
  68. //设置搜索源
  69. searchRequest.source(searchSourceBuilder);
  70. //执行搜索操作
  71. searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
  72. }
  73. }

查询结果:

2、分页查询

 ES语法:

java client实现:

  1. @DisplayName("分页查询")
  2. @Test
  3. public void testPageSearch() throws Exception{
  4. //创建搜索源对象
  5. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  6. searchSourceBuilder.query(QueryBuilders.matchAllQuery());
  7. //设置从第几条记录开始查询
  8. searchSourceBuilder.from(1);
  9. //设置查几条记录
  10. searchSourceBuilder.size(2);
  11. //设置查询结果按照价格升序排序
  12. searchSourceBuilder.sort("price", SortOrder.ASC);
  13. //设置搜索源
  14. searchRequest.source(searchSourceBuilder);
  15. //执行查询结果
  16. searchResponse = restHighLevelClient.search(searchRequest,RequestOptions.DEFAULT);
  17. }

 查询结果:

3、match全文检索

        match Query即全文检索,它是一种将搜索内容先分词,然后再使用各个词条去索引当中搜索记录的方式。

        涉及的特定json串:query----后边跟搜索的关键字;operator----后边跟or或者and,表示搜索内容只要含有分词后的一个词条就可以检索出来,还是搜索内容必须包含所有分词;

ES语法:

javaClient实现:

  1. @DisplayName("全文检索:fild_name为name,检索内容为'入门课程',检索结果必须包含所有分词")
  2. @Test
  3. public void testMatchSearch() throws Exception{
  4. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  5. searchSourceBuilder.query(
  6. QueryBuilders.matchQuery("name","入门课程").operator(Operator.AND));
  7. searchRequest.source(searchSourceBuilder);
  8. searchResponse = restHighLevelClient.search(searchRequest,RequestOptions.DEFAULT);
  9. }

 控制台结果:

4、multi_match多Field全文检索

        match全文检索是针对某个field来展开的,需要在某个field当中去做匹配;而multi_match是把关键字放在了多个field当中去匹配; 

ES语法:

javaClient的实现

  1. @DisplayName("multi_match全文检索:将'入门课程'放在属性name和description当中检索")
  2. @Test
  3. public void testMultiMatchSearch() throws Exception{
  4. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  5. searchSourceBuilder.query(QueryBuilders.multiMatchQuery("入门课程","name","description"));
  6. searchRequest.source(searchSourceBuilder);
  7. searchResponse = restHighLevelClient.search(searchRequest,RequestOptions.DEFAULT);
  8. }

 控制台显示结果:

5、bool查询

        bool查询对应lucene当中的boolQuery,它是一种支持将多个查询条件组合起来检索的方式。它有三个参数:must(多个条件必须都满足),should(只要满足一个条件就行),must not(必须不在所有条件内);

ES语法:

java client实现:

  1. @DisplayName("bool查询:eg--查询所有name当中有“课程”,并且价格在20-30范围内的记录")
  2. @Test
  3. public void testBoolSearch() throws Exception {
  4. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  5. //创建bool查询的构建对象
  6. BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
  7. //设置查询名字必须含有“课程”
  8. boolQueryBuilder.must(QueryBuilders.matchQuery("name","课程"));
  9. boolQueryBuilder.must(QueryBuilders.rangeQuery("price").gte(20).lte(30));
  10. //将bool查询规则应用在搜索源上
  11. searchSourceBuilder.query(boolQueryBuilder);
  12. //设置搜索源
  13. searchRequest.source(searchSourceBuilder);
  14. searchResponse = restHighLevelClient.search(searchRequest,RequestOptions.DEFAULT);
  15. }

 6、filter过滤查询

        过滤查询,本质上是DSL的补充语法。过滤查询在过滤的时候,是对某些搜索条件结果进行过滤,并不会进行任何匹配分数的计算。相对于query而言,filter的效率要更高一些,因为query需要计算搜索匹配相关度分数,同样的,query也更适合一些复杂条件的搜索。

ES语法

java client实现:

  1. @DisplayName("过滤查询")
  2. @Test
  3. public void testFilterQuery() throws Exception{
  4. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  5. BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
  6. boolQueryBuilder.must(QueryBuilders.matchQuery("name","课程"));
  7. //过滤查询
  8. boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(20).lte(30));
  9. searchSourceBuilder.query(boolQueryBuilder);
  10. searchRequest.source(searchSourceBuilder);
  11. searchResponse = restHighLevelClient.search(searchRequest,RequestOptions.DEFAULT);
  12. }

控制台显示结果:

7、highlight高亮查询

        高亮查询不是逻辑结构层面的查询,不属于搜索条件,而是一种显示逻辑,它可以将关键字内容在查询结果当中进行高亮显示。 

ES语法:

java client的实现

  1. //修改这部分代码,增加了一个高亮显示
  2. @DisplayName("测试(搜索)过程结束之后,用于解析响应对象")
  3. @After
  4. public void after() throws Exception{
  5. //获取搜索匹配的结果
  6. SearchHits hits = searchResponse.getHits();
  7. //获取搜索的总记录(不是数)
  8. TotalHits totalHits = hits.getTotalHits();
  9. System.out.println(totalHits.toString());
  10. //获取匹配的文档
  11. SearchHit[] searchHits = hits.getHits();
  12. //涉及到日期对象,要做日期对象的转化
  13. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  14. for (SearchHit hit : searchHits) {
  15. //获取文档的id
  16. String id = hit.getId();
  17. //获取源文档的内容
  18. String sourceAsString = hit.getSourceAsString();
  19. System.out.println("id: "+id+" ,内容为:"+sourceAsString);
  20. //增加:高亮查询结果显示
  21. //获取所有高亮显示设置
  22. Map<String, HighlightField> highlightFields =hit.getHighlightFields();
  23. if (highlightFields != null){
  24. //获取被高亮显示的field
  25. HighlightField highlightField = highlightFields.get("name");
  26. Text[] fragments = highlightField.getFragments();
  27. System.out.println("高亮字段:"+ fragments[0].toString());
  28. }
  29. }
  30. }
  31. @DisplayName("highlight查询")
  32. @Test
  33. public void testHighlight() throws Exception{
  34. SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  35. //设置查询条件
  36. searchSourceBuilder.query(QueryBuilders.matchQuery("name","课程"));
  37. //设置高亮查询(设置高亮显示)
  38. //获取highlight构建对象
  39. HighlightBuilder highlightBuilder = new HighlightBuilder();
  40. highlightBuilder.preTags("\"<font color='red'>\"");
  41. highlightBuilder.postTags("</font>");
  42. highlightBuilder.fields().add(new HighlightBuilder.Field("name"));
  43. searchSourceBuilder.highlighter(highlightBuilder);
  44. searchRequest.source(searchSourceBuilder);
  45. searchResponse = restHighLevelClient.search(searchRequest,RequestOptions.DEFAULT);
  46. }

控制台结果显示:

 六、小结

        1、使用javaClient和ES进行交互的时候,最好提前在kibana当中检查一下语法的正确性,再复制到idea当中作为source之类,可以有效降低代码的错误性;

        2、涉及到与索引操作相关的请求分别是:CreateIndexRequest(创建索引)、GetIndexRequest(查询索引)、DeleteIndexRequest(删除索引);

        3、涉及到与文档操作相关的请求分别是:IndexRequest(获取索引请求,然后通过source方法去创建文档)、DeleteRequest(删除指定的文档)、UpdateRequest(修改文档,通过.doc方法修改)、GetRequest(根据id简单查询文档);

        4、在涉及到批量操作文档的时候:注意{}不要换行,花括号当中的json格式key和value中间不要加空格,批量操作的请求是BulkRequest;

        5、在使用DSL查询的时候,它是基于json的查询方式,有很多特定的json串来指定查询的规则;

        请求和响应对象分别是SearchRequest和SearchResponse,查询的过程当中都需要去通过SearchSourceBuilder这个搜索源的构建者对象,来设置搜索的条件,然后再把搜索源应用在请求上去做查询;

        6 、DSL当中的filter查询一般是和bool查询一起使用,它是在前几步查询的基础上,对查询结果做过滤,并没有做相关度的计算

        7、DSL的hightlight查询,虽然叫做查询,但是其实不是查询的逻辑操作,而是对搜索内容当中的关键字去做了高亮显示,它是一种显示操作,所以当涉及到设置搜索源的时候,需要单独在query之后searchSourceBuilder通过.highligter(HighlightBuilder的对象)设置结果的高亮查询

        8 、最后,如果有问题或者想法,欢迎多多留言评论哦!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/936302
推荐阅读
相关标签
  

闽ICP备14008679号