Elasticsearch Java Client

ES提供多种不同的客户端:
1、TransportClient ES提供的传统客户端,官方计划8.0版本删除此客户端
2、RestClient RestClient是官方推荐使用的,它包括两种:Java Low Level REST Client和 Java High
Level REST Client。 ES在6.0之后提供 Java High Level REST Client, 两种客户端官方更推荐使用 Java
High Level REST Client, 使用时加入对应版本的依赖即可

SpringBoot 中使用 RestClient


<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.3.0</version>
            <exclusions>
                <exclusion>
                    <groupId>org.elasticsearch</groupId>
                    <artifactId>elasticsearch</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>7.3.0</version>
        </dependency>
    </dependencies>

  • 配置文件
spring:
  application:
    name: boot-es-rest-client
mylasticsearch:
  elasticsearch:
    hostlist: 192.168.181.140:9200
  • 配置类
package com.liu.es.config;

import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ElasticsearchConfig {


    @Value("${mylasticsearch.elasticsearch.hostlist}")
    private String hostlist;

    @Bean
    public RestHighLevelClient restHighLevelClient() {
        // 解析hostlist 信息
        String[] split = hostlist.split(",");
        // 创建HttpHost数组  封装es的主机和端口
        HttpHost[] httpHosts = new HttpHost[split.length];
        for (int i = 0; i < split.length; i++) {
            String iterm = split[i];
            httpHosts[i] = new HttpHost(iterm.split(":")[0], Integer.parseInt(iterm.split(":")[1]), "http");
        }
        return new RestHighLevelClient(RestClient.builder(httpHosts));
    }
}

测试

package com.liu.es;

import org.apache.lucene.search.TotalHits;
import org.elasticsearch.action.DocWriteResponse;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchScrollRequest;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.client.IndicesClient;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.Scroll;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


@RunWith(SpringRunner.class)
@SpringBootTest
public class TestIndex {

    @Autowired
    private RestHighLevelClient restHighLevelClient;



    /*
    //创建索引库
PUT /elasticsearch_test
{
"settings": {},
"mappings": {
"properties": {
"description": {
"type": "text",
"analyzer": "ik_max_word"
},
"name": {
"type": "keyword"
},
"pic": {
"type": "text",
"index": false
},
"studymodel": {
"type": "keyword"
}
}
}
} */

    @Test
    public void testCreateIndex() throws IOException {
        // 创建一个索引创建请求对象
        CreateIndexRequest  createIndexRequest  = new CreateIndexRequest("elasticsearch_test");
        //设置映射
        XContentBuilder   builder  = XContentFactory.jsonBuilder()
                .startObject()
                .field("properties")
                .startObject()
                .field("description").startObject().field("type","text").field("analyzer","ik_max_word").endObject()
                .field("name").startObject().field("type","keyword").endObject()
                .field("pic").startObject().field("type","text").field("index","false").endObject()
                .field("studymodel").startObject().field("type","keyword").endObject()
                .endObject()
                .endObject();
        createIndexRequest.mapping("doc",builder);



//        createIndexRequest.mapping("doc","{\n" +
//                "        \"properties\": {\n" +
//                "          \"description\": {\n" +
//                "            \"type\": \"text\",\n" +
//                "            \"analyzer\": \"ik_max_word\"\n" +
//                "          },\n" +
//                "          \"name\": {\n" +
//                "            \"type\": \"keyword\"\n" +
//                "          },\n" +
//                "          \"pic\": {\n" +
//                "            \"type\": \"text\",\n" +
//                "            \"index\": false\n" +
//                "          },\n" +
//                "          \"studymodel\": {\n" +
//                "            \"type\": \"keyword\"\n" +
//                "          }\n" +
//                "        }\n" +
//                "      }", XContentType.JSON);
        // 操作索引的客户端
        IndicesClient  indicesClient  = restHighLevelClient.indices();

        CreateIndexResponse  createIndexResponse = indicesClient.create(createIndexRequest, RequestOptions.DEFAULT);
        // 得到响应
        boolean  acknowledged = createIndexResponse.isAcknowledged();
        System.out.println("创建索引 testCreateIndex  :"+acknowledged);
    }


