RestHighLevelClient操作ES

使用RestHighLevelClient的前提是能夠熟練地通過kibana的requestBody的方式操作es的增刪改查, 基礎(chǔ)扎實(shí), 使用api會(huì)更加容易

以下示例以es 6.8.3基礎(chǔ)環(huán)境,所有api操作針對(duì)的是6版本的es,7版本后對(duì)弱化了類型type,api也會(huì)有所改變,實(shí)際使用時(shí)請(qǐng)根據(jù)具體的es版本做相應(yīng)的調(diào)整

POM

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.es</groupId>
    <artifactId>restclienttest</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>restclienttest</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
    </properties>

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

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </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>6.8.3</version>
        </dependency>

        <!--json解析工具-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.68</version>
        </dependency>
        <!-- commons-lang3 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.10</version>
        </dependency>

        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>6.8.3</version>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.7.RELEASE</version>
                <configuration>
                    <mainClass>com.es.restclienttest.RestclienttestApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

application.properties

# 應(yīng)用名稱
spring.application.name=restclienttest

elasticsearch.schema=http
elasticsearch.address=192.168.146.132:9200
elasticsearch.connectTimeout=5000
elasticsearch.socketTimeout=5000
elasticsearch.connectionRequestTimeout=5000
elasticsearch.maxConnectNum=100
elasticsearch.maxConnectPerRoute=100

配置類

package com.es.restclienttest.config;


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

import java.util.ArrayList;
import java.util.List;

@Configuration
public class EsRestClientConfiguration {
    /** 協(xié)議 */
    @Value("${elasticsearch.schema:http}")
    private String schema;

    /** 集群地址,如果有多個(gè)用“,”隔開 */
    @Value("${elasticsearch.address}")
    private String address;

    /** 連接超時(shí)時(shí)間 */
    @Value("${elasticsearch.connectTimeout}")
    private int connectTimeout;

    /** Socket 連接超時(shí)時(shí)間 */
    @Value("${elasticsearch.socketTimeout}")
    private int socketTimeout;

    /** 獲取連接的超時(shí)時(shí)間 */
    @Value("${elasticsearch.connectionRequestTimeout}")
    private int connectionRequestTimeout;

    /** 最大連接數(shù) */
    @Value("${elasticsearch.maxConnectNum}")
    private int maxConnectNum;

    /** 最大路由連接數(shù) */
    @Value("${elasticsearch.maxConnectPerRoute}")
    private int maxConnectPerRoute;


    @Bean(name = "restHighLevelClient")
    public RestHighLevelClient restHighLevelClient(){
        List<HttpHost> hostList = new ArrayList<>();
        String[] addressArray = address.split(",");
        for (String address : addressArray) {
            String host = address.split(":")[0];
            Integer port = Integer.parseInt(address.split(":")[1]);
            hostList.add(new HttpHost(host, port, schema));
        }

        HttpHost[] httpPosts = hostList.toArray(new HttpHost[]{});
        RestClientBuilder builder = RestClient.builder(httpPosts);

        // 異步連接延時(shí)配置
        builder.setRequestConfigCallback(requestConfigBuilder -> {
            requestConfigBuilder.setConnectTimeout(connectTimeout);
            requestConfigBuilder.setSocketTimeout(socketTimeout);
            requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeout);
            return requestConfigBuilder;
        });

        // 異步連接數(shù)配置
        builder.setHttpClientConfigCallback(httpClientBuilder -> {
            httpClientBuilder.setMaxConnTotal(maxConnectNum);
            httpClientBuilder.setMaxConnPerRoute(maxConnectPerRoute);
            return httpClientBuilder;
        });

        return new RestHighLevelClient(builder);
    }
}

測(cè)試類

package com.es.restclienttest;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.es.restclienttest.bean.Book;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.admin.indices.get.GetIndexRequest;
import org.elasticsearch.action.admin.indices.get.GetIndexResponse;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
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.support.master.AcknowledgedResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.cluster.metadata.MappingMetaData;
import org.elasticsearch.common.collect.ImmutableOpenMap;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.*;
import org.elasticsearch.index.reindex.BulkByScrollResponse;
import org.elasticsearch.index.reindex.DeleteByQueryRequest;
import org.elasticsearch.index.reindex.UpdateByQueryRequest;
import org.elasticsearch.script.Script;
import org.elasticsearch.script.ScriptType;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

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


