天天看点

java客户端操作elasticsearch7.3.2版本

前面一篇介绍了使用kibana操作elasticsearch,使用的版本都是最新版7.3.2,现在我们开始使用java客户端来操作elasticsearch。

一、索引管理

1.1 搭建工程

1.1.1 elasticsearch客户端

elasticsearch提供多种不同的客户端:

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,不过当

前它还处于完善中,有些功能还没有。

本教程准备采用 Java High Level REST Client,如果它有不支持的功能,则使用Java Low Level REST Client。

添加依赖:

<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch‐rest‐high‐level‐client</artifactId>
<version>7.3.2</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.3.2</version>
</dependency>
           

1.1.2 创建搜索工程

1.创建搜索工程(maven工程):xiaomifeng1010_elasticsearch_test,添加RestHighLevelClient依赖及junit依赖。

pom.xml

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
     
        <groupId>com.xiaomifeng1010</groupId>
        <artifactId>elasticsearch_test</artifactId>
        <version>snapshoot1.0</version>
        <packaging>jar</packaging>
     
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.1.RELEASE</version>
        </parent>
        <properties>
            <java.version>1.8</java.version>
            <tomcat.version>8.5.28</tomcat.version>
            <spring-boot.version>2.0.1.RELEASE</spring-boot.version>
            <springframework.version>5.0.5.RELEASE</springframework.version>
            <commons-io.version>2.6</commons-io.version>
            <org.apache.commons.io.version>1.3.2</org.apache.commons.io.version>
            <commons-fileupload.version>1.3.3</commons-fileupload.version>
            <commons-codec.version>1.10</commons-codec.version>
            <commons-lang3.version>3.6</commons-lang3.version>
            <okhttp.version>3.9.1</okhttp.version>
            <lombok.version>1.16.16</lombok.version>
            <springfox-swagger.version>2.7.0</springfox-swagger.version>
            <fastjson.version>1.2.30</fastjson.version>
            <fastdfs-client-java.version>1.27.0.0</fastdfs-client-java.version>
            <guava.version>24.0-jre</guava.version>
            <elasticsearch.version>7.3.2</elasticsearch.version>
        </properties>
        <dependencies>
                <dependency>
                <groupId>com.github.pagehelper</groupId>
                <artifactId>pagehelper-spring-boot-starter</artifactId>
                <version>1.2.4</version>
            </dependency>
            <dependency>
                <groupId>com.squareup.okhttp3</groupId>
                <artifactId>okhttp</artifactId>
                <version>${okhttp.version}</version>
            </dependency>
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>${commons-io.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-io</artifactId>
                <version>${org.apache.commons.io.version}</version>
            </dependency>
            <dependency>
                <groupId>commons-fileupload</groupId>
                <artifactId>commons-fileupload</artifactId>
                <version>${commons-fileupload.version}</version>
            </dependency>
            <dependency>
                <groupId>commons-codec</groupId>
                <artifactId>commons-codec</artifactId>
                <version>${commons-codec.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
                <version>${commons-lang3.version}</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </dependency>
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger2</artifactId>
                <version>${springfox-swagger.version}</version>
            </dependency>
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger-ui</artifactId>
                <version>${springfox-swagger.version}</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>${fastjson.version}</version>
            </dependency>
            <dependency>
                <groupId>net.oschina.zcx7878</groupId>
                <artifactId>fastdfs-client-java</artifactId>
                <version>${fastdfs-client-java.version}</version>
            </dependency>
     
            <dependency>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
                <version>${guava.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <version>${spring-boot.version}</version>
            </dependency>
            <dependency>
                <groupId>org.elasticsearch.client</groupId>
                <artifactId>elasticsearch-rest-high-level-client</artifactId>
                <version>${elasticsearch.version}</version>
            </dependency>
            <dependency>
                <groupId>org.elasticsearch</groupId>
                <artifactId>elasticsearch</artifactId>
                <version>${elasticsearch.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <version>${spring-boot.version}</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
     
    <build>
            <finalName>${project.artifactId}</finalName>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <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>
                </plugin>
            </plugins>
        </build>
     
    </project>
           

2、配置文件

server:
  port: ${port:40100}
spring:
  application:
    name: xiaomifeng1010_elasticsearch_test
xiaomifeng1010:
  elasticsearch:
    hostlist: ${eshostlist:127.0.0.1:9200} #多个结点中间用逗号分隔
           

3、配置类

创建com.xiaomifeng1010.search.config包

在其下创建配置类

package com.xiaomifeng1010.search.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;
 
/**
 * @author Administrator
 * @version 1.0
 **/
@Configuration
public class ElasticsearchConfig {
 
    @Value("${xiaomifeng1010.elasticsearch.hostlist}")
    private String hostlist;
 
    @Bean
    public RestHighLevelClient restHighLevelClient(){
        //解析hostlist配置信息
        String[] split = hostlist.split(",");
        //创建HttpHost数组,其中存放es主机和端口的配置信息
        HttpHost[] httpHostArray = new HttpHost[split.length];
        for(int i=0;i<split.length;i++){
            String item = split[i];
            httpHostArray[i] = new HttpHost(item.split(":")[0], Integer.parseInt(item.split(":")[1]), "http");
        }
        //创建RestHighLevelClient客户端
        return new RestHighLevelClient(RestClient.builder(httpHostArray));
    }
 
    //项目主要使用RestHighLevelClient,对于低级的客户端暂时不用
    @Bean
    public RestClient restClient(){
        //解析hostlist配置信息
        String[] split = hostlist.split(",");
        //创建HttpHost数组,其中存放es主机和端口的配置信息
        HttpHost[] httpHostArray = new HttpHost[split.length];
        for(int i=0;i<split.length;i++){
            String item = split[i];
            httpHostArray[i] = new HttpHost(item.split(":")[0], Integer.parseInt(item.split(":")[1]), "http");
        }
        return RestClient.builder(httpHostArray).build();
    }
 
}
           

启动类

package com.xiaomifeng1010.search;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
 
 
/**
 * @author Administrator
 * @version 1.0
 **/
@SpringBootApplication
public class SearchApplication {
 
    public static void main(String[] args) throws Exception {
        SpringApplication.run(SearchApplication.class, args);
    }
 
}
           

写测试类:

测试索引

package com.xiaomifeng1010.search;
 
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.support.master.AcknowledgedResponse;
import org.elasticsearch.client.IndicesClient;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.XContentType;
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.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
 
/**
 * @author Administrator
 * @version 1.0
 **/
@SpringBootTest
@RunWith(SpringRunner.class)
public class TestIndex {
 
    @Autowired
    RestHighLevelClient client;
 
    @Autowired
    RestClient restClient;
 
    //创建索引库
    @Test
    public void testCreateIndex() throws IOException {
        //创建索引对象
        CreateIndexRequest createIndexRequest = new CreateIndexRequest("elasticsearch_test");
        //设置参数
        createIndexRequest.settings(Settings.builder().put("number_of_shards","1").put("number_of_replicas","0"));
        //指定映射
        createIndexRequest.mapping("doc"," {\n" +
                " \t\"properties\": {\n" +
                "            \"studymodel\":{\n" +
                "             \"type\":\"keyword\"\n" +
                "           },\n" +
                "            \"name\":{\n" +
                "             \"type\":\"keyword\"\n" +
                "           },\n" +
                "           \"description\": {\n" +
                "              \"type\": \"text\",\n" +
                "              \"analyzer\":\"ik_max_word\",\n" +
                "              \"search_analyzer\":\"ik_smart\"\n" +
                "           },\n" +
                "           \"pic\":{\n" +
                "             \"type\":\"text\",\n" +
                "             \"index\":false\n" +
                "           }\n" +
                " \t}\n" +
                "}", XContentType.JSON);
        //操作索引的客户端
        IndicesClient indices = client.indices();
        //执行创建索引库
        CreateIndexResponse createIndexResponse = indices.create(createIndexRequest,RequestOptions.DEFAULT);
        //得到响应
        boolean acknowledged = createIndexResponse.isAcknowledged();
        System.out.println(acknowledged);
 
    }
 
    //删除索引库
    @Test
    public void testDeleteIndex() throws IOException {
        //删除索引对象
        DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("elasticsearch_test");
        //操作索引的客户端
        IndicesClient indices = client.indices();
        //执行删除索引
        AcknowledgedResponse delete = indices.delete(deleteIndexRequest, RequestOptions.DEFAULT);
        //得到响应
        boolean acknowledged = delete.isAcknowledged();
        System.out.println(acknowledged);
 
    }
 
    //添加文档
    @Test
    public void testAddDoc() throws IOException {
        //文档内容
        //准备json数据
        Map<String, Object> jsonMap = new HashMap<>();
        jsonMap.put("name", "spring cloud实战");
        jsonMap.put("description", "本课程主要从四个章节进行讲解: 1.微服务架构入门 2.spring cloud 基础入门 3.实战Spring Boot 4.注册中心eureka。");
        jsonMap.put("studymodel", "201001");
        SimpleDateFormat dateFormat =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        jsonMap.put("timestamp", dateFormat.format(new Date()));
        jsonMap.put("price", 5.6f);
 
        //创建索引创建对象
        IndexRequest indexRequest = new IndexRequest("elasticsearch_test","doc");
        //文档内容
        indexRequest.source(jsonMap);
        //通过client进行http的请求
        IndexResponse indexResponse = client.index(indexRequest,RequestOptions.DEFAULT);
        DocWriteResponse.Result result = indexResponse.getResult();
        System.out.println(result);
 
    }
 
    //查询文档
    @Test
    public void testGetDoc() throws IOException {
        //查询请求对象
        GetRequest getRequest = new GetRequest("elasticsearch_test","_doc","iuJNg20B6mPtB13lIPx0");
        GetResponse getResponse = client.get(getRequest,RequestOptions.DEFAULT);
        //得到文档的内容
        Map<String, Object> sourceAsMap = getResponse.getSourceAsMap();
        System.out.println(sourceAsMap);
    }
}
           

搜索测试类

package com.xiaomifeng1010.search;
 
import org.apache.lucene.search.TotalHits;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.MultiMatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
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.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
 
/**
 * @author Administrator
 * @version 1.0
 **/
@SpringBootTest
@RunWith(SpringRunner.class)
public class TestSearch {
 
    @Autowired
    RestHighLevelClient client;
 
    @Autowired
    RestClient restClient;
 
 
    //搜索全部记录
    @Test
    public void testSearchAll() throws IOException, ParseException {
        //搜索请求对象
        SearchRequest searchRequest = new SearchRequest("elasticsearch_test");
        //指定类型
        searchRequest.types("doc");
        //搜索源构建对象
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //搜索方式
        //matchAllQuery搜索全部
        searchSourceBuilder.query(QueryBuilders.matchAllQuery());
        //设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段
        searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});
        //向搜索请求对象中设置搜索源
        searchRequest.source(searchSourceBuilder);
        //执行搜索,向ES发起http请求
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        //搜索结果
        SearchHits hits = searchResponse.getHits();
        //匹配到的总记录数
        TotalHits totalHits = hits.getTotalHits();
        //得到匹配度高的文档
        SearchHit[] searchHits = hits.getHits();
        //日期格式化对象
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        for(SearchHit hit:searchHits){
            //文档的主键
            String id = hit.getId();
            //源文档内容
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            String name = (String) sourceAsMap.get("name");
            //由于前边设置了源文档字段过虑,这时description是取不到的
            String description = (String) sourceAsMap.get("description");
            //学习模式
            String studymodel = (String) sourceAsMap.get("studymodel");
            //价格
            Double price = (Double) sourceAsMap.get("price");
            //日期
            Date timestamp = dateFormat.parse((String) sourceAsMap.get("timestamp"));
            System.out.println(name);
            System.out.println(studymodel);
            System.out.println(description);
        }
 
    }
 
    //分页查询
    @Test
    public void testSearchPage() throws IOException, ParseException {
        //搜索请求对象
        SearchRequest searchRequest = new SearchRequest("elasticsearch_test");
        //指定类型
        searchRequest.types("doc");
        //搜索源构建对象
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //设置分页参数
        //页码
        int page = 1;
        //每页记录数
        int size = 1;
        //计算出记录起始下标
        int from  = (page-1)*size;
        searchSourceBuilder.from(from);//起始记录下标,从0开始
        searchSourceBuilder.size(size);//每页显示的记录数
        //搜索方式
        //matchAllQuery搜索全部
        searchSourceBuilder.query(QueryBuilders.matchAllQuery());
        //设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段
        searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});
        //向搜索请求对象中设置搜索源
        searchRequest.source(searchSourceBuilder);
        //执行搜索,向ES发起http请求
        SearchResponse searchResponse = client.search(searchRequest,RequestOptions.DEFAULT);
        //搜索结果
        SearchHits hits = searchResponse.getHits();
        //匹配到的总记录数
        TotalHits totalHits = hits.getTotalHits();
        //得到匹配度高的文档
        SearchHit[] searchHits = hits.getHits();
        //日期格式化对象
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        for(SearchHit hit:searchHits){
            //文档的主键
            String id = hit.getId();
            //源文档内容
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            String name = (String) sourceAsMap.get("name");
            //由于前边设置了源文档字段过虑,这时description是取不到的
            String description = (String) sourceAsMap.get("description");
            //学习模式
            String studymodel = (String) sourceAsMap.get("studymodel");
            //价格
            Double price = (Double) sourceAsMap.get("price");
            //日期
            Date timestamp = dateFormat.parse((String) sourceAsMap.get("timestamp"));
            System.out.println(name);
            System.out.println(studymodel);
            System.out.println(description);
        }
 
    }
 
 
    //TermQuery
    @Test
    public void testTermQuery() throws IOException, ParseException {
        //搜索请求对象
        SearchRequest searchRequest = new SearchRequest("elasticsearch_test");
        //指定类型
        searchRequest.types("doc");
        //搜索源构建对象
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //设置分页参数
        //页码
        int page = 1;
        //每页记录数
        int size = 1;
        //计算出记录起始下标
        int from  = (page-1)*size;
        searchSourceBuilder.from(from);//起始记录下标,从0开始
        searchSourceBuilder.size(size);//每页显示的记录数
        //搜索方式
        //termQuery
        searchSourceBuilder.query(QueryBuilders.termQuery("name","spring"));
        //设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段
        searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});
        //向搜索请求对象中设置搜索源
        searchRequest.source(searchSourceBuilder);
        //执行搜索,向ES发起http请求
        SearchResponse searchResponse = client.search(searchRequest,RequestOptions.DEFAULT);
        //搜索结果
        SearchHits hits = searchResponse.getHits();
        //匹配到的总记录数
        TotalHits totalHits = hits.getTotalHits();
        //得到匹配度高的文档
        SearchHit[] searchHits = hits.getHits();
        //日期格式化对象
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        for(SearchHit hit:searchHits){
            //文档的主键
            String id = hit.getId();
            //源文档内容
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            String name = (String) sourceAsMap.get("name");
            //由于前边设置了源文档字段过虑,这时description是取不到的
            String description = (String) sourceAsMap.get("description");
            //学习模式
            String studymodel = (String) sourceAsMap.get("studymodel");
            //价格
            Double price = (Double) sourceAsMap.get("price");
            //日期
            Date timestamp = dateFormat.parse((String) sourceAsMap.get("timestamp"));
            System.out.println(name);
            System.out.println(studymodel);
            System.out.println(description);
        }
 
    }
 
    //根据id查询
    @Test
    public void testTermQueryByIds() throws IOException, ParseException {
        //搜索请求对象
        SearchRequest searchRequest = new SearchRequest("elasticsearch_test");
        //指定类型
        searchRequest.types("doc");
        //搜索源构建对象
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //搜索方式
        //根据id查询
        //定义id
        String[] ids = new String[]{"1","2"};
        searchSourceBuilder.query(QueryBuilders.termsQuery("_id",ids));
        //设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段
        searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});
        //向搜索请求对象中设置搜索源
        searchRequest.source(searchSourceBuilder);
        //执行搜索,向ES发起http请求
        SearchResponse searchResponse = client.search(searchRequest,RequestOptions.DEFAULT);
        //搜索结果
        SearchHits hits = searchResponse.getHits();
        //匹配到的总记录数
        TotalHits totalHits = hits.getTotalHits();
        //得到匹配度高的文档
        SearchHit[] searchHits = hits.getHits();
        //日期格式化对象
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        for(SearchHit hit:searchHits){
            //文档的主键
            String id = hit.getId();
            //源文档内容
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            String name = (String) sourceAsMap.get("name");
            //由于前边设置了源文档字段过虑,这时description是取不到的
            String description = (String) sourceAsMap.get("description");
            //学习模式
            String studymodel = (String) sourceAsMap.get("studymodel");
            //价格
            Double price = (Double) sourceAsMap.get("price");
            //日期
            Date timestamp = dateFormat.parse((String) sourceAsMap.get("timestamp"));
            System.out.println(name);
            System.out.println(studymodel);
            System.out.println(description);
        }
 
    }
 
 
    //MatchQuery
    @Test
    public void testMatchQuery() throws IOException, ParseException {
        //搜索请求对象
        SearchRequest searchRequest = new SearchRequest("elasticsearch_test");
        //指定类型
        searchRequest.types("doc");
        //搜索源构建对象
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
 
        //搜索方式
        //MatchQuery
        searchSourceBuilder.query(QueryBuilders.matchQuery("description","spring开发框架")
                .minimumShouldMatch("80%"));
        //设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段
        searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});
        //向搜索请求对象中设置搜索源
        searchRequest.source(searchSourceBuilder);
        //执行搜索,向ES发起http请求
        SearchResponse searchResponse = client.search(searchRequest,RequestOptions.DEFAULT);
        //搜索结果
        SearchHits hits = searchResponse.getHits();
        //匹配到的总记录数
        TotalHits totalHits = hits.getTotalHits();
        //得到匹配度高的文档
        SearchHit[] searchHits = hits.getHits();
        //日期格式化对象
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        for(SearchHit hit:searchHits){
            //文档的主键
            String id = hit.getId();
            //源文档内容
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            String name = (String) sourceAsMap.get("name");
            //由于前边设置了源文档字段过虑,这时description是取不到的
            String description = (String) sourceAsMap.get("description");
            //学习模式
            String studymodel = (String) sourceAsMap.get("studymodel");
            //价格
            Double price = (Double) sourceAsMap.get("price");
            //日期
            Date timestamp = dateFormat.parse((String) sourceAsMap.get("timestamp"));
            System.out.println(name);
            System.out.println(studymodel);
            System.out.println(description);
        }
 
    }
 
    //MultiMatchQuery
    @Test
    public void testMultiMatchQuery() throws IOException, ParseException {
        //搜索请求对象
        SearchRequest searchRequest = new SearchRequest("elasticsearch_test");
        //指定类型
        searchRequest.types("doc");
        //搜索源构建对象
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
 
        //搜索方式
        //MultiMatchQuery
        searchSourceBuilder.query(QueryBuilders.multiMatchQuery("spring css","name","description")
                .minimumShouldMatch("50%")
                .field("name",10));
        //设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段
        searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});
        //向搜索请求对象中设置搜索源
        searchRequest.source(searchSourceBuilder);
        //执行搜索,向ES发起http请求
        SearchResponse searchResponse = client.search(searchRequest,RequestOptions.DEFAULT);
        //搜索结果
        SearchHits hits = searchResponse.getHits();
        //匹配到的总记录数
        TotalHits totalHits = hits.getTotalHits();
        //得到匹配度高的文档
        SearchHit[] searchHits = hits.getHits();
        //日期格式化对象
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        for(SearchHit hit:searchHits){
            //文档的主键
            String id = hit.getId();
            //源文档内容
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            String name = (String) sourceAsMap.get("name");
            //由于前边设置了源文档字段过虑,这时description是取不到的
            String description = (String) sourceAsMap.get("description");
            //学习模式
            String studymodel = (String) sourceAsMap.get("studymodel");
            //价格
            Double price = (Double) sourceAsMap.get("price");
            //日期
            Date timestamp = dateFormat.parse((String) sourceAsMap.get("timestamp"));
            System.out.println(name);
            System.out.println(studymodel);
            System.out.println(description);
        }
 
    }
 
 
    //BoolQuery
    @Test
    public void testBoolQuery() throws IOException, ParseException {
        //搜索请求对象
        SearchRequest searchRequest = new SearchRequest("elasticsearch_test");
        //指定类型
        searchRequest.types("doc");
        //搜索源构建对象
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
 
        //boolQuery搜索方式
        //先定义一个MultiMatchQuery
        MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("spring css", "name", "description")
                .minimumShouldMatch("50%")
                .field("name", 10);
        //再定义一个termQuery
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("studymodel", "201001");
 
        //定义一个boolQuery
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        boolQueryBuilder.must(multiMatchQueryBuilder);
        boolQueryBuilder.must(termQueryBuilder);
 
        searchSourceBuilder.query(boolQueryBuilder);
        //设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段
        searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});
        //向搜索请求对象中设置搜索源
        searchRequest.source(searchSourceBuilder);
        //执行搜索,向ES发起http请求
        SearchResponse searchResponse = client.search(searchRequest,RequestOptions.DEFAULT);
        //搜索结果
        SearchHits hits = searchResponse.getHits();
        //匹配到的总记录数
        TotalHits totalHits = hits.getTotalHits();
        //得到匹配度高的文档
        SearchHit[] searchHits = hits.getHits();
        //日期格式化对象
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        for(SearchHit hit:searchHits){
            //文档的主键
            String id = hit.getId();
            //源文档内容
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            String name = (String) sourceAsMap.get("name");
            //由于前边设置了源文档字段过虑,这时description是取不到的
            String description = (String) sourceAsMap.get("description");
            //学习模式
            String studymodel = (String) sourceAsMap.get("studymodel");
            //价格
            Double price = (Double) sourceAsMap.get("price");
            //日期
            Date timestamp = dateFormat.parse((String) sourceAsMap.get("timestamp"));
            System.out.println(name);
            System.out.println(studymodel);
            System.out.println(description);
        }
 
    }
 
    //filter
    @Test
    public void testFilter() throws IOException, ParseException {
        //搜索请求对象
        SearchRequest searchRequest = new SearchRequest("elasticsearch_test");
        //指定类型
        searchRequest.types("doc");
        //搜索源构建对象
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
 
        //boolQuery搜索方式
        //先定义一个MultiMatchQuery
        MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("spring css", "name", "description")
                .minimumShouldMatch("50%")
                .field("name", 10);
 
        //定义一个boolQuery
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        boolQueryBuilder.must(multiMatchQueryBuilder);
        //定义过虑器
        boolQueryBuilder.filter(QueryBuilders.termQuery("studymodel","201001"));
        boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(90).lte(100));
 
        searchSourceBuilder.query(boolQueryBuilder);
        //设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段
        searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});
        //向搜索请求对象中设置搜索源
        searchRequest.source(searchSourceBuilder);
        //执行搜索,向ES发起http请求
        SearchResponse searchResponse = client.search(searchRequest,RequestOptions.DEFAULT);
        //搜索结果
        SearchHits hits = searchResponse.getHits();
        //匹配到的总记录数
        TotalHits totalHits = hits.getTotalHits();
        //得到匹配度高的文档
        SearchHit[] searchHits = hits.getHits();
        //日期格式化对象
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        for(SearchHit hit:searchHits){
            //文档的主键
            String id = hit.getId();
            //源文档内容
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            String name = (String) sourceAsMap.get("name");
            //由于前边设置了源文档字段过虑,这时description是取不到的
            String description = (String) sourceAsMap.get("description");
            //学习模式
            String studymodel = (String) sourceAsMap.get("studymodel");
            //价格
            Double price = (Double) sourceAsMap.get("price");
            //日期
            Date timestamp = dateFormat.parse((String) sourceAsMap.get("timestamp"));
            System.out.println(name);
            System.out.println(studymodel);
            System.out.println(description);
        }
 
    }
 
    //Sort
    @Test
    public void testSort() throws IOException, ParseException {
        //搜索请求对象
        SearchRequest searchRequest = new SearchRequest("elasticsearch_test");
        //指定类型
        searchRequest.types("doc");
        //搜索源构建对象
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
 
        //boolQuery搜索方式
        //定义一个boolQuery
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        //定义过虑器
        boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(0).lte(100));
 
        searchSourceBuilder.query(boolQueryBuilder);
        //添加排序
        searchSourceBuilder.sort("studymodel", SortOrder.DESC);
        searchSourceBuilder.sort("price", SortOrder.ASC);
        //设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段
        searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});
        //向搜索请求对象中设置搜索源
        searchRequest.source(searchSourceBuilder);
        //执行搜索,向ES发起http请求
        SearchResponse searchResponse = client.search(searchRequest,RequestOptions.DEFAULT);
        //搜索结果
        SearchHits hits = searchResponse.getHits();
        //匹配到的总记录数
        TotalHits totalHits = hits.getTotalHits();
        //得到匹配度高的文档
        SearchHit[] searchHits = hits.getHits();
        //日期格式化对象
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        for(SearchHit hit:searchHits){
            //文档的主键
            String id = hit.getId();
            //源文档内容
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            String name = (String) sourceAsMap.get("name");
            //由于前边设置了源文档字段过虑,这时description是取不到的
            String description = (String) sourceAsMap.get("description");
            //学习模式
            String studymodel = (String) sourceAsMap.get("studymodel");
            //价格
            Double price = (Double) sourceAsMap.get("price");
            //日期
            Date timestamp = dateFormat.parse((String) sourceAsMap.get("timestamp"));
            System.out.println(name);
            System.out.println(studymodel);
            System.out.println(description);
        }
 
    }
 
    //Highlight
    @Test
    public void testHighlight() throws IOException, ParseException {
        //搜索请求对象
        SearchRequest searchRequest = new SearchRequest("elasticsearch_test");
        //指定类型
        searchRequest.types("doc");
        //搜索源构建对象
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
 
        //boolQuery搜索方式
        //先定义一个MultiMatchQuery
        MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("开发框架", "name", "description")
                .minimumShouldMatch("50%")
                .field("name", 10);
 
        //定义一个boolQuery
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        boolQueryBuilder.must(multiMatchQueryBuilder);
        //定义过虑器
        boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(0).lte(100));
 
        searchSourceBuilder.query(boolQueryBuilder);
        //设置源字段过虑,第一个参数结果集包括哪些字段,第二个参数表示结果集不包括哪些字段
        searchSourceBuilder.fetchSource(new String[]{"name","studymodel","price","timestamp"},new String[]{});
 
        //设置高亮
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.preTags("<tag>");
        highlightBuilder.postTags("</tag>");
        highlightBuilder.fields().add(new HighlightBuilder.Field("name"));
