前面一篇介紹了使用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"
}
}
}
/**
* 判斷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);
}
}
Es多條件搜尋:
@Autowired
@Qualifier("restHighLevelClient")
RestHighLevelClient client;
/**
* 建立索引
*
* @param index 索引名
*/
@Override
public CommonResult<Boolean> createIndex(String index) {
try {
// 建立一個request
CreateIndexRequest request = new CreateIndexRequest(PMS_ES_PRODUCT);
// 執行request
CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);
return CommonResult.success();
} catch (IOException e) {
log.error("索引" + index + "建立失敗, case = {}", Throwables.getStackTraceAsString(e));
return CommonResult.failed(, "索引" + index + "建立失敗");
}
}
/**
* 判斷索引是否存在
*
* @param index
*/
@Override
public CommonResult<Boolean> judgeIndex(String index) throws IOException {
// 建立一個request
GetIndexRequest request = new GetIndexRequest("PMS_ES_PRODUCT");
// 執行request
Boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
if (!exists) {
return CommonResult.failed("不存在該索引");
}
return CommonResult.success();
}
/**
* 删除索引
*
* @param index
*/
@Override
public CommonResult<Boolean> removeIndex(String index) throws IOException {
// 建立一個request
DeleteIndexRequest request = new DeleteIndexRequest(index);
// 執行request
AcknowledgedResponse response = client.indices().delete(request, RequestOptions.DEFAULT);
log.info("request case = {}", request);
log.info("response case = {}", response);
System.out.println(response);
System.out.println(response.isAcknowledged());
return CommonResult.success();
}
/**
* 添加文檔
*/
@Override
public CommonResult<Boolean> addDocument(String index, Object object) {
IndexRequest request = new IndexRequest("kuang_index");
request.id("2");
request.timeout(TimeValue.timeValueSeconds());
request.timeout("1s");
return null;
}
/**
* 批量插入文檔
* <p>
* 一般真實的項目都會需要批量插入資料。
*/
@Override
public int bulkAddDocument() {
return ;//todo 暫時
}
/**
* 檢查文檔是否存在
*/
@Override
public CommonResult<Boolean> existDocument() {
return null;
}
/**
* 擷取一個文檔
*/
@Override
public CommonResult getDocument() {
return null;
}
/**
* 修改一個文檔
*/
@Override
public CommonResult<Boolean> updateDocument() {
return null;
}
/**
* 删除一個文檔
*/
@Override
public void deleteDocument(Long id) {
}
/**
* 搜尋文檔
*/
@Override
public CommonResult searchDocument() {
return null;
}
@Override
public Page<PmsProduct> search(String keyword, Integer pageNum, Integer pageSize) {
return null;
}
@Override
public CommonPage<PmsEsProduct> searchSoftWare(String keyWord, Integer pageNum, Integer pageSize, Integer productCategoryId, Integer deliverWay,
String runEnvironment, Integer pmsProductSpecs, Integer sort) {
List<PmsEsProduct> mapList = Lists.newArrayList();
CommonPage<PmsEsProduct> pmsProductCommonPage = null;
long totalCount;
try {
SearchRequest searchRequest = new SearchRequest(PMS_ES_PRODUCT);
// 構造搜尋條件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder()
.timeout(new TimeValue(, TimeUnit.SECONDS))
.from((pageNum - ) * pageSize)
.size(pageSize);
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//搜尋篩選條件
boolQueryBuilder.must(QueryBuilders.termQuery("productType", SOFTWARE));
if (null != productCategoryId) {
boolQueryBuilder.must(QueryBuilders.termQuery("productCategoryId", productCategoryId));
}
if (null != deliverWay) {
boolQueryBuilder.must(QueryBuilders.termQuery("deliverWay", deliverWay));
}
if (null != runEnvironment && !"".equals(runEnvironment.trim())) {
boolQueryBuilder.must(QueryBuilders.termQuery("runEnvironment", runEnvironment));
}
if (null != pmsProductSpecs) {
boolQueryBuilder.must(QueryBuilders.termQuery("pmsProductSpecsList.specsName", pmsProductSpecs));
}
if (StringUtils.isEmpty(keyWord)) {
if (null == productCategoryId && null == deliverWay && null == runEnvironment && null == pmsProductSpecs) {
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
}
} else {
boolQueryBuilder.must(QueryBuilders.multiMatchQuery(keyWord, "productCategoryId.keyword", "deliverWay.keyword", "productName", "runEnvironment"));
}
//排序
if (sort != null) {
if (sort.compareTo(AMOUNT_ASC) == ) {
//價格由低到高
searchSourceBuilder.sort("amount", SortOrder.ASC);
}
if (sort.compareTo(AMOUNT_DESC) == ) {
//價格由低到高
searchSourceBuilder.sort("amount", SortOrder.DESC);
}
if (sort.compareTo(SALE_COUNT_ASC) == ) {
//銷量由低到高
searchSourceBuilder.sort("saleCount", SortOrder.ASC);
}
if (sort.compareTo(SALE_COUNT_DESC) == ) {
//銷量由高到低
searchSourceBuilder.sort("saleCount", SortOrder.DESC);
}
if (sort.compareTo(CREATE_TIME_ASC) == ) {
//建立時間由低到高
searchSourceBuilder.sort("createTime.keyword", SortOrder.ASC);
}
if (sort.compareTo(CREATE_TIME_DESC) == ) {
//建立時間由高到低
searchSourceBuilder.sort("createTime.keyword", SortOrder.DESC);
}
}
searchSourceBuilder.query(boolQueryBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHit[] searchHits = searchResponse.getHits().getHits();
totalCount = searchResponse.getHits().getTotalHits().value;
Arrays.stream(searchHits).forEach(hit -> {
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
PmsEsProduct pmsProduct = new PmsEsProduct();
pmsProduct.setId(Integer.valueOf(sourceAsMap.get("id").toString()));
pmsProduct.setProductCategoryId(Integer.valueOf(sourceAsMap.get("productCategoryId").toString()));
pmsProduct.setProductName(sourceAsMap.get("productName").toString());
pmsProduct.setProductLogo(sourceAsMap.get("productLogo").toString());
pmsProduct.setSaleCount(Integer.valueOf(sourceAsMap.get("saleCount").toString()));
pmsProduct.setDescription(sourceAsMap.get("description").toString());
pmsProduct.setViews(Integer.valueOf(sourceAsMap.get("views").toString()));
pmsProduct.setLabelName(sourceAsMap.get("labelName").toString());
pmsProduct.setDeliverWay(Integer.valueOf(sourceAsMap.get("deliverWay").toString()));
pmsProduct.setProviderName(sourceAsMap.get("providerName").toString());
pmsProduct.setAmount(BigDecimal.ZERO);
if (sourceAsMap.get("amount") != null) {
pmsProduct.setAmount(new BigDecimal(sourceAsMap.get("amount").toString()));
}
pmsProduct.setPmsProductSpecsList(sourceAsMap.get("pmsProductSpecsList"));
pmsProduct.setCreateTime(LocalDateTime.parse(sourceAsMap.get("createTime").toString(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
mapList.add(pmsProduct);
}
);
pmsProductCommonPage = CommonPage.restEsPage(mapList, totalCount, pageNum, pageSize);
} catch (Exception e) {
e.printStackTrace();
}
return pmsProductCommonPage;
}
@Override
public CommonPage<PmsEsProduct> searchHardWare(String keyWord, Integer pageNum, Integer pageSize, Integer productCategoryId, Integer sort) {
List<PmsEsProduct> mapList = Lists.newArrayList();
CommonPage<PmsEsProduct> pmsProductCommonPage = null;
long totalCount;
try {
SearchRequest searchRequest = new SearchRequest(PMS_ES_PRODUCT);
// 構造搜尋條件
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder()
.timeout(new TimeValue(, TimeUnit.SECONDS))
.from((pageNum - ) * pageSize)
.size(pageSize);
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//搜尋篩選條件
boolQueryBuilder.must(QueryBuilders.termQuery("productType", HARDWARE));
if (null != productCategoryId) {
boolQueryBuilder.must(QueryBuilders.termQuery("productCategoryId", productCategoryId));
}
if (StringUtils.isEmpty(keyWord)) {
if (null == productCategoryId) {
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
}
} else {
boolQueryBuilder.must(QueryBuilders.multiMatchQuery(keyWord, "productCategoryId.keyword", "productName"));
}
//排序
if (sort != null) {
if (sort.compareTo(AMOUNT_ASC) == ) {
//價格由低到高
searchSourceBuilder.sort("amount", SortOrder.ASC);
}
if (sort.compareTo(AMOUNT_DESC) == ) {
//價格由低到高
searchSourceBuilder.sort("amount", SortOrder.DESC);
}
if (sort.compareTo(SALE_COUNT_ASC) == ) {
//銷量由低到高
searchSourceBuilder.sort("saleCount", SortOrder.ASC);
}
if (sort.compareTo(SALE_COUNT_DESC) == ) {
//銷量由高到低
searchSourceBuilder.sort("saleCount", SortOrder.DESC);
}
if (sort.compareTo(CREATE_TIME_ASC) == ) {
//建立時間由低到高
searchSourceBuilder.sort("createTime.keyword", SortOrder.ASC);
}
if (sort.compareTo(CREATE_TIME_DESC) == ) {
//建立時間由高到低
searchSourceBuilder.sort("createTime.keyword", SortOrder.DESC);
}
}
searchSourceBuilder.query(boolQueryBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHit[] searchHits = searchResponse.getHits().getHits();
totalCount = searchResponse.getHits().getTotalHits().value;
Arrays.stream(searchHits).forEach(hit -> {
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
PmsEsProduct pmsProduct = new PmsEsProduct();
pmsProduct.setId(Integer.valueOf(sourceAsMap.get("id").toString()));
pmsProduct.setProductCategoryId(Integer.valueOf(sourceAsMap.get("productCategoryId").toString()));
pmsProduct.setProductName(sourceAsMap.get("productName").toString());
pmsProduct.setProductLogo(sourceAsMap.get("productLogo").toString());
pmsProduct.setSaleCount(Integer.valueOf(sourceAsMap.get("saleCount").toString()));
pmsProduct.setDescription(sourceAsMap.get("description").toString());
pmsProduct.setViews(Integer.valueOf(sourceAsMap.get("views").toString()));
pmsProduct.setLabelName(sourceAsMap.get("labelName").toString());
pmsProduct.setProviderName(sourceAsMap.get("providerName").toString());
pmsProduct.setAmount(BigDecimal.ZERO);
if (sourceAsMap.get("amount") != null) {
pmsProduct.setAmount(new BigDecimal(sourceAsMap.get("amount").toString()));
}
pmsProduct.setPmsProductSpecsList(sourceAsMap.get("pmsProductSpecsList"));
pmsProduct.setCreateTime(LocalDateTime.parse(sourceAsMap.get("createTime").toString(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
mapList.add(pmsProduct);
}
);
pmsProductCommonPage = CommonPage.restEsPage(mapList, totalCount, pageNum, pageSize);
} catch (Exception e) {
e.printStackTrace();
}
return pmsProductCommonPage;
}