java客户端操作elasticsearch7.3.2版本

[ES7版本系列(一)] Java连接ElasticSearch创建新的索引 1.引入依赖,这里使用的是es的7以上的版本,使用elasticsearch-rest-high-level-client 来创建高级别的客户端 <!-- https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch --> <dependency> <groupId>org.elasticsearch</groupId> <artifa. 阅读详情

前面一篇介绍了使用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==

 

重学SpringBoot3-整合 Elasticsearch 8.x (一)客户端方式 Spring Boot 3 中推荐使用 Spring Data Elasticsearch 提供的客户端来访问 Elasticsearch,而不再使用低层次的 Transport Client。Elasticsearch 8.x 推出后,官方推荐使用 Java REST Client 和 ElasticsearchClient,Spring Data Elasticsearch 也支持这些新的客户端。在 Spring Boot 3 中集成 Elasticsearch 8.x 可以通过多种方式实现,包括。 阅读详情

相关推荐

[ES7版本系列(二)] Java连接ElasticSearch向索引中插入新的数据

1.引入依赖,这里使用的是es的7以上的版本,使用elasticsearch-rest-high-level-client 来创建高级别的客户端 <!-- https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch --> <dependency> <groupId>org.elasticsearch</groupId> <artifac..

寒夜二十五 3818

Elasticsearch版本客户端与服务端版本不一致问题

初学ES,总是遇到一些小问题。今天遇到的问题是,在java中pom.xml导入了 org.elasticsearch elasticsearch 2.3.3 的jar包 在创建client连接时参考api写的代码

兴国-为梦想而战 1万+

app逆向分析案例-95分

先把justtrusmeplus打开设置好95分,开始抓包,得到结果为: https://www.95fenapp.com/api_goods/list/v3.0?is_all=1&keywords=%E7%A7%91%E6%AF%94& page=1&page_size=20 &publish_timestamp=0 &scene=2&scene_type=95fen_android_search_personal&sn=SearchList

weixin_41763171的博客 2741

Elasticsearch 初始化客户端 Java(已解决es链接偶尔断开问题)

一.前言 目前所使用的皆基于Elasticsearch7.6.X版本,使用的客户端连接是官方推荐的Java High Level REST Client;其他连接方式,如需介绍,后面再加入。 二.SpringBoot集成 1.引入pom依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter...

Giggle1994的博客 2682

kali2020.2安装出现的问题并附详细解决办法

kali2020.2的安装

weixin_48776804的博客 3047

【运筹学】什么是基变量?对于线性规划问题中“基”概念的理解(3月3日学习笔记)

在学习《线性规划与目标规划》的过程中,课程的主讲老师郭韧给出了对于基概念的定义如下图 图片来源:运筹学(中国大学mooc网) 由此我产生了几个疑惑:1.如何理解B是线性规划问题的一个基?2.为什么说最多有CnmC_n^mCnm​个基呢?     1.如何理解B是线性规划问题的一个基?1.如何理解B是线性规划问题的一个基?1.如何理解B是线性规划问题的一个基? 在回答第一个...

纸羊同学的博客 3万+

SpringBoot整合新旧版本ElasticSearch及使用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、新版本1.引入依赖2.配置文件3.测试类二、旧版本1.引入依赖2.配置文件3.实体类4.编写Repository5.测试类总结 前言 ElasticSearch整合SpringBoot因为ES版本问题有不同的使用方法,这里写两种。 区分版本信息查看ElasticsearchRepository接口 新版本: 旧版本: 一、新版本 1.引入依赖 提示:exclusion是解决版本冲突问题 <dependen.

无情歌神的博客 4100

探索Vortex开源GPGPU:RISC-V SIMT架构(4-1),Execute SFU(1)

本文详细分析了Vortex RISC-V内核6级流水线中Execute阶段的SFU(特殊功能单元)模块。重点介绍了SFU的数据流结构,包含dispatch_unit、pe_switch、csr_unit、wctl_unit和gather_unit五个子模块。文章深入解析了warp控制指令wspawn和tmc的实现机制:wspawn用于激活指定数量的warp并设置新PC值,tmc则用于控制线程掩码和warp状态。通过C代码和汇编指令的对照分析,阐明了这些指令在并行计算中的关键作用,包括线程激活、状态切换和执行