//        highlightBuilder.fields().add(new HighlightBuilder.Field("description"));
        searchSourceBuilder.highlighter(highlightBuilder);
 
        //向搜索请求对象中设置搜索源
        searchRequest.source(searchSourceBuilder);
        //执行搜索,向ES发起http请求
        SearchResponse searchResponse = client.search(searchRequest,RequestOptions.DEFAULT);
        //搜索结果
        SearchHits hits = searchResponse.getHits();
        //匹配到的总记录数
        TotalHits totalHits = hits.getTotalHits();
        //得到匹配度高的文档
        SearchHit[] searchHits = hits.getHits();
        //日期格式化对象
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        for(SearchHit hit:searchHits){
            //文档的主键
            String id = hit.getId();
            //源文档内容
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            //源文档的name字段内容
            String name = (String) sourceAsMap.get("name");
            //取出高亮字段
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
            if(highlightFields!=null){
                //取出name高亮字段
                HighlightField nameHighlightField = highlightFields.get("name");
                if(nameHighlightField!=null){
                    Text[] fragments = nameHighlightField.getFragments();
                    StringBuffer stringBuffer = new StringBuffer();
                    for(Text text:fragments){
                        stringBuffer.append(text);
                    }
                    name = stringBuffer.toString();
                }
            }
 
            //由于前边设置了源文档字段过虑,这时description是取不到的
            String description = (String) sourceAsMap.get("description");
            //学习模式
            String studymodel = (String) sourceAsMap.get("studymodel");
            //价格
            Double price = (Double) sourceAsMap.get("price");
            //日期
            Date timestamp = dateFormat.parse((String) sourceAsMap.get("timestamp"));
            System.out.println(name);
            System.out.println(studymodel);
            System.out.println(description);
        }
 
    }
}
           

 参考:条件更新

