ElasticSearch7.2学习—springboot集成elasticsearch

目录

ES常用Java Client API

1.REST API

2.Transport 连接

Java REST Client介绍

1. ES提供了两个JAVA REST client 版本

2. Java Low Level REST Client 说明

3. Java High Level REST Client 说明

springboot集成

 总结

ES常用Java Client API

1.REST API

http请求,例如,浏览器请求get方法;利用Postman等工具发起REST请求;java 发起httpClient请求等。

2.Transport 连接

socket连接,用官方提供的TransPort客户端,底层是netty。

注意:ES的发展规划中在7.0版本开始将废弃 TransportClient,8.0版本中将完全移除 TransportClient,取而代之的是High Level REST Client。

官网可以了解详情:

https://www.elastic.co/guide/en/elasticsearch/client/index.html

Java REST Client介绍

1. ES提供了两个JAVA REST client 版本

Java Low Level REST Client: 低级别的REST客户端,通过http与集群交互,用户需自己编组请求JSON串,及解析响应JSON串。兼容所有ES版本。
Java High Level REST Client: 高级别的REST客户端,基于低级别的REST客户端,增加了编组请求JSON串、解析响应JSON串等相关api。使用的版本需要保持和ES服务端的版本一致,否则会有版本问题。

官方推荐使用高级版,低级版需要自己准确记住api。

2. Java Low Level REST Client 说明

特点,maven 引入、使用介绍: https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-low.html

API doc :https://artifacts.elastic.co/javadoc/org/elasticsearch/client/elasticsearch-rest-client/6.2.4/index.html.

3. Java High Level REST Client 说明

从6.0.0开始加入的,目的是以java面向对象的方式来进行请求、响应处理。
每个API 支持 同步/异步 两种方式,同步方法直接返回一个结果对象。异步的方法以async为后缀,通过listener参数来通知结果。
高级java REST 客户端依赖Elasticsearch core project

兼容性说明:

依赖 java1.8 和 Elasticsearch core project
请使用与服务端ES版本一致的客户端版本

springboot集成

1.创建springboot项目,在pom.xml文件里面加依赖 

		<dependency>
    		<groupId>org.elasticsearch</groupId>
    		<artifactId>elasticsearch</artifactId>
    		<version>7.2.0</version>
		</dependency>
		<dependency>
    		<groupId>org.elasticsearch.client</groupId>
    		<artifactId>elasticsearch-rest-high-level-client</artifactId>
    		<version>7.2.0</version>
		</dependency>

2.application.yml里面配置elasticsearch信息

server:
  port: 8081
  servlet:
    context-path: /es

elasticsearch: 
  ip: 127.0.0.1:9200

3.创建ElasticsearchRestClient类

@Configuration
public class ElasticsearchRestClient
{
    private static final int ADDRESS_LENGTH = 2;
    private static final String HTTP_SCHEME = "http";
    
    @Value("${elasticsearch.ip}")
    String[] ipAddress;
    
    @Bean
    public RestClientBuilder restClientBuilder() {
        System.err.println(ipAddress);
        HttpHost[] hosts = Arrays.stream(ipAddress)
                .map(this::makeHttpHost)
                .filter(Objects::nonNull)
                .toArray(HttpHost[]::new);
        return RestClient.builder(hosts);
    }

    @Bean(name = "highLevelClient")
    public RestHighLevelClient highLevelClient(@Autowired RestClientBuilder restClientBuilder) {
       //TODO 此处可以进行其它操作
        return new RestHighLevelClient(restClientBuilder);
    }

    
    private HttpHost makeHttpHost(String s) {
        assert StringUtils.isNotEmpty(s);
        String[] address = s.split(":");
        if (address.length == ADDRESS_LENGTH) {
            String ip = address[0];
            int port = Integer.parseInt(address[1]);
            System.err.println(ip+"+"+port);
            return new HttpHost(ip, port, HTTP_SCHEME);
        } else {
            return null;
        }
    }

}

4.创建索引