    @Test
    public void testDeleteIndex() throws IOException {
        // 构建 删除索引库的请求对象
        DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("elasticsearch_test");

        IndicesClient indicesClient = restHighLevelClient.indices();

        AcknowledgedResponse acknowledgedResponse = indicesClient.delete(deleteIndexRequest, RequestOptions.DEFAULT);

        // 得到响应
        System.out.println("删除索引 testDeleteIndex  :"+acknowledgedResponse.isAcknowledged());

    }

    //添加文档
    /*
    POST /elasticsearch_test/_doc/1
    {
      "name": "spring cloud实战",
      "description": "本课程主要从四个章节进行讲解: 1.微服务架构入门 2.spring cloud 基础入门 3.实战Spring Boot 4.注册中心eureka。",
      "studymodel":"201001",
      "timestamp": "2020-08-22 20:09:18",
      "price": 5.6
    }
     */
    @Test
    public void testAddDoc() throws IOException {
        //创建索引对象
        IndexRequest indexRequest =new IndexRequest("elasticsearch_test");

        //indexRequest.id("2");
        // 文档内容  准备json数据
        Map<String,Object> jsonMap = new HashMap<>();
        jsonMap.put("name","spring cloud实战");
        jsonMap.put("description","本课程主要从四个章节进行讲解3: 1.微服务架构入门 2.spring cloud 基础入门 3.实战Spring Boot 4.注册中心eureka。");
        jsonMap.put("studymodel","3101001");
        jsonMap.put("timestamp","2020-07-22 20:09:18");
        jsonMap.put("price",35.6);

        indexRequest.source(jsonMap);


        //执行请求
        IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);