/**
 * 以下示例以elasticsearch 6.8為基礎(chǔ), 如果是高版本的es, 那么api可能會(huì)有所更改
 * 如 7版本后, 廢棄了一個(gè)索引可以有多個(gè)type的規(guī)則, 一個(gè)索引只能有一個(gè)type
 * 靈活變通, 設(shè)計(jì)思想應(yīng)該大同小異
 */
@SpringBootTest(classes = RestclienttestApplication.class)
//@RunWith(SpringRunner.class)
class RestclienttestApplicationTests {

    // 注入客戶端對(duì)象, 使用的是9200端口(http協(xié)議), 9300使用的是tcp協(xié)議
    @Autowired
    RestHighLevelClient restHighLevelClient;


    @Test
    void contextLoads() {
        System.out.println(restHighLevelClient);
    }

    /**
     * 查詢索引是否存在
     * @throws IOException
     */
    @Test
    void existsIndex() throws IOException {
        GetIndexRequest getIndexRequest = new GetIndexRequest();
        // indices表示索引(名詞), index在restHighLevelClient更多的表示的是建立索引, 動(dòng)詞
        getIndexRequest.indices("dangdang");
        boolean exists = restHighLevelClient.indices().exists(getIndexRequest, RequestOptions.DEFAULT);
        System.out.println("exists: " + exists);
    }

    /**
     * 刪除索引
     * @throws IOException
     */
    @Test
    void deleteIndex() throws IOException {
        DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest();
        deleteIndexRequest.indices("dangdang");
        AcknowledgedResponse delete = restHighLevelClient.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
        System.out.println(delete.isAcknowledged());
    }

    /**
     * 創(chuàng)建索引
     * @throws IOException
     */
    @Test
    void createIndex() throws IOException {
        CreateIndexRequest createIndexRequest = new CreateIndexRequest();
        createIndexRequest.index("dangdang");
        createIndexRequest.settings(Settings.builder().put("index.number_of_shards", 1).put("index.number_of_replicas",1).build());
        String bookMappingJsonString = "{\"properties\":{\"id\":{\"type\":\"keyword\"},\"name\":{\"type\":\"keyword\"},\"desc\":{\"type\":\"text\",\"analyzer\":\"ik_max_word\",\"search_analyzer\":\"ik_max_word\"},\"price\":{\"type\":\"double\"}}}";
        createIndexRequest.mapping("books", bookMappingJsonString, XContentType.JSON);
        CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(createIndexRequest);
        System.out.println(createIndexResponse);
        System.out.println(createIndexResponse.isAcknowledged());
    }

    /**
     * 獲取索引信息
     * @throws IOException
     */
    @Test
    void getIndex() throws IOException {
        GetIndexRequest getIndexRequest = new GetIndexRequest();
        getIndexRequest.indices("dangdang");
        GetIndexResponse getIndexResponse = restHighLevelClient.indices().get(getIndexRequest, RequestOptions.DEFAULT);
        System.out.println(getIndexResponse);
        ImmutableOpenMap<String, ImmutableOpenMap<String, MappingMetaData>> mappings = getIndexResponse.getMappings();
    }

    /**
     * 查詢文檔是否存在
     */
    @Test
    void existsDoc() throws IOException {
        GetRequest getRequest = new GetRequest();
        getRequest.index("dangdang");
        getRequest.type("books");
        getRequest.id("1");
        getRequest.fetchSourceContext(new FetchSourceContext(true));
        boolean exists = restHighLevelClient.exists(getRequest, RequestOptions.DEFAULT);
        System.out.println(exists);
    }

    /**
     * 新增單個(gè)文檔
     */
    @Test
    void addDoc() throws IOException {
        IndexRequest indexRequest = new IndexRequest("dangdang", "books");

        Book book1 = new Book("001", "bookname1",11.11, "book1 desc 哈哈哈");
        indexRequest.id(book1.getId());
        String source = JSONObject.toJSONString(book1);
        indexRequest.source(source, XContentType.JSON);

        IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
        System.out.println(indexResponse);
    }

