• elasticsearch快速应用于SpringBoot


    第一步:导入maven依赖

    1. <dependency>
    2. <groupId>org.elasticsearch.clientgroupId>
    3. <artifactId>elasticsearch-rest-high-level-clientartifactId>
    4. <version>7.4.0version>
    5. dependency>
    6. <dependency>
    7. <groupId>org.elasticsearchgroupId>
    8. <artifactId>elasticsearchartifactId>
    9. <version>7.4.0version>
    10. dependency>

    第二步:配置配置类

    1. import org.apache.http.HttpHost;
    2. import org.apache.http.auth.AuthScope;
    3. import org.apache.http.auth.UsernamePasswordCredentials;
    4. import org.apache.http.client.CredentialsProvider;
    5. import org.apache.http.impl.client.BasicCredentialsProvider;
    6. import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
    7. import org.elasticsearch.client.RestClient;
    8. import org.elasticsearch.client.RestClientBuilder;
    9. import org.elasticsearch.client.RestHighLevelClient;
    10. import org.springframework.beans.factory.annotation.Qualifier;
    11. import org.springframework.beans.factory.annotation.Value;
    12. import org.springframework.context.annotation.Bean;
    13. import org.springframework.context.annotation.Configuration;
    14. @Configuration
    15. public class EsConfig {
    16. @Value("${spring.es.addrs.host}")
    17. private String url;
    18. @Value("${spring.es.addrs.port}")
    19. private Integer port;
    20. @Value("${spring.es.username}")
    21. private String username;
    22. @Value("${spring.es.password}")
    23. private String password;
    24. @Bean
    25. @Qualifier("restHighLevelClient")
    26. public RestHighLevelClient restHighLevelClient(){
    27. //需要用户名和密码的认证
    28. final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
    29. credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
    30. RestClientBuilder restClientBuilder = RestClient.builder(new HttpHost(url, port, "http"))
    31. .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
    32. @Override
    33. public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpAsyncClientBuilder) {
    34. return httpAsyncClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
    35. }
    36. });
    37. return new RestHighLevelClient(restClientBuilder);
    38. }
    39. }

    第三步:工具类准备

    1. import cn.hutool.core.bean.BeanUtil;
    2. import com.alibaba.fastjson.JSON;
    3. import lombok.extern.slf4j.Slf4j;
    4. import org.apache.commons.lang3.StringUtils;
    5. import org.elasticsearch.action.bulk.BulkRequest;
    6. import org.elasticsearch.action.bulk.BulkResponse;
    7. import org.elasticsearch.action.delete.DeleteRequest;
    8. import org.elasticsearch.action.search.SearchRequest;
    9. import org.elasticsearch.action.search.SearchResponse;
    10. import org.elasticsearch.action.update.UpdateRequest;
    11. import org.elasticsearch.client.RequestOptions;
    12. import org.elasticsearch.client.RestHighLevelClient;
    13. import org.elasticsearch.client.core.CountRequest;
    14. import org.elasticsearch.client.core.CountResponse;
    15. import org.elasticsearch.common.text.Text;
    16. import org.elasticsearch.search.SearchHit;
    17. import org.elasticsearch.search.SearchHits;
    18. import org.elasticsearch.search.builder.SearchSourceBuilder;
    19. import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
    20. import org.springframework.beans.factory.annotation.Autowired;
    21. import org.springframework.beans.factory.annotation.Qualifier;
    22. import org.springframework.stereotype.Component;
    23. import java.io.IOException;
    24. import java.util.ArrayList;
    25. import java.util.List;
    26. import java.util.Map;
    27. /**
    28. * @Author reshui
    29. * @Description es工具类
    30. * @Date 2023/9/04
    31. * @Version 1.0
    32. */
    33. @Slf4j
    34. @Component
    35. public class EsHandler {
    36. @Autowired
    37. @Qualifier("restHighLevelClient")
    38. private RestHighLevelClient restHighLevelClient;
    39. public SearchHit[] search(String indexName, SearchSourceBuilder builder) throws IOException{
    40. SearchRequest request = new SearchRequest(indexName).source(builder);
    41. SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
    42. //SearchHits提供有关所有匹配的全局信息,例如总命中数或最高分数:
    43. SearchHits hits = response.getHits();
    44. return hits.getHits();
    45. }
    46. public List search(String indexName, SearchSourceBuilder builder,Class clazz,String highlightField) throws IOException{
    47. SearchRequest request = new SearchRequest(indexName).source(builder);
    48. long start = System.currentTimeMillis();
    49. log.info("es 查询开始 ==== index:{} {}",indexName,builder.toString());
    50. SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
    51. long end = System.currentTimeMillis();
    52. log.info("es 查询结束 ==== 命中:{} 耗时:{}",response.getHits().getTotalHits().value,end - start);
    53. //SearchHits提供有关所有匹配的全局信息,例如总命中数或最高分数:
    54. SearchHits hits = response.getHits();
    55. return parseSearchHits(hits.getHits(),clazz,highlightField);
    56. }
    57. public long count(String indexName, SearchSourceBuilder builder) throws IOException{
    58. CountRequest countRequest = new CountRequest(indexName);
    59. countRequest.source(builder);
    60. long start = System.currentTimeMillis();
    61. log.info("es count开始 ==== index:{} {}",indexName,builder.toString());
    62. CountResponse response = restHighLevelClient.count(countRequest, RequestOptions.DEFAULT);
    63. long end = System.currentTimeMillis();
    64. log.info("es count结束 ==== 总量:{} 耗时:{}",response.getCount(),end - start);
    65. return response.getCount();
    66. }
    67. public boolean deleteByIds(String indexName, List list) throws IOException{
    68. //创建批量操作请求
    69. BulkRequest request = new BulkRequest();
    70. for (Integer id : list) {
    71. request.add(new DeleteRequest().index(indexName).id(id.toString()));
    72. }
    73. //根据id批量删除es数据
    74. long start = System.currentTimeMillis();
    75. log.info("es 删除开始 ==== index:{} 数量:{}",indexName,list.size());
    76. BulkResponse response = restHighLevelClient.bulk(request, RequestOptions.DEFAULT);
    77. long end = System.currentTimeMillis();
    78. log.info("es 删除结束 ==== 耗时:{}",end - start);
    79. return true;
    80. }
    81. public boolean updateBulk(String indexName, List list) throws IOException{
    82. //创建批量操作请求
    83. BulkRequest request = new BulkRequest();
    84. for (T t : list) {
    85. Map map = BeanUtil.beanToMap(t);
    86. Object id = map.get("id");
    87. if (id != null){
    88. request.add(new UpdateRequest().index(indexName).id(map.get("id").toString()).doc(map).docAsUpsert(true));
    89. }else {
    90. request.add(new UpdateRequest().index(indexName).doc(map).docAsUpsert(true));
    91. }
    92. }
    93. //根据id批量删除es数据
    94. long start = System.currentTimeMillis();
    95. log.info("es 批量更新开始 ==== index:{} 数量:{}",indexName,list.size());
    96. BulkResponse response = restHighLevelClient.bulk(request, RequestOptions.DEFAULT);
    97. long end = System.currentTimeMillis();
    98. log.info("es 批量更新结束 ==== 耗时:{}",end - start);
    99. return true;
    100. }
    101. public List parseSearchHits(SearchHit[] hits, Class clazz, String highlightField) throws IOException{
    102. List list = new ArrayList<>();
    103. if (hits == null || hits.length == 0){
    104. return list;
    105. }
    106. for (SearchHit hit : hits) {
    107. //获取到结果的map集合
    108. Map map = hit.getSourceAsMap();
    109. //设置高亮
    110. if (!StringUtils.isEmpty(highlightField)){
    111. //获取到高亮字段
    112. Map highlightFields = hit.getHighlightFields();
    113. //将高亮字段的具体内容取出来
    114. HighlightField str = highlightFields.get(highlightField);
    115. if (str != null) {
    116. //得到高亮的字符串内容
    117. Text[] fragments = str.fragments();
    118. String highlight = "";
    119. for (Text fragment : fragments) {
    120. highlight += fragment;
    121. }
    122. //将原本没有高亮的结果集合中的title换为由高亮的
    123. map.put(highlightField,highlight);
    124. }
    125. }
    126. //将map集合转换为实体类
    127. T t = JSON.parseObject(JSON.toJSONString(map), clazz);
    128. list.add(t);
    129. }
    130. return list;
    131. }
    132. }

    第四步:创建索引

    1. public boolean createMapping() {
    2. boolean flag = false;
    3. try {
    4. GetIndexRequest indexRequest = new GetIndexRequest(TEST_INDEX);
    5. boolean exists = client.indices().exists(indexRequest, RequestOptions.DEFAULT);
    6. if (exists) {
    7. return true;
    8. }
    9. //创建mapping
    10. XContentBuilder mappings = XContentFactory.jsonBuilder()
    11. .startObject()
    12. .startObject("properties")
    13. .startObject("id").field("type", "long").field("store", true).endObject()
    14. .startObject("classIds").field("type", "long").field("store", true).endObject()
    15. .startObject("classLevels").field("type", "text").field("store", true).endObject()
    16. .startObject("title").field("type", "text").field("store", true).endObject()
    17. .endObject()
    18. .endObject();
    19. //设置setting
    20. XContentBuilder settings = XContentFactory.jsonBuilder()
    21. .startObject()
    22. .startObject("index").field("max_result_window", 100000).endObject()
    23. .endObject();
    24. //创建索引
    25. CreateIndexRequest request = new CreateIndexRequest(TEST_INDEX);
    26. request.mapping(mappings);
    27. request.settings(settings);
    28. client.indices().create(request, RequestOptions.DEFAULT);
    29. flag = true;
    30. } catch (IOException e) {
    31. e.printStackTrace();
    32. }
    33. return flag;
    34. }

    第五步:简单的使用方法测试

    1. import com.eebbk.task.handler.EsHandler;
    2. import lombok.extern.slf4j.Slf4j;
    3. import org.elasticsearch.index.query.BoolQueryBuilder;
    4. import org.elasticsearch.index.query.QueryBuilders;
    5. import org.elasticsearch.search.builder.SearchSourceBuilder;
    6. import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
    7. import org.junit.jupiter.api.Test;
    8. import org.springframework.boot.test.context.SpringBootTest;
    9. import javax.annotation.Resource;
    10. import java.io.IOException;
    11. import java.util.List;
    12. /**
    13. * @author reshui
    14. * @date 2023/9/4
    15. **/
    16. @Slf4j
    17. @SpringBootTest
    18. public class EsHandlerTest {
    19. @Resource
    20. private EsHandler esHandler;
    21. private String indexName = "test_index";
    22. @Test
    23. void contextLoads() throws IOException {
    24. HighlightBuilder highlightBuilder = new HighlightBuilder();
    25. highlightBuilder.field("title").field("tag");
    26. highlightBuilder.preTags("");
    27. highlightBuilder.postTags("");
    28. SearchSourceBuilder builder = new SearchSourceBuilder().highlighter(highlightBuilder).from(1).size(100);
    29. BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
    30. boolQueryBuilder.must(QueryBuilders.matchPhraseQuery("title","*"+"地球的运动"+"*"));
    31. List result = esHandler.search(indexName, builder.query(boolQueryBuilder), PropertyVo.class, title);
    32. System.out.println(result);
    33. }
    34. }

  • 相关阅读:
    ElasticSearch系列-简介与安装详解
    常用CSS公共样式
    18-云原生监控体系-kube-state-metrics
    华为云云耀云服务器L实例评测|华为云上安装etcd
    STM32——NVIC中断优先级管理分析
    DAY9-深度学习100例-循环神经网络(RNN)实现股票预测
    《算法通关村第一关——链表经典问题之两个链表的第一个公共子节点问题笔记》
    Java.lang.Class类 getInterfaces()方法有什么功能呢?
    2022年金三银四Java后端面试最全攻略,史上最全的Java面试题总汇(附答案)
    文件系统的层次结构,全局结构,虚拟文件系统VFS以及文件挂载
  • 原文地址:https://blog.csdn.net/weixin_42477252/article/details/132665876