        DocWriteResponse.Result  result = indexResponse.getResult();
        System.out.println(result);


    }

    // 查询文档
    @Test
    public  void testQueryDoc() throws IOException {
        GetRequest getRequest = new GetRequest("elasticsearch_test");
        getRequest.id("1");

        GetResponse getResponse = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);

        System.out.println(getResponse.getSourceAsMap());
    }


    //搜索全部记录
    /*
       GET   /elasticsearch_test/_search
        {
          "query":{
             "match_all":{}
          }
        }
    */
    @Test
    public void testMatchAll() throws IOException {

    //构建搜索请求对象
        SearchRequest searchRequest = new SearchRequest("elasticsearch_test");

        // 搜索源构建对象
        SearchSourceBuilder  searchSourceBuilder = new SearchSourceBuilder();
        // 设置搜索方法
        searchSourceBuilder.query(QueryBuilders.matchAllQuery());

        searchSourceBuilder.fetchSource(new String[]{"name","price","timestamp","description"},new String[]{});

// 请求对象设置 搜索源对象
        searchRequest.source(searchSourceBuilder);

        // 使用client  执行搜索
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        //搜索结果

        SearchHits hits = searchResponse.getHits();

        //获取总记录灵敏
        TotalHits totalHits = hits.getTotalHits();
        System.out.println("查询到的总记录数:"+totalHits.value);


        //获取命中数据
        SearchHit[] searchHits = hits.getHits();

        for (SearchHit  hit : searchHits){
            String  id = hit.getId();
            // 源文档的内容
            Map<String,Object>  sourceMap = hit.getSourceAsMap();
            String  name  = (String)sourceMap.get("name");
            String  timestamp  = (String)sourceMap.get("timestamp");
            String  description  = (String)sourceMap.get("description");
            Double   price  = (Double)sourceMap.get("price");
            System.out.println(id+" \t" +name+" \t "+ timestamp +" \t "+ description +" \t "+price);

        }
    }


    @Test
    public void testTermQuery() throws IOException {

        //构建搜索请求对象
        SearchRequest searchRequest = new SearchRequest("elasticsearch_test");

        // 搜索源构建对象
        SearchSourceBuilder  searchSourceBuilder = new SearchSourceBuilder();
        // 设置搜索方法
        searchSourceBuilder.query(QueryBuilders.termQuery("name","spring cloud实战3"));
//        searchSourceBuilder.query(QueryBuilders.termQuery("description","spring cloud"));
//        searchSourceBuilder.query(QueryBuilders.termQuery("description","spring"));

        searchSourceBuilder.fetchSource(new String[]{"name","price","timestamp","description"},new String[]{});

// 请求对象设置 搜索源对象
        searchRequest.source(searchSourceBuilder);

        // 使用client  执行搜索
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        //搜索结果

        SearchHits hits = searchResponse.getHits();

        //获取总记录灵敏
        TotalHits totalHits = hits.getTotalHits();
        System.out.println("查询到的总记录数:"+totalHits.value);


        //获取命中数据
        SearchHit[] searchHits = hits.getHits();

        for (SearchHit  hit : searchHits){
            String  id = hit.getId();
            // 源文档的内容
            Map<String,Object>  sourceMap = hit.getSourceAsMap();
            String  name  = (String)sourceMap.get("name");
            String  timestamp  = (String)sourceMap.get("timestamp");
            String  description  = (String)sourceMap.get("description");
            Double   price  = (Double)sourceMap.get("price");
            System.out.println(id+" \t" +name+" \t "+ timestamp +" \t "+ description +" \t "+price);

        }
    }

    @Test
    public  void   testSearchAllPage()throws  IOException{

        //构建搜索请求对象
        SearchRequest searchRequest = new SearchRequest("elasticsearch_test");

        // 搜索源构建对象
        SearchSourceBuilder  searchSourceBuilder = new SearchSourceBuilder();
        // 设置搜索方法
        searchSourceBuilder.query(QueryBuilders.matchAllQuery());

        searchSourceBuilder.fetchSource(new String[]{"name","price","timestamp","description"},new String[]{});

        // 设置分页参数
        int  page = 1;
        int  size = 2;
        // 计算出 from
        int  form = (page-1)*size;

        searchSourceBuilder.from(form);
        searchSourceBuilder.size(size);
        searchSourceBuilder.sort("price", SortOrder.DESC);


// 请求对象设置 搜索源对象
        searchRequest.source(searchSourceBuilder);

        // 使用client  执行搜索
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        //搜索结果

        SearchHits hits = searchResponse.getHits();

        //获取总记录灵敏
        TotalHits totalHits = hits.getTotalHits();
        System.out.println("查询到的总记录数:"+totalHits.value);


        //获取命中数据
        SearchHit[] searchHits = hits.getHits();

        for (SearchHit  hit : searchHits){
            String  id = hit.getId();
            // 源文档的内容
            Map<String,Object>  sourceMap = hit.getSourceAsMap();
            String  name  = (String)sourceMap.get("name");
            String  timestamp  = (String)sourceMap.get("timestamp");
            String  description  = (String)sourceMap.get("description");
            Double   price  = (Double)sourceMap.get("price");
            System.out.println(id+" \t" +name+" \t "+ timestamp +" \t "+ description +" \t "+price);

        }
    }
    public List<Map<String,Object> > searchQuestionBO(String scrollId){
        // 搜索请求对象
        SearchRequest  searchRequest = new SearchRequest("elasticsearch_test");
        // 搜索源构建对象
        SearchSourceBuilder  searchSourceBuilder = new SearchSourceBuilder();
        // 设置搜索方法
        searchSourceBuilder.query(QueryBuilders.termQuery("name","spring cloud实战"));
        searchSourceBuilder.fetchSource(new String[]{"name","price","timestamp"},new String[]{});
        // 设置price 降序
        searchSourceBuilder.sort("price",SortOrder.DESC);
        // 请求对象设置 搜索源对象
        searchRequest.source(searchSourceBuilder);
        List<Map<String,Object> > questionBOList = new ArrayList<>();
        SearchResponse searchResponse = null;
        boolean deepSearch = false;
        try {

            deepSearch = true;
            searchRequest.source().size(2);
            final Scroll scroll = new Scroll(TimeValue.timeValueMinutes(30L));
            searchRequest.scroll(scroll);
            searchResponse = restHighLevelClient.search(searchRequest,RequestOptions.DEFAULT);

            SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);
            scrollRequest.scroll(scroll);
            searchResponse = restHighLevelClient.scroll(scrollRequest,RequestOptions.DEFAULT);
            SearchHits searchHits = searchResponse.getHits();
            SearchHit[] searchHit = searchHits.getHits();
            long total = searchHits.getTotalHits().value;
            for (int i = 0;i < searchHit.length;i++) {
                SearchHit item = searchHit[i];
                questionBOList.add(item.getSourceAsMap());
            }
            return questionBOList;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return questionBOList;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值