    /**
     * 批量新增文檔
     */
    @Test
    void bulkAddDoc() throws IOException {
        BulkRequest bulkRequest = new BulkRequest("dangdang", "books");

        IndexRequest indexRequest1 = new IndexRequest();
        Book book1 = new Book("bulk001", "bulkbookname1",11.11, "bulk book1 desc 哈哈哈");
        indexRequest1.id(book1.getId());
        String source1 = JSONObject.toJSONString(book1);
        indexRequest1.source(source1, XContentType.JSON);

        IndexRequest indexRequest2 = new IndexRequest();
        Book book2 = new Book("bulk002", "bulkbookname2",21.11, "bulk book2 desc 哈哈哈");
        indexRequest2.id(book2.getId());
        String source2 = JSONObject.toJSONString(book2);
        indexRequest2.source(source2, XContentType.JSON);

        bulkRequest.add(indexRequest1);
        bulkRequest.add(indexRequest2);

        restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
    }

    /**
     * 通過_id更新文檔
     */
    @Test
    void updateDoc() throws IOException {
        Book book = new Book();
        book.setId("001");
        book.setDesc("修改后的描述book1");
        UpdateRequest updateRequest = new UpdateRequest("dangdang","books",book.getId());
        String source = JSON.toJSONString(book);
        updateRequest.doc(source, XContentType.JSON);
        restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
    }

    /**
     * 批量更新文檔(根據(jù)文檔_id)
     */
    @Test
    void bulkUpdateDoc() throws IOException {
        BulkRequest bulkRequest = new BulkRequest();

        UpdateRequest updateRequest1 = new UpdateRequest();
        updateRequest1.index("dangdang");
        updateRequest1.type("books");
        updateRequest1.id("bulk001");
        HashMap<String, Object> source1 = new HashMap<>();
        source1.put("name", "bulkupdateName1");
        updateRequest1.doc(source1, XContentType.SMILE);

        UpdateRequest updateRequest2 = new UpdateRequest();
        updateRequest2.index("dangdang");
        updateRequest2.type("books");
        updateRequest2.id("bulk002");
        HashMap<String, Object> source2 = new HashMap<>();
        source2.put("name", "bulkupdateName2");
        updateRequest2.doc(source2, XContentType.SMILE);

        bulkRequest.add(updateRequest1);
        bulkRequest.add(updateRequest2);

        restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
    }

    /**
     * 通過查詢條件更新文檔
     */
    @Test
    void updateDocByQuery() throws IOException {
        UpdateByQueryRequest updateByQueryRequest = new UpdateByQueryRequest();
        updateByQueryRequest.indices("dangdang");
        updateByQueryRequest.setDocTypes("books");

        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        List<QueryBuilder> must = boolQueryBuilder.must();
        must.add(QueryBuilders.termQuery("name","bookname1"));
        must.add(QueryBuilders.rangeQuery("price").gte(10).lte(12));

        List<QueryBuilder> should = boolQueryBuilder.should();
        should.add(QueryBuilders.idsQuery("books").addIds("I13i0oIBuvWLJglaqiJQ"));

        // 由于should跟must/filter一起是, 默認(rèn)會(huì)把minimumShouldMatch設(shè)置為0, 因此需要顯式指定, 才能符合業(yè)務(wù)需求
        boolQueryBuilder.minimumShouldMatch(1);

        updateByQueryRequest.setQuery(boolQueryBuilder);

        Map<String, Object> data = new HashMap<>();
        data.put("descAdd","增加---");
        String source = "ctx._source.price=11;ctx._source.desc+=params.data.descAdd";

        Map<String, Object> param = new HashMap<>();
        param.put("data", data);

        Script script = new Script(ScriptType.INLINE, "painless", source, param);
        updateByQueryRequest.setScript(script);

        BulkByScrollResponse bulkByScrollResponse = restHighLevelClient.updateByQuery(updateByQueryRequest, RequestOptions.DEFAULT);
        System.out.println(bulkByScrollResponse);

        restHighLevelClient.close();
    }


