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"
    }
  }
}

 

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==
/**
     * 判断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);
        }
    }
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 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(500, "索引" + 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(1));
        request.timeout("1s");

        return null;
    }

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


        return 0;//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(60, TimeUnit.SECONDS))
                    .from((pageNum - 1) * 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) == 0) {
                    //价格由低到高
                    searchSourceBuilder.sort("amount", SortOrder.ASC);
                }
                if (sort.compareTo(AMOUNT_DESC) == 0) {
                    //价格由低到高
                    searchSourceBuilder.sort("amount", SortOrder.DESC);
                }
                if (sort.compareTo(SALE_COUNT_ASC) == 0) {
                    //销量由低到高
                    searchSourceBuilder.sort("saleCount", SortOrder.ASC);
                }
                if (sort.compareTo(SALE_COUNT_DESC) == 0) {
                    //销量由高到低
                    searchSourceBuilder.sort("saleCount", SortOrder.DESC);
                }
                if (sort.compareTo(CREATE_TIME_ASC) == 0) {
                    //创建时间由低到高
                    searchSourceBuilder.sort("createTime.keyword", SortOrder.ASC);
                }
                if (sort.compareTo(CREATE_TIME_DESC) == 0) {
                    //创建时间由高到低
                    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(60, TimeUnit.SECONDS))
                    .from((pageNum - 1) * 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) == 0) {
                    //价格由低到高
                    searchSourceBuilder.sort("amount", SortOrder.ASC);
                }
                if (sort.compareTo(AMOUNT_DESC) == 0) {
                    //价格由低到高
                    searchSourceBuilder.sort("amount", SortOrder.DESC);
                }
                if (sort.compareTo(SALE_COUNT_ASC) == 0) {
                    //销量由低到高
                    searchSourceBuilder.sort("saleCount", SortOrder.ASC);
                }
                if (sort.compareTo(SALE_COUNT_DESC) == 0) {
                    //销量由高到低
                    searchSourceBuilder.sort("saleCount", SortOrder.DESC);
                }
                if (sort.compareTo(CREATE_TIME_ASC) == 0) {
                    //创建时间由低到高
                    searchSourceBuilder.sort("createTime.keyword", SortOrder.ASC);
                }
                if (sort.compareTo(CREATE_TIME_DESC) == 0) {
                    //创建时间由高到低
                    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;
    }
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ES7.10的Java客户端操作主要涉及与Elasticsearch进行连接、索引的创建、文档的索引、更新、删除和搜索等操作。 连接Elasticsearch:使用Java客户端连接Elasticsearch需要添加相关依赖,如`TransportClient`或`RestHighLevelClient`。然后通过配置连接信息(如主机地址和端口号)来创建客户端实例,之后便可以使用这个实例来操作Elasticsearch。 创建索引:通过客户端,可以使用`CreateIndexRequest`对象来创建索引。这个请求对象可以设置索引的名称、分片和副本数等参数,然后通过客户端的`indices().create()`方法发送请求并等待响应。 索引文档:使用`IndexRequest`对象来索引文档。设置索引文档的索引名称、文档类型和唯一标识等信息,然后使用客户端的`index()`方法发送请求。如果索引已经存在,会覆盖原有文档。如果不存在,会创建新的索引。 更新文档:使用`UpdateRequest`对象来更新文档。设置需要更新的索引、文档类型和唯一标识,然后使用客户端的`update()`方法发送请求。可以在更新请求中设置更新的字段和新的值等信息。 删除文档:使用`DeleteRequest`对象来删除文档。设置需要删除的索引、文档类型和唯一标识,然后使用客户端的`delete()`方法发送请求。 搜索文档:使用`SearchRequest`对象来搜索文档。设置需要搜索的索引和查询条件等信息,然后使用客户端的`search()`方法发送请求,获取搜索结果。 以上就是ES7.10的Java客户端操作的基本流程和方法。使用Java客户端可以方便地与Elasticsearch进行交互,实现索引的创建、文档的索引、更新、删除和搜索等操作客户端提供了丰富的API和方法,可以根据具体的需求进行灵活的操作

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值