/**
	 * 条件更新
	 * 
	 * @return
	 */
	public static long updateQuery() {
		RestHighLevelClient client = getClient();
		//参数为索引名,可以不指定,可以一个,可以多个
		UpdateByQueryRequest request = new UpdateByQueryRequest("hockey");
		// 更新时版本冲突
		request.setConflicts("proceed");
		// 设置查询条件,第一个参数是字段名,第二个参数是字段的值
		request.setQuery(new TermQueryBuilder("first", "sam"));
		// 更新最大文档数
		request.setSize(10);
		// 批次大小
		request.setBatchSize(1000);
//		request.setPipeline("my_pipeline");
 
		request.setScript(new Script(ScriptType.INLINE, "painless",
				"if (ctx._source.first == 'sam') {ctx._source.last = 'update';}", Collections.emptyMap()));
		// 并行
		request.setSlices(2);
		// 使用滚动参数来控制“搜索上下文”存活的时间
		request.setScroll(TimeValue.timeValueMinutes(10));
		// 如果提供路由,则将路由复制到滚动查询,将流程限制为匹配该路由值的切分
//		request.setRouting("=cat");
 
		// 可选参数
		// 超时
		request.setTimeout(TimeValue.timeValueMinutes(2));
		// 刷新索引
		request.setRefresh(true);
 
		try {
			BulkByScrollResponse response = client.updateByQuery(request, RequestOptions.DEFAULT);
			return response.getStatus().getUpdated();
		} catch (IOException e) {
 
			e.printStackTrace();
		} finally {
			try {
				client.close();
			} catch (IOException e) {
 
				e.printStackTrace();
			}
		}
		return -1;
	}
           

