SpringBoot2.x RestClient 操作ElasticSearch 7.x

SpringBoot2.x RestClient 操作ElasticSearch 7.x

  • 本地环境
  • ES新版和老板差异
    • 7.6.2 版本
    • 老版本
  • 使用 RestClient
    • 导入依赖
    • yml配置
    • rest新建索引文档
    • 判断索引是否存在
    • 查找
    • 高亮

本地环境

Spring Boot 2.2.6
Elasticsearch 7.6.2
写这个文章的原因是
“The well known TransportClient is deprecated as of Elasticsearch 7 and will be removed in Elasticsearch 8. (see the Elasticsearch documentation). Spring Data Elasticsearch will support the TransportClient as long as it is available in the used Elasticsearch version.
We strongly recommend to use the High Level REST Client instead of the TransportClient.”
但是网上关于RestClient的资料却很少

ES新版和老板差异

先说建立索引,新版不允许带有type名,我们通过代码对比,代码很简洁

7.6.2 版本

PUT http://localhost:9200/test/
{
	"mappings":{
		"properties":{
			"id":{
				"type": "long",
				"index": true
			},
			"title":{
				"type": "text"
			}
		}
	}
}

老版本

PUT http://localhost:9200/test/
{
	"mappings":{
		"lalala":{
			"properties":{
				"id":{
					"type": "long",
					"index": true
				},
				"title":{
					"type": "text"
				}
			}
		}
	}
}

还有常用的一点:minimum_match 新版本需要使用 minimum_should_match

使用 RestClient

导入依赖

导入依赖 这个不用说了,以前还需要Jest 包

    	<properties>
    	.......
    	
    	
    	
    	properties>
		<dependency>
           <groupId>org.springframework.bootgroupId>
           <artifactId>spring-boot-starter-data-elasticsearchartifactId>
		dependency>

yml配置

为了和老版本对比jest我没有去掉,事实上jest的uris明确表明已过时

spring:
  elasticsearch:
    jest:
      uris: http://localhost:9200
    rest:
      uris: http://localhost:9200

rest新建索引文档

  • 注意:代码中的JestEntity只是一个普通的实体类,你们可以自己写一个,并不是Jest包中的东西
    下面的代码我没有使用CreateIndexRequest,而是直接创建文档了
	@Autowired
    private RestHighLevelClient restClient;
    
	@Test
    public void testRestCreate(){
  		JestEntity entity = new JestEntity();
        entity.setId(1);
        entity.setTitle("我是文章标题");

        ObjectMapper mapper=new ObjectMapper();
        String source = mapper.writeValueAsString(entity);
        
		// 1. 建立IndexRequest
		//注意这里的type 事实上在es7中就是文档,type已经被弃用
		//这里的source是个json,我懒得引入fastjson用jackson做了
		//如果在xml修改了es版本号,这里可以只写2个变量,index和id
        IndexRequest request = new IndexRequest("test", "_doc", "1")
                .source(source, XContentType.JSON)
                .setRefreshPolicy(IMMEDIATE);
		//发送请求
        try {
            IndexResponse res = restClient.index(request, RequestOptions.DEFAULT);
            System.out.println(res);
        } catch (IOException e) {
            e.printStackTrace();
        }

		// 异步方式
		/*ActionListener listener = new ActionListener() {
            @Override
            public void onResponse(IndexResponse indexResponse) {
                System.out.println("调用完成");
                System.out.println(indexResponse);
            }

            @Override
            public void onFailure(Exception e) {
               e.printStackTrace();
            }
        };

        restClient.indexAsync(request,RequestOptions.DEFAULT,listener);
        */
    }

判断索引是否存在

	@Test
    public void testRestExists(){
    	GetIndexRequest request = new GetIndexRequest("test");
        //注意 我这里用的是indices方法,故意换个方法,让大家了解一下
        CreateIndexResponse res = restClient.indices().exists(request,RequestOptions.DEFAULT);
        System.out.println(res);
    }

查找

	@Test
    public void testRestSearch(){
        SearchRequest searchRequest = new SearchRequest("test");
        //ES7 不需要types 是为了兼容老版本的东西
        //如果写了会抛异常并且卡死在这
        //searchRequest.types("_doc"); 

        SearchSourceBuilder searchSource = new SearchSourceBuilder();
        //匹配所有
        //searchSource.query(QueryBuilders.matchAllQuery());
		//只匹配title
        searchSource.query(QueryBuilders.matchQuery("title", "文章"));

        searchRequest.source(searchSource);

        try {
            SearchResponse res = restClient.search(searchRequest, RequestOptions.DEFAULT);
            System.out.println(res);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

高亮

highlightBuilder.field 新版本必须设置,否则会获取不到高亮内容

@Test
    public void testRestSearch() throws IOException {
        //创建搜索请求
        SearchRequest searchRequest = new SearchRequest("Hoola");
        //searchRequest.types("_doc"); ES7 不需要 是为了兼容老版本的东西

		//创建搜索源
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        
        //创建高亮并设置field
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.field("tag").field("title");//不设置会获取不到
        highlightBuilder.preTags("");
        highlightBuilder.postTags("");

        //设置搜索条件,故意写的复杂一些,让你们看看restClient的搜索
        searchSourceBuilder.query(QueryBuilders.boolQuery().should(QueryBuilders.matchQuery("tag", "抠脚 大汉"))
                        .should(QueryBuilders.matchQuery("title", "蛇皮 香蕉 象拔蚌"))
                .minimumShouldMatch(1)
        ).highlighter(highlightBuilder).from(0).size(10);

		//绑定搜索源
        searchRequest.source(searchSourceBuilder);
        
        SearchResponse res = restClient.search(searchRequest, RequestOptions.DEFAULT);
        
        //获取内容
        for (SearchHit hit:res.getHits().getHits()){
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
            //判断高亮是否存在,存在就替换到map中去
            if (highlightFields.get("title")!=null){
                sourceAsMap.put("title",highlightFields.get("title").fragments());
            }
            if (highlightFields.get("tag")!=null){
                sourceAsMap.put("tag",highlightFields.get("tag").fragments());
            }

            JestEntity jestEntity = new JestEntity();

            try {
                //map数据迁移到实体对象里。
                BeanUtils.populate(jestEntity, sourceAsMap);
                System.out.println(jestEntity);
            } catch (IllegalAccessException|InvocationTargetException e) {
                e.printStackTrace();
            } 
        }
    }

你可能感兴趣的:(Java,Distributed,spring,spring,boot)