博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringBoot2.x RestClient 操作ElasticSearch 7.x
阅读量:4109 次
发布时间:2019-05-25

本文共 5685 字,大约阅读时间需要 18 分钟。

SpringBoot2.x RestClient 操作ElasticSearch 7.x

本地环境

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 包

.......
org.springframework.boot
spring-boot-starter-data-elasticsearch

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
sourceAsMap = hit.getSourceAsMap(); Map
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(); } } }

转载地址:http://gtlsi.baihongyu.com/

你可能感兴趣的文章
leetcode----105. Construct Binary Tree from Preorder and Inorder Traversal
查看>>
leetcode----106. Construct Binary Tree from Inorder and Postorder Traversal
查看>>
leetcode----109. Convert Sorted List to Binary Search Tree
查看>>
Java实现字典树处理海量数据查重
查看>>
leetcode----113. Path Sum II
查看>>
leetcode----114. Flatten Binary Tree to Linked List
查看>>
leetcode----116. Populating Next Right Pointers in Each Node
查看>>
leetcode----117. Populating Next Right Pointers in Each Node
查看>>
leetcode----120. Triangle
查看>>
leetcode----127. Word Ladder
查看>>
leetcode----129. Sum Root to Leaf Numbers
查看>>
leetcode----130. Surrounded Regions
查看>>
leetcode----131. Palindrome Partitioning
查看>>
leetcode----133. Clone Graph
查看>>
leetcode----134. Gas Station
查看>>
leetcode----137. Single Number II
查看>>
leetcode----138. Copy List with Random Pointer
查看>>
leetcode----139. Word Break
查看>>
leetcode----142. Linked List Cycle II
查看>>
leetcode----143. Reorder List
查看>>