weixin_55313207的博客 1363

【Elasticsearch】Elasticsearch Clients 内部机制,版本为 6.5.x

概述:Elasticsearch 集群 版本 7.3.3 ,服务器数:140,节点数:270 ,版本 7.3.1,数据总数量为457.4TB,平台每月数据量为60T左右、单索引存储量:月的16T,日的2T。每天实时接口调用大约在5000w次左右,平均每秒请求达到462次,一次请求大约在100ms以内。这些问题是业务方在使用 Elasticsearch Clients 时的常见问题。

ihero的博客 848

别再手动算临界转速了!用ANSYS Workbench 2023 R2快速搞定转子坎贝尔图(附完整APDL命令流)

本文详细介绍了如何利用ANSYS Workbench 2023 R2快速生成转子坎贝尔图,实现全自动临界转速分析。通过对比传统手动计算与Workbench自动化流程的效率差异,展示了其在旋转机械设计中的革命性优势,包括大幅缩短分析周期、提升精度至98.7%。文章还提供了完整的APDL命令流和实战案例,帮助工程师快速掌握这一高效工具。

weixin_42699679的博客 470

S-function入门及案例详解(3)——S-function进阶案例

目录1.案例描述2.案例详解3.输出波形4.对输入参数进行Mask打包 1.案例描述 设计一个蹦极系统 h为离地面高度,输入参数为长度、质量、离地面高度。 2.案例详解 步骤1.可以修改sfuntmpl函数的名称(这里修改为bengji),并在括号内增加输入参数 参数len,weight,dist分别表示长度、质量、离地面高度;长度用来初始化x0,质量用来初始化m,离地面高度用来初始化h。 function [sys,x0,str,ts,simStateCompliance] = bengji(t,x,u

Wendy的博客 1万+

elasticsearch date_讲得最明白的Elasticsearch源码调试环境搭建教程

写在前面使用elasticsearch(以下简称ES)也有挺长时间了,一直想找机会深入源码研究下。我看源码有个习惯,就是一定要运行起来。不是只把源码下载下来看看就行的。搭建整个调试环境几乎花了一整天的功夫,这里记录下,希望能帮到需要的人。环境介绍MAC Mojave系统idea 2019.2JDK版本:jdk12elasticsearch 版本:7.1.0gradle 版本:5.2.1源...

weixin_39518840的博客 230

RSL-RL:开源人形机器人强化学习控制研究库

摘要:RSL-RL是一款专为机器人领域设计的开源强化学习库,其核心特点是紧凑性、可修改性和高性能。该库聚焦PPO和BC两大主流算法,并整合了对称性增强、好奇心驱动等机器人专用技术。通过纯GPU训练优化,RSL-RL在大型仿真中展现出卓越的吞吐性能,已成功应用于腿足运动控制、全身协调等多个机器人研究场景。其轻量级架构包含运行器、算法和网络三个可独立修改的组件,支持TensorBoard等主流日志工具。该框架特别适合需要快速原型开发的机器人研究者,但不适用于通用机器学习基准测试。开源地址:https://git

2506_90492529的博客 1674

springboot基础(36):整合Elasticsearch的各种详细操作

整合Elasticsearch,Java如何操作Elasticsearch代码已分享至Github https://github.com/lengcz/springboot-work/tree/master/springboot-mybatisplus整合Elasticsearch(high-level) 使用的springboot版本2.6.3 使用的Elasticsearch版本是7.17.4,插件安装了IK分词器 需要的依赖,其中elasticsearch-rest-high-level-client

不积跬步,无以至千里 1449

光学测量仿真软件:OpticsBuilder_(9).热应力分析与补偿

在OpticsBuilder中,定义材料的热膨胀系数可以通过API进行。以下是一个Python代码示例,展示如何在OpticsBuilder中定义材料的热膨胀系数。

kkchenjj的博客 1085

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

kafka java es,kafka2x-Elasticsearch 数据同步工具demo

Bboss is a good elasticsearch Java rest client. It operates and accesses elasticsearch in a way similar to mybatis.BBoss Environmental requirementsJDK requirement: JDK 1.7+Elasticsearch version requir...

weixin_39576104的博客 189

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

elasticsearch笔记五:2024最新版ES8Java客户端-Elasticsearch Java 的client API 操作 Elasticsearch client 8.0

低级别的 REST 客户端,通过 http 与集群交互,用户需自己编组请求 JSON 串,及解析响应 JSON 串。兼容所有 ES 版本。高级别的 REST 客户端,基于低级别的 REST 客户端,增加了编组请求 JSON 串、解析响应 JSON 串等相关 api。使用的版本需要保持和 ES 服务端的版本一致,否则会有版本问题。

LoveSummer 2万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Springboot3整合Elasticsearch8(elasticsearch-java)

本文介绍了Elasticsearch Java客户端的选择与使用。推荐使用Elasticsearch Java API Client(7.15+版本)或Spring Data Elasticsearch(SpringBoot 3+),而RestHighLevelClient已废弃。详细讲解了SpringBoot3整合Spring Data Elasticsearch的步骤,包括配置、实体类注解、CRUD操作等核心功能。重点解析了通过继承ElasticsearchRepository实现的分页查询、条件过滤等

TinpeaV的博客 4768

ElasticSearch7.3.1版本-java客户端

刚开始用的elasticsearch-6.4.2版本,经常掉线。不到几小时,服务就停止了。导致需要经常上服务器启动服务。郁闷。 更换了新的版本7.3.1. 发现原来用的jest客户端,也不能查询数据了。因为新版本的ElasticSearch返回的数据格式和旧的不一样。 于是找新的java客户端。 (1)服务器端。 服务端,单节点。操作步骤参考官方。 我是下载的压缩文件。 https:/...

ShangYT的专栏 2550

Elasticsearch连续剧之实战篇Java操作es

大家好!我是狮子,在上几篇文章中,详细介绍了在kibana中操作es,现在我们来看看真实开发中,如何使用Java操作es。这个部分不难理解,就是搞清楚几个对象之前的作用,准确调用方法就好,咱们只需要了解以下用法,需要使用的时候,再查资料就行。但是真实开发中,一般都是使用框架封装好的对象(为咱么省略了好多繁琐步骤。

狮子也疯狂的博客 8979

二、Elasticsearch入门必读指南:到底选择哪个ES版本更合适

为什么写这篇,一是没人讲,二是网上很多同学分享ES相关知识、问题排查等,很多都不讲版本,导致新手在技术选型时不知道选择什么版本,更多的是问题排查时看半天文章却发现版本对不上。所以想通过这篇文章告诉你2024年了,选择什么版本更合适。

caizi1288的专栏 1万+

[ES7版本系列(三)] Java连接ElasticSearch向索引中更新数据

1.引入依赖,这里使用的是es的7以上的版本,使用elasticsearch-rest-high-level-client 来创建高级别的客户端 <!-- https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch --> <dependency> <groupId>org.elasticsearch</groupId> <artifac..

寒夜二十五 2245

Elasticsearch笔记五之java操作es

java操作es集群代码

ty4315的专栏 7万+

Elasticsearch7.10搜索引擎RestHighLevelClient高级客户端整合Springboot基础教程

网络上关于Elasticsearch搜索引擎的教程不少, 但大多数都是比较老旧的, 甚至包括Elasticsearch官网的教程也是很久没有更新, 再加上Elasticsearch本身升级过程中不断的抛弃老旧概念, 新版本完全不兼容旧版本, 所以老旧教程给新入门的童鞋带来很多困惑. 这里使用当前Elasticsearch最新版本7.10.2结合Springboot2.X版本, 使用http rest api接口和RestHighLevelClient高级客户端封装的一些常用接口给新到的童鞋一些参考. 一

u013395802的博客 3994

elasticsearch 使用RestHighLevelClient

因公司使用ES搜索引擎,所以自己研究了几天,目前看网上的帖子五花八门,而且好多版本不用导致不能调用. 顾自己硬着头皮,看官方介绍,逐字翻译api,终于功夫不负有心人,demo可以使用了 本人用es最新版本es-7.2.0,客户端用RestHighLevelClient.还有一个客户端是transportClient客户端,但注意这个客户端将要被弃用.虽然本人开始研究的时候,是这个客户端,但为了...

zhangshng的博客 1万+
上一篇: IntelliJ IDEA 搭建 Spring Boot Maven 多模块项目 亲测
下一篇: elasticsearch7.9 修改指定JDK
Chery Qi
博客等级 码龄10年 154粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值