    /**
     * 根據(jù)_id刪除文檔
     */
    @Test
    void deleteDoc() throws IOException {
        Book book1 = new Book();
        book1.setId("001");
        DeleteRequest deleteRequest = new DeleteRequest("dangdang", "books", book1.getId());
        DeleteResponse deleteResponse = restHighLevelClient.delete(deleteRequest);
        System.out.println(deleteResponse);
    }
    /**
     * 批量刪除文檔
     */
    @Test
    void bulkDeleteDoc() throws IOException {
        BulkRequest bulkRequest = new BulkRequest();

        DeleteRequest deleteRequest1 = new DeleteRequest();
        deleteRequest1.index("dangdang");
        deleteRequest1.type("books");
        deleteRequest1.id("bulk001");

        DeleteRequest deleteRequest2 = new DeleteRequest();
        deleteRequest2.index("dangdang");
        deleteRequest2.type("books");
        deleteRequest2.id("bulk002");

        bulkRequest.add(deleteRequest1);
        bulkRequest.add(deleteRequest2);

        BulkResponse bulkItemResponses = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
        System.out.println(bulkItemResponses);
    }

    /**
     * 根據(jù)查詢條件刪除文檔
     */
    @Test
    void deleteDocByQuery() throws IOException {
        DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest("dangdang");

        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();

        boolQueryBuilder.mustNot(QueryBuilders.termQuery("name", "bookname1"));

        List<QueryBuilder> should = boolQueryBuilder.should();
        should.add(QueryBuilders.matchQuery("desc", "沒有"));
        should.add(QueryBuilders.idsQuery("books").addIds("IV3Q0oIBuvWLJglaoiJt"));

        deleteByQueryRequest.setQuery(boolQueryBuilder);

        BulkByScrollResponse bulkByScrollResponse = restHighLevelClient.deleteByQuery(deleteByQueryRequest, RequestOptions.DEFAULT);
        System.out.println(bulkByScrollResponse);
    }

    /**
     * get id查詢
     */
    @Test
    void getIdQuery() throws IOException {
        GetRequest getRequest = new GetRequest();

        getRequest.index("dangdang");
        getRequest.type("books");
        getRequest.id("bulk001");

        GetResponse getResponse = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);
        System.out.println(getResponse);
    }

    /**
     * 查詢所有
     */
    @Test
    void matchAllQuery() throws IOException {

        SearchRequest searchRequest = new SearchRequest("dangdang");
        searchRequest.types("books");

        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.query(QueryBuilders.matchAllQuery());
        sourceBuilder.from(0);
        sourceBuilder.size(2);
        sourceBuilder.sort("price", SortOrder.DESC);

        searchRequest.source(sourceBuilder);

        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        System.out.println(searchResponse);
    }


    /**
     * termQuery查詢
     */
    @Test
    void termQuery() throws IOException {

        SearchRequest searchRequest = new SearchRequest("dangdang");
        searchRequest.types("books");

        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.query(QueryBuilders.termQuery("desc","哈哈"));

        searchRequest.source(sourceBuilder);

        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        System.out.println(searchResponse);
    }

    /**
     * match查詢
     */
    @Test
    void matchQuery() throws IOException {
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices("dangdang");
        searchRequest.types("books");

        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("desc", "哈哈哈");
        sourceBuilder.query(matchQueryBuilder);

        searchRequest.source(sourceBuilder);

        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        System.out.println(searchResponse);
    }

    /**
     * bool查詢
     */
    @Test
    void boolQuery() throws IOException {
        SearchRequest searchRequest = new SearchRequest();
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();

        List<QueryBuilder> must = boolQueryBuilder.must();
        must.add(QueryBuilders.termQuery("id", "bulk001"));
        must.add(QueryBuilders.matchQuery("desc", "哈哈哈"));

        List<QueryBuilder> should = boolQueryBuilder.should();
        should.add(QueryBuilders.multiMatchQuery("哈哈", "name", "desc"));
        boolQueryBuilder.minimumShouldMatch(1);

        sourceBuilder.query(boolQueryBuilder);

        searchRequest.source(sourceBuilder);

        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        System.out.println(searchResponse);
    }


    /**
     * filter過濾查詢
     */
    @Test
    void filterlQuery() throws IOException {
        SearchRequest searchRequest = new SearchRequest();
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        BoolQueryBuilder query = QueryBuilders.boolQuery();
        List<QueryBuilder> filter = query.filter();
        filter.add(QueryBuilders.matchQuery("desc", "人"));

        sourceBuilder.query(query);

        searchRequest.source(sourceBuilder);

        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        System.out.println(searchResponse);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容