修改某个条件下的某个字段值与字段自增

@Configuration
public class ElasticsearchClientConfig {
    @Value("${es.host}")
    public String host;
    @Value("${es.port}")
    public int port;
    @Value("${es.scheme}")
    public String scheme;

    @Bean
    public RestClientBuilder restClientBuilder() {
        return RestClient.builder(makeHttpHost());
    }

    @Bean
    public RestClient restClient() {
        return RestClient.builder(new HttpHost(host, port, scheme)).build();
    }

    private HttpHost makeHttpHost() {
        return new HttpHost(host, port, scheme);
    }

    @Bean
    public RestHighLevelClient restHighLevelClient(@Autowired RestClientBuilder restClientBuilder) {
        return new RestHighLevelClient(restClientBuilder);
    }
}
           
@Override
    public void updateDepartEsInfo(String index, Map<String, Object> queryParam, Map<String, Object> updateParam) {
        StringBuilder script = new StringBuilder();
        Set<Map.Entry<String, Object>> updateSet = updateParam.entrySet();
        for (Map.Entry<String, Object> update : updateSet) {
            script.append("ctx._source.").append(update.getKey()).append("='").append(update.getValue()).append("';");
        }
        updateForScript(index, queryParam, script.toString());
    }

    @Override
    public void selfIncreasing(String index, Map<String, Object> queryParam, Map<String, Object> updateParam) {
        StringBuilder script = new StringBuilder();
        Set<Map.Entry<String, Object>> updateSet = updateParam.entrySet();
        for (Map.Entry<String, Object> update : updateSet) {
            script.append("ctx._source.").append(update.getKey() + "++").append(";");
        }
        updateForScript(index, queryParam, script.toString());
    }

    public void updateForScript(String index, Map<String, Object> queryParam, String script) {
        UpdateByQueryRequest esRequest = new UpdateByQueryRequest(PMS_ES_PRODUCT);
        // 更新时版本冲突
        esRequest.setConflicts("proceed");
        // 设置查询条件,第一个参数是字段名,第二个参数是字段的值
        Set<Map.Entry<String, Object>> querySet = queryParam.entrySet();
        for (Map.Entry<String, Object> query : querySet) {
            esRequest.setQuery(new TermQueryBuilder(query.getKey(), query.getValue()));
        }
        // 刷新索引
        esRequest.setRefresh(true);
        esRequest.setScript(new Script(ScriptType.INLINE, "painless", script, Collections.emptyMap()));
        // 并行
        esRequest.setSlices(2);
        // 超时
        esRequest.setTimeout(TimeValue.timeValueMinutes(2));
        // 刷新索引
        esRequest.setRefresh(true);
        restHighLevelClient.updateByQueryAsync(esRequest, RequestOptions.DEFAULT, new ActionListener<BulkByScrollResponse>() {
            @Override
            public void onResponse(BulkByScrollResponse bulkResponse) {
                log.info("Es参数更新成功:索引=[{}],脚本=[{}]", index, script);
            }

            @Override
            public void onFailure(Exception e) {
                log.info("Es参数更新失败:索引=[{}],脚本=[{}]", index, script);
            }
        });
    }
           