try
        {
            Map<String, Object> properties = new HashMap<String, Object>();
            Map<String, Object> propertie = new HashMap<String, Object>();
            propertie.put("type", "text"); // 类型
            // propertie.put("index",true);
            propertie.put("analyzer", "ik_max_word"); // 分词器
            properties.put("title", propertie);
            
            XContentBuilder builder = XContentFactory.jsonBuilder();
            builder.startObject()
                .startObject("mappings")
                .startObject("_doc")
                .field("properties", properties)
                .endObject()
                .endObject()
                .startObject("settings")
                .field("number_of_shards", 3)
                .field("number_of_replicas", 1)
                .endObject()
                .endObject();
            
            CreateIndexRequest request = new CreateIndexRequest("demo").source(builder);
            highLevelClient.indices().create(request, RequestOptions.DEFAULT);
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

 5.插入文档

try
        {
            XContentBuilder builder = XContentFactory.jsonBuilder();
            builder.startObject();
            builder.field("title", "我是一条测试文档数据");
            builder.endObject();
            
            IndexRequest request = new IndexRequest("demo").source(builder);
            highLevelClient.index(request, RequestOptions.DEFAULT);
            
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

6.查询文档

Integer pageIndex = 1;
        Integer pageSize = 5;
        String indexName = "demo";
        Map<String, Object> data = new HashMap<>();
        data.put("title", title); 
        
        List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
        SearchRequest searchRequest = new SearchRequest(indexName);
        // searchRequest.types(indexName);
        queryBuilder(pageIndex, pageSize, data, indexName, searchRequest);
        try
        {
            SearchResponse response = highLevelClient.search(searchRequest, RequestOptions.DEFAULT);
            for (SearchHit hit : response.getHits().getHits())
            {
                Map<String, Object> map = hit.getSourceAsMap();
                map.put("id", hit.getId());
                result.add(map);
                
                // 取高亮结果
                Map<String, HighlightField> highlightFields = hit.getHighlightFields();
                HighlightField highlight = highlightFields.get("title");
                Text[] fragments = highlight.fragments(); // 多值的字段会有多个值
                String fragmentString = fragments[0].string();
                System.out.println("高亮:" + fragmentString);
            }
            System.out.println("pageIndex:" + pageIndex);
            System.out.println("pageSize:" + pageSize);
            System.out.println(response.getHits().getTotalHits());
            System.out.println(result.size());
            for (Map<String, Object> map : result)
            {
                System.out.println(map.get("title"));
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }

private void queryBuilder(Integer pageIndex, Integer pageSize, Map<String, Object> query, String indexName,
        SearchRequest searchRequest)
    {
        if (query != null && !query.keySet().isEmpty())
        {
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            if (pageIndex != null && pageSize != null)
            {
                searchSourceBuilder.size(pageSize);
                if (pageIndex <= 0)
                {
                    pageIndex = 0;
                }
                searchSourceBuilder.from((pageIndex - 1) * pageSize);
            }
            BoolQueryBuilder boolBuilder = QueryBuilders.boolQuery();
            query.keySet().forEach(key -> {
                boolBuilder.must(QueryBuilders.matchQuery(key, query.get(key)));
                
            });
            searchSourceBuilder.query(boolBuilder);
            
            HighlightBuilder highlightBuilder = new HighlightBuilder();
            HighlightBuilder.Field highlightTitle =
                new HighlightBuilder.Field("title").preTags("<strong>").postTags("</strong>");
            highlightTitle.highlighterType("unified");
            highlightBuilder.field(highlightTitle);
            searchSourceBuilder.highlighter(highlightBuilder);
            
            searchRequest.source(searchSourceBuilder);
        }
    }

 总结

elasticsearch的java api操作有很多例如聚合操作等,可以参考相关文档学习。这些东西看起来很简单,却很费时间。网上的资料参差不齐,用得elasticsearch版本方式也不尽相同,官网文档有事英文的,真让人头大

 技术交流,软件开发,欢迎微信沟通:

  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值