GET pms_product/_search


DELETE /pms_product



POST pms_product/_update_by_query
{
  "script": {
    "source": "ctx._source.views++",
    "lang": "painless"
  },
  "query": {
    "term": {
      "id": "1"
    }
  }
}
           
java客户端操作elasticsearch7.3.2版本
/**
     * 判断Es索引是否存在,不存在则创建
     *
     * @throws IOException
     */
    private void isNotIndex() throws IOException {
        // 创建一个request
        GetIndexRequest getIndexRequest = new GetIndexRequest(PMS_ES_PRODUCT);
        // 执行request
        boolean exists = restHighLevelClient.indices().exists(getIndexRequest, RequestOptions.DEFAULT);
        //判断索引是否存在
        if (!exists) {
            // 创建一个request
            CreateIndexRequest createIndexRequest = new CreateIndexRequest(PMS_ES_PRODUCT);
            // 执行request
            restHighLevelClient.indices().create(createIndexRequest, RequestOptions.DEFAULT);
        }
    }
           
java客户端操作elasticsearch7.3.2版本

 Es多条件搜索:

@Autowired
    @Qualifier("restHighLevelClient")
    RestHighLevelClient client;

    /**
     * 创建索引
     *
     * @param index 索引名
     */
    @Override
    public CommonResult<Boolean> createIndex(String index) {
        try {
            // 创建一个request
            CreateIndexRequest request = new CreateIndexRequest(PMS_ES_PRODUCT);
            // 执行request
            CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);
            return CommonResult.success();
        } catch (IOException e) {
            log.error("索引" + index + "创建失败, case = {}", Throwables.getStackTraceAsString(e));
            return CommonResult.failed(, "索引" + index + "创建失败");
        }
    }

    /**
     * 判断索引是否存在
     *
     * @param index
     */
    @Override
    public CommonResult<Boolean> judgeIndex(String index) throws IOException {
        // 创建一个request
        GetIndexRequest request = new GetIndexRequest("PMS_ES_PRODUCT");
        // 执行request
        Boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
        if (!exists) {
            return CommonResult.failed("不存在该索引");
        }
        return CommonResult.success();
    }

    /**
     * 删除索引
     *
     * @param index
     */
    @Override
    public CommonResult<Boolean> removeIndex(String index) throws IOException {
        // 创建一个request
        DeleteIndexRequest request = new DeleteIndexRequest(index);
        // 执行request
        AcknowledgedResponse response = client.indices().delete(request, RequestOptions.DEFAULT);
        log.info("request case = {}", request);
        log.info("response case = {}", response);
        System.out.println(response);
        System.out.println(response.isAcknowledged());
        return CommonResult.success();
    }

    /**
     * 添加文档
     */
    @Override
    public CommonResult<Boolean> addDocument(String index, Object object) {
        IndexRequest request = new IndexRequest("kuang_index");
        request.id("2");
        request.timeout(TimeValue.timeValueSeconds());
        request.timeout("1s");

        return null;
    }

    /**
     * 批量插入文档
     * <p>
     * 一般真实的项目都会需要批量插入数据。
     */
    @Override
    public int bulkAddDocument() {


        return ;//todo 暂时
    }

    /**
     * 检查文档是否存在
     */
    @Override
    public CommonResult<Boolean> existDocument() {
        return null;
    }

    /**
     * 获取一个文档
     */
    @Override
    public CommonResult getDocument() {
        return null;
    }

    /**
     * 修改一个文档
     */
    @Override
    public CommonResult<Boolean> updateDocument() {
        return null;
    }

    /**
     * 删除一个文档
     */
    @Override
    public void deleteDocument(Long id) {
    }

    /**
     * 搜索文档
     */
    @Override
    public CommonResult searchDocument() {
        return null;
    }

    @Override
    public Page<PmsProduct> search(String keyword, Integer pageNum, Integer pageSize) {
        return null;
    }

    @Override
    public CommonPage<PmsEsProduct> searchSoftWare(String keyWord, Integer pageNum, Integer pageSize, Integer productCategoryId, Integer deliverWay,
                                                   String runEnvironment, Integer pmsProductSpecs, Integer sort) {
        List<PmsEsProduct> mapList = Lists.newArrayList();
        CommonPage<PmsEsProduct> pmsProductCommonPage = null;
        long totalCount;
        try {
            SearchRequest searchRequest = new SearchRequest(PMS_ES_PRODUCT);
            // 构造搜索条件
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder()
                    .timeout(new TimeValue(, TimeUnit.SECONDS))
                    .from((pageNum - ) * pageSize)
                    .size(pageSize);

            BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
            //搜索筛选条件
            boolQueryBuilder.must(QueryBuilders.termQuery("productType", SOFTWARE));
            if (null != productCategoryId) {
                boolQueryBuilder.must(QueryBuilders.termQuery("productCategoryId", productCategoryId));
            }
            if (null != deliverWay) {
                boolQueryBuilder.must(QueryBuilders.termQuery("deliverWay", deliverWay));
            }

            if (null != runEnvironment && !"".equals(runEnvironment.trim())) {
                boolQueryBuilder.must(QueryBuilders.termQuery("runEnvironment", runEnvironment));
            }

            if (null != pmsProductSpecs) {
                boolQueryBuilder.must(QueryBuilders.termQuery("pmsProductSpecsList.specsName", pmsProductSpecs));
            }

            if (StringUtils.isEmpty(keyWord)) {
                if (null == productCategoryId && null == deliverWay && null == runEnvironment && null == pmsProductSpecs) {
                    searchSourceBuilder.query(QueryBuilders.matchAllQuery());
                }
            } else {
                boolQueryBuilder.must(QueryBuilders.multiMatchQuery(keyWord, "productCategoryId.keyword", "deliverWay.keyword", "productName", "runEnvironment"));
            }

            //排序
            if (sort != null) {
                if (sort.compareTo(AMOUNT_ASC) == ) {
                    //价格由低到高
                    searchSourceBuilder.sort("amount", SortOrder.ASC);
                }
                if (sort.compareTo(AMOUNT_DESC) == ) {
                    //价格由低到高
                    searchSourceBuilder.sort("amount", SortOrder.DESC);
                }
                if (sort.compareTo(SALE_COUNT_ASC) == ) {
                    //销量由低到高
                    searchSourceBuilder.sort("saleCount", SortOrder.ASC);
                }
                if (sort.compareTo(SALE_COUNT_DESC) == ) {
                    //销量由高到低
                    searchSourceBuilder.sort("saleCount", SortOrder.DESC);
                }
                if (sort.compareTo(CREATE_TIME_ASC) == ) {
                    //创建时间由低到高
                    searchSourceBuilder.sort("createTime.keyword", SortOrder.ASC);
                }
                if (sort.compareTo(CREATE_TIME_DESC) == ) {
                    //创建时间由高到低
                    searchSourceBuilder.sort("createTime.keyword", SortOrder.DESC);
                }
            }
            searchSourceBuilder.query(boolQueryBuilder);
            searchRequest.source(searchSourceBuilder);

            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
            SearchHit[] searchHits = searchResponse.getHits().getHits();
            totalCount = searchResponse.getHits().getTotalHits().value;
            Arrays.stream(searchHits).forEach(hit -> {
                        Map<String, Object> sourceAsMap = hit.getSourceAsMap();
                        PmsEsProduct pmsProduct = new PmsEsProduct();
                        pmsProduct.setId(Integer.valueOf(sourceAsMap.get("id").toString()));
                        pmsProduct.setProductCategoryId(Integer.valueOf(sourceAsMap.get("productCategoryId").toString()));
                        pmsProduct.setProductName(sourceAsMap.get("productName").toString());
                        pmsProduct.setProductLogo(sourceAsMap.get("productLogo").toString());
                        pmsProduct.setSaleCount(Integer.valueOf(sourceAsMap.get("saleCount").toString()));
                        pmsProduct.setDescription(sourceAsMap.get("description").toString());
                        pmsProduct.setViews(Integer.valueOf(sourceAsMap.get("views").toString()));
                        pmsProduct.setLabelName(sourceAsMap.get("labelName").toString());
                        pmsProduct.setDeliverWay(Integer.valueOf(sourceAsMap.get("deliverWay").toString()));
                        pmsProduct.setProviderName(sourceAsMap.get("providerName").toString());
                        pmsProduct.setAmount(BigDecimal.ZERO);
                        if (sourceAsMap.get("amount") != null) {
                            pmsProduct.setAmount(new BigDecimal(sourceAsMap.get("amount").toString()));
                        }
                        pmsProduct.setPmsProductSpecsList(sourceAsMap.get("pmsProductSpecsList"));
                        pmsProduct.setCreateTime(LocalDateTime.parse(sourceAsMap.get("createTime").toString(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                        mapList.add(pmsProduct);
                    }
            );
            pmsProductCommonPage = CommonPage.restEsPage(mapList, totalCount, pageNum, pageSize);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return pmsProductCommonPage;
    }

    @Override
    public CommonPage<PmsEsProduct> searchHardWare(String keyWord, Integer pageNum, Integer pageSize, Integer productCategoryId, Integer sort) {
        List<PmsEsProduct> mapList = Lists.newArrayList();
        CommonPage<PmsEsProduct> pmsProductCommonPage = null;
        long totalCount;
        try {
            SearchRequest searchRequest = new SearchRequest(PMS_ES_PRODUCT);
            // 构造搜索条件
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder()
                    .timeout(new TimeValue(, TimeUnit.SECONDS))
                    .from((pageNum - ) * pageSize)
                    .size(pageSize);

            BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
            //搜索筛选条件
            boolQueryBuilder.must(QueryBuilders.termQuery("productType", HARDWARE));
            if (null != productCategoryId) {
                boolQueryBuilder.must(QueryBuilders.termQuery("productCategoryId", productCategoryId));
            }

            if (StringUtils.isEmpty(keyWord)) {
                if (null == productCategoryId) {
                    searchSourceBuilder.query(QueryBuilders.matchAllQuery());
                }
            } else {
                boolQueryBuilder.must(QueryBuilders.multiMatchQuery(keyWord, "productCategoryId.keyword", "productName"));
            }

            //排序
            if (sort != null) {
                if (sort.compareTo(AMOUNT_ASC) == ) {
                    //价格由低到高
                    searchSourceBuilder.sort("amount", SortOrder.ASC);
                }
                if (sort.compareTo(AMOUNT_DESC) == ) {
                    //价格由低到高
                    searchSourceBuilder.sort("amount", SortOrder.DESC);
                }
                if (sort.compareTo(SALE_COUNT_ASC) == ) {
                    //销量由低到高
                    searchSourceBuilder.sort("saleCount", SortOrder.ASC);
                }
                if (sort.compareTo(SALE_COUNT_DESC) == ) {
                    //销量由高到低
                    searchSourceBuilder.sort("saleCount", SortOrder.DESC);
                }
                if (sort.compareTo(CREATE_TIME_ASC) == ) {
                    //创建时间由低到高
                    searchSourceBuilder.sort("createTime.keyword", SortOrder.ASC);
                }
                if (sort.compareTo(CREATE_TIME_DESC) == ) {
                    //创建时间由高到低
                    searchSourceBuilder.sort("createTime.keyword", SortOrder.DESC);
                }
            }
            searchSourceBuilder.query(boolQueryBuilder);
            searchRequest.source(searchSourceBuilder);

            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
            SearchHit[] searchHits = searchResponse.getHits().getHits();
            totalCount = searchResponse.getHits().getTotalHits().value;
            Arrays.stream(searchHits).forEach(hit -> {
                        Map<String, Object> sourceAsMap = hit.getSourceAsMap();
                        PmsEsProduct pmsProduct = new PmsEsProduct();
                        pmsProduct.setId(Integer.valueOf(sourceAsMap.get("id").toString()));
                        pmsProduct.setProductCategoryId(Integer.valueOf(sourceAsMap.get("productCategoryId").toString()));
                        pmsProduct.setProductName(sourceAsMap.get("productName").toString());
                        pmsProduct.setProductLogo(sourceAsMap.get("productLogo").toString());
                        pmsProduct.setSaleCount(Integer.valueOf(sourceAsMap.get("saleCount").toString()));
                        pmsProduct.setDescription(sourceAsMap.get("description").toString());
                        pmsProduct.setViews(Integer.valueOf(sourceAsMap.get("views").toString()));
                        pmsProduct.setLabelName(sourceAsMap.get("labelName").toString());
                        pmsProduct.setProviderName(sourceAsMap.get("providerName").toString());
                        pmsProduct.setAmount(BigDecimal.ZERO);
                        if (sourceAsMap.get("amount") != null) {
                            pmsProduct.setAmount(new BigDecimal(sourceAsMap.get("amount").toString()));
                        }
                        pmsProduct.setPmsProductSpecsList(sourceAsMap.get("pmsProductSpecsList"));
                        pmsProduct.setCreateTime(LocalDateTime.parse(sourceAsMap.get("createTime").toString(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                        mapList.add(pmsProduct);
                    }
            );
            pmsProductCommonPage = CommonPage.restEsPage(mapList, totalCount, pageNum, pageSize);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return pmsProductCommonPage;
    }
           
java客户端操作elasticsearch7.3.2版本

继续阅读