公司在使用ElasticSearch,放置一些數據,所以打算整理一下基礎知識以及本地實現一下一個demo
一、windows安裝ElasticSearch和kibana(這裏用作es數據可視化)
安裝ElasticSearch
-
安裝jdk1.8+版本
-
下載ElasticSearch
由於官網版本實在是太慢,所以ElasticSearch 7.6的百度雲鏈接:ElasticSearch 7.6提取碼:r80d -
下載解壓後,打開bin文件夾下elasticsearch.bat文件,出現下面畫面則啓動成功打開瀏覽器輸入:127.0.0.1:9200 出現如下頁面則顯示成功
-
如果想多節點運行,可以在Elasticsearch安裝目錄下config目錄下的elasticsearch.yml中添加如下配置:node.max_local_storage_nodes: 10
注:如果出現錯誤信息( MaxDirectMemorySize may have been miscalculated due to JDK-8074459),那證明本機jdk版本過低,可以使用ElasticSearch中自帶的jdk版本。
打開ElasticSearch的bin文件夾下的elasticsearch-env.bat文件,在圖中標紅處添加:set JAVA_HOME="%ES_HOME%\jdk"
jdk9開始cms垃圾收集器已經被標註爲棄用了,所以打開elasticsearch安裝目錄下的config下找到jvm.options文件,將-XX:+UseConcMarkSweepGC改成-XX:+UseG1GC即可
安裝Kibana
-
下載鏈接:百度網盤地址,提取碼:l6nj
-
解壓後執行bin文件夾下Kibana.bat
-
出現下圖訪問:http://127.0.0.1:5601
-
進入es數據區
-
將索引(index)名稱放入標紅位置,然後點擊下一步(next step)
-
按照圖中標紅點擊即可看到es中數據
二、ElasticSearch
簡介
Elasticsearch是一個基於Lucene的搜索服務器。它提供了一個分佈式多用戶能力的全文搜索引擎,基於RESTful web接口.
分佈式字段含義
Elastic 本質上是一個分佈式數據庫,允許多臺服務器協同工作,每臺服務器可以運行多個 Elastic 實例。
單個 Elastic 實例稱爲一個節點(node)。一組節點構成一個集羣(cluster)。
範圍大小:Elastic實例( cluster集羣( node節點 ) )
字段意義
index(索引) -> type(類型) -> id(可以指定或自動生成)-> document (保存的json內容) -> field(json的key)
index可以類比於數據庫 某種相同特性的文檔集合 例如 物品庫
type沒有可以類比的, type可能會用來分辨不同類型的 虛擬物品/實物物品 7.0+版本已經捨棄
id 是某個document的唯一標識
document 文檔 用json的格式來標識,存放於index裏一個type裏 可以理解爲 qq幣 在物品庫的虛擬物品表裏
field 某一個字段值 比如說 q幣表裏的價格字段
常規概念
Es拆分:
Es中存儲大量數據,採用分片的,將一個索引拆分成多個片段,但這多個片段也是索引。
爲什麼要分片?支持橫向擴展,提高性能(因爲是分佈式)
分片備份:每個分片都有主分片(負責寫入),寫入完同步到備份分片
Es集羣:
自動選舉Master,master主要管理,比如說維護索引數據,負責切換備份
Es寫入:
客戶端選擇要一個協調節點(coordinating node )發送請求過去,將請求轉發給對應的node(有分片的),node寫入後同步給備份分片,協調節點就會返回相應結果給客戶端
Es讀取:
根據doc_id查詢,hash後發送請求給任意一個node(這個node會變成協調節點),轉發給對應的node,然後會隨機讀取任一分片和備份的(負載均衡)。node將document返回給協調節點,然後返回給客戶端
Es全文檢索:
將關鍵詞發送請求到node(這個node會變成協調節點),將請求發送給所有shard(主/備 輪詢),都返回給協調節點,協調節點進行合併、排序、分頁等,由最終的doc_id去各個節點拿document返回給客戶端。
三、Springboot和ES結合
項目地址:https://github.com/zz790609619/LeetCodeRecord.git
ES版本 7.6 所以在代碼中沒有type概念的查詢了且Id自動生成
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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<!-- elasticsearch java封裝jar包 下面三個的版本要和本機安裝的ES版本一致 缺一不可-->
<!-- 這裏客戶端使用elasticsearch-rest-high-level-client-->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.6.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.6.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>7.6.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.yml
es:
host: localhost
port: 9200
Es配置類:AlEsConfig.java
package com.example.demo.config;
import org.apache.http.HttpHost;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AlEsConfig {
@Value("${es.host}")
private String host;
@Value("${es.port}")
private Integer port;
/**
* 項目初始化的時候連接ES端口
*/
@Bean("restHighLevelClient")
public RestHighLevelClient restHighLevelClient(){
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
//密碼和用戶名未聲明,所以未使用
//credentialsProvider.setCredentials(AuthScope.ANY,new UsernamePasswordCredentials(account,pwd));
//連接elasticSearch端口
RestClientBuilder builder = RestClient.builder(new HttpHost(host,port,"http"));
return new RestHighLevelClient(builder);
}
}
關聯ES的api幫助類:AlEsClientComponent.java
package com.example.demo.component;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.example.demo.entity.model.es.PageEs;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.support.WriteRequest;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.get.GetResult;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.List;
import java.util.Map;
/**
* @Author ww
* @Date 2020-05-06
*/
@Component
public class AlEsClientComponent {
@Autowired
private RestHighLevelClient restHighLevelClient;
/**
* 插入es 7.0+版本自動生成id 如果是mysql等關係型數據庫則需可以指定id
* 消除type的原因是 因爲即使是不同type中的相同字段的數據類型需要一樣 所以避免誤會,需要去掉type
* @param index 索引
* @param document 文檔內容 json 格式的字符串
* @return null 代表添加失敗 ,有返回值 代表的是文檔的當前版本
*/
public Long save(String index, String document) {
//IndexRequest indexRequest = new IndexRequest(index,type,id);
IndexRequest indexRequest = new IndexRequest(index);
indexRequest.source(document, XContentType.JSON);
indexRequest.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
try {
IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
return indexResponse.getVersion();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 批量插入
* @param index 索引
* @param documentMap key:id val : 文檔內容 json 格式的字符串
* @return true:成功;false :失敗
*/
public boolean batchSave(String index, Map<String, JSONObject> documentMap){
BulkRequest bulkRequest = new BulkRequest();
documentMap.forEach((x,y) ->{
IndexRequest indexRequest = new IndexRequest(index,x);
indexRequest.source(y.toJSONString(), XContentType.JSON);
bulkRequest.add(indexRequest);
});
try {
BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
/**
* 批量更新
* @param index 索引
* @param documentMap key:id val : 文檔內容 json 格式的字符串
* @return true:成功;false :失敗
*/
public boolean batchUpdate(String index, Map<String, JSONObject> documentMap){
BulkRequest bulkRequest = new BulkRequest();
documentMap.forEach((x,y) ->{
UpdateRequest updateRequest = new UpdateRequest(index,x);
updateRequest.doc(y.toJSONString(), XContentType.JSON);
bulkRequest.add(updateRequest);
});
try {
BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
/**
* 批量刪除
* @param deleteRequestList index:索引 type:索引類型 documentMap:{key:id val : 文檔內容 json 格式的字符串}
* @return true:成功;false :失敗
*/
public boolean batchDel(List<DeleteRequest> deleteRequestList){
BulkRequest bulkRequest = new BulkRequest();
deleteRequestList.forEach(x ->{
bulkRequest.add(x);
});
try {
BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
/**
* 通過id 查詢
*
* @param index 索引
* @param id id
* @return null 查詢失敗或者沒有查到數據
*/
public String findById(String index, String id) {
try {
GetResponse getResponse = restHighLevelClient.get(new GetRequest(index, id), RequestOptions.DEFAULT);
if (!getResponse.isSourceEmpty()) {
return getResponse.getSourceAsString();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 修改(如只修改部分字段,不會覆蓋)
* 並返回修改後的文檔版本
*
* @param index 索引
* @param id id
* @param document 文檔
* @return null 查詢失敗或者沒有查到數據,否則返回版本號
*/
public Long updateNoGetResult(String index, String id, String document) {
UpdateRequest updateRequest = new UpdateRequest(index, id);
updateRequest.doc(document, XContentType.JSON);
updateRequest.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
try {
UpdateResponse updateResponse = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
return updateResponse.getVersion();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 修改(如只修改部分字段,不會覆蓋)
* 並返回修改後的文檔
*
* @param index 索引
* @param id id
* @param document 文檔
* @return null: 修改失敗,否則返回該條信息
*/
public String updateAndGetResult(String index, String id, String document) {
UpdateRequest updateRequest = new UpdateRequest(index,id);
updateRequest.doc(document, XContentType.JSON);
updateRequest.fetchSource(true);
updateRequest.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
try {
UpdateResponse updateResponse = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
GetResult getResult = updateResponse.getGetResult();
if (!getResult.isSourceEmpty()) {
return getResult.sourceAsString();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 刪除
* @param index 索引
* @param type 索引類型
* @param id id
* @return true 刪除成功,false 刪除失敗
*/
public boolean del(String index, String type, String id) {
DeleteRequest deleteRequest = new DeleteRequest(index, type, id);
deleteRequest.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
try {
restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
/**
* 多條件搜索
* @param index 索引
* @param queryBuilder 查詢條件 可爲null
* @param size 查詢多少條,默認1000條
* @return
*/
public String search(String index, QueryBuilder queryBuilder,
Integer size){
SearchRequest searchRequest = new SearchRequest(index);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
if(null != queryBuilder){
searchSourceBuilder.query(queryBuilder);
}
if(null == size){
size = 1000;
}
searchSourceBuilder.size(size);
searchRequest.source(searchSourceBuilder);
JSONArray jsonArray = new JSONArray();
try {
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHit[] searchHits = searchResponse.getHits().getHits();
for (SearchHit searchHit : searchHits){
jsonArray.add(JSON.parse(searchHit.getSourceAsString()));
}
} catch (Exception e) {
e.printStackTrace();
}
return jsonArray.toJSONString();
}
/**
* 多條件搜索 排序
* @param index 索引
* @param queryBuilder 查詢條件 可爲null
* @param sortName 排序字段
* @param order 排序規則 SortOrder.ASC:正序;SortOrder.DESC倒序
* @param size 查詢多少條,默認1000條
* @return
*/
public String searchSort(String index, QueryBuilder queryBuilder, String sortName,
SortOrder order, Integer size){
SearchRequest searchRequest = new SearchRequest(index);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
if(null != queryBuilder){
searchSourceBuilder.query(queryBuilder);
}
searchSourceBuilder.sort(sortName, order);
if(null == size){
size = 1000;
}
searchSourceBuilder.size(size);
searchRequest.source(searchSourceBuilder);
JSONArray jsonArray = new JSONArray();
try {
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHit[] searchHits = searchResponse.getHits().getHits();
for (SearchHit searchHit : searchHits){
jsonArray.add(JSON.parse(searchHit.getSourceAsString()));
}
} catch (Exception e) {
e.printStackTrace();
}
return jsonArray.toJSONString();
}
/**
* 分頁 + 條件查詢
* @param pageNum 頁 (從0開始)
* @param pageSize 每頁多少條
* @param index 索引
* @param type 索引類型
* @param queryBuilder 條件 可爲null
* @return null 查詢失敗
*/
public PageEs searchPagination(int pageNum, int pageSize, String index,
QueryBuilder queryBuilder){
SearchRequest searchRequest = new SearchRequest(index);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
if(null != queryBuilder){
searchSourceBuilder.query(queryBuilder);
}
searchSourceBuilder.from(pageNum * pageSize);
searchSourceBuilder.size(pageSize);
searchRequest.source(searchSourceBuilder);
JSONArray jsonArray = new JSONArray();
try {
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHits searchHits = searchResponse.getHits();
SearchHit[] result = searchHits.getHits();
for (SearchHit searchHit : result){
jsonArray.add(JSON.parse(searchHit.getSourceAsString()));
}
PageEs pageEs = new PageEs();
pageEs.setPageSize(pageSize);
pageEs.setResult(jsonArray.toJSONString());
pageEs.setTotal(searchHits.getTotalHits().value);
return pageEs;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 分頁 + 條件查詢 +排序
* @param pageNum 頁 (從0開始)
* @param pageSize 每頁多少條
* @param index 索引
* @param type 索引類型
* @param queryBuilder 條件 可爲null
* @param sortName 排序字段
* @param order 排序規則 SortOrder.ASC:正序;SortOrder.DESC倒序
* @return null 查詢失敗
*/
public PageEs searchPaginationSort(int pageNum, int pageSize, String index,
QueryBuilder queryBuilder, String sortName,
SortOrder order){
SearchRequest searchRequest = new SearchRequest(index);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
if(null != queryBuilder){
searchSourceBuilder.query(queryBuilder);
}
searchSourceBuilder.from(pageNum * pageSize);
searchSourceBuilder.size(pageSize);
searchSourceBuilder.sort(sortName,order);
searchRequest.source(searchSourceBuilder);
JSONArray jsonArray = new JSONArray();
try {
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
SearchHits searchHits = searchResponse.getHits();
SearchHit[] result = searchHits.getHits();
for (SearchHit searchHit : result){
jsonArray.add(JSON.parse(searchHit.getSourceAsString()));
}
PageEs pageEs = new PageEs();
pageEs.setPageSize(pageSize);
pageEs.setResult(jsonArray.toJSONString());
pageEs.setTotal(searchHits.getTotalHits().value);
return pageEs;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
常用查詢方法:EsController.java
package com.example.demo.controller;
import com.aliyun.openservices.shade.com.alibaba.fastjson.JSON;
import com.example.demo.component.AlEsClientComponent;
import com.example.demo.entity.SubmitUserPayOrderRequest;
import org.elasticsearch.index.query.MatchAllQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RestController
public class EsController {
@Autowired
AlEsClientComponent alEsClientComponent;
/**
* 插入es
* @param userPayOrderRequest 訂單詳情
* @return
*/
@PostMapping("/es/submit")
public String submit(@RequestBody SubmitUserPayOrderRequest userPayOrderRequest){
Long result=alEsClientComponent.save("zz", JSON.toJSONString((userPayOrderRequest)));
return String.valueOf(result);
}
/**
* 查詢es
* @param
* @return
*/
@PostMapping("/es/search")
public String search(){
/**
* matchAllQuery() :匹配全部文檔
* matchQuery(String name,Object text)匹配單個字段,匹配字段名爲filedname,值爲value的文檔
* multiMatchQuery(Object text, String... fieldNames):多個字段匹配某一個值
* wildcardQuery():模糊查詢 (?匹配單個字符,*匹配多個字符)
* BoolQueryBuilder:複合查詢 使用must
*/
Map<String,String> result=new HashMap<>();
//匹配所有文檔 參數列表(字段名稱或者value值)
MatchAllQueryBuilder bqb = QueryBuilders.matchAllQuery().queryName("payAblAmount");
String matchAllQueryResult=alEsClientComponent.search("ww",bqb,10);
result.put("matchAllQueryResult",matchAllQueryResult);
//分詞查詢 text爲中文,matchPhraseQuery/matchPhraseQueryResult都可以查詢
QueryBuilder matchPhraseQuery=QueryBuilders.matchPhraseQuery("id","三大");
String matchPhraseQueryResult=alEsClientComponent.search("zz",matchPhraseQuery,10);
result.put("matchPhraseQueryResult",matchPhraseQueryResult);
//text爲英文,matchPhrasePrefixQuery適用於英文 一般在存儲的時候會默認把英文按照單詞分詞
QueryBuilder matchPhrasePrefixQuery=QueryBuilders.matchPhrasePrefixQuery("id","text");
String matchPhrasePrefixQueryResult=alEsClientComponent.search("zz",matchPhrasePrefixQuery,10);
result.put("matchPhrasePrefixQueryResult",matchPhrasePrefixQueryResult);
//匹配字段數據 es中index:zz,column:id text:阿三大蘇打 三蘇也能查詢到這條數據
QueryBuilder matchQuery=QueryBuilders.matchQuery("id","三蘇");
String matchQueryResult=alEsClientComponent.search("zz",matchQuery,10);
result.put("matchQueryResult",matchQueryResult);
//將text匹配多個字段 參數列表(text,Field1,Field2,Field3,Field4........)
QueryBuilder multiMatchQuery=QueryBuilders.multiMatchQuery("1","id","status");
String multiMatchQueryResult=alEsClientComponent.search("zz",multiMatchQuery,10);
result.put("multiMatchQueryResult",multiMatchQueryResult);
//模糊查詢 由於分詞關係 (?匹配單個字符,*匹配多個字符) 中文只能查詢單個字 而英文可以任意長度
QueryBuilder wildcardQuery=QueryBuilders.wildcardQuery("id","*extzzwq*");
String wildcardQueryResult=alEsClientComponent.search("zz",wildcardQuery,10);
result.put("wildcardQueryResult",wildcardQueryResult);
//複合查詢 must的意義等同sql查詢中的and must的參數爲上面任意一個QueryBuilder
QueryBuilder BoolQueryBuilder=QueryBuilders.boolQuery().must(matchPhraseQuery).must(matchQuery);
String BoolQueryBuilderResult=alEsClientComponent.search("zz",BoolQueryBuilder,10);
result.put("BoolQueryBuilderResult",BoolQueryBuilderResult);
return JSON.toJSONString(result);
}
}
查詢結果:
{
"matchPhraseQueryResult": "[{\"payAblAmount\":0.01,\"freeAmount\":0.0,\"payType\":0,\"merchantId\":811001,\"userPayId\":232109,\"discountAmount\":0.0,\"amountOfConsumption\":0.01,\"id\":\"這些阿三大蘇打\",\"channelId\":3,\"status\":1}]",
"matchPhrasePrefixQueryResult": "[{\"payAblAmount\":0.01,\"freeAmount\":0.0,\"payType\":0,\"merchantId\":811001,\"userPayId\":232109,\"discountAmount\":0.0,\"amountOfConsumption\":0.01,\"id\":\"textzzwqe\",\"channelId\":3,\"status\":1}]",
"multiMatchQueryResult": "[{\"payAblAmount\":0.01,\"freeAmount\":0.0,\"payType\":0,\"merchantId\":811001,\"userPayId\":232109,\"discountAmount\":0.0,\"amountOfConsumption\":0.01,\"id\":\"20191212095406497_232102_3042\",\"channelId\":3,\"status\":1},{\"payAblAmount\":0.01,\"freeAmount\":0.0,\"payType\":0,\"merchantId\":811001,\"userPayId\":232109,\"discountAmount\":0.0,\"amountOfConsumption\":0.01,\"id\":\"這些阿三大蘇打\",\"channelId\":3,\"status\":1},{\"payAblAmount\":0.01,\"freeAmount\":0.0,\"payType\":0,\"merchantId\":811001,\"userPayId\":232109,\"discountAmount\":0.0,\"amountOfConsumption\":0.01,\"id\":\"薩達薩達薩達去三\",\"channelId\":3,\"status\":1},{\"payAblAmount\":0.01,\"freeAmount\":0.0,\"payType\":0,\"merchantId\":811001,\"userPayId\":232109,\"discountAmount\":0.0,\"amountOfConsumption\":0.01,\"id\":\"asdfghjkl\",\"channelId\":3,\"status\":1},{\"payAblAmount\":0.01,\"freeAmount\":0.0,\"payType\":0,\"merchantId\":811001,\"userPayId\":232109,\"discountAmount\":0.0,\"amountOfConsumption\":0.01,\"id\":\"axcvbn\",\"channelId\":3,\"status\":1},{\"payAblAmount\":0.01,\"freeAmount\":0.0,\"payType\":0,\"merchantId\":811001,\"userPayId\":232109,\"discountAmount\":0.0,\"amountOfConsumption\":0.01,\"id\":\"textzzwqe\",\"channelId\":3,\"status\":1}]",
"matchQueryResult": "[{\"payAblAmount\":0.01,\"freeAmount\":0.0,\"payType\":0,\"merchantId\":811001,\"userPayId\":232109,\"discountAmount\":0.0,\"amountOfConsumption\":0.01,\"id\":\"這些阿三大蘇打\",\"channelId\":3,\"status\":1},{\"payAblAmount\":0.01,\"freeAmount\":0.0,\"payType\":0,\"merchantId\":811001,\"userPayId\":232109,\"discountAmount\":0.0,\"amountOfConsumption\":0.01,\"id\":\"薩達薩達薩達去三\",\"channelId\":3,\"status\":1}]",
"wildcardQueryResult": "[{\"payAblAmount\":0.01,\"freeAmount\":0.0,\"payType\":0,\"merchantId\":811001,\"userPayId\":232109,\"discountAmount\":0.0,\"amountOfConsumption\":0.01,\"id\":\"textzzwqe\",\"channelId\":3,\"status\":1}]",
"BoolQueryBuilderResult": "[{\"payAblAmount\":0.01,\"freeAmount\":0.0,\"payType\":0,\"merchantId\":811001,\"userPayId\":232109,\"discountAmount\":0.0,\"amountOfConsumption\":0.01,\"id\":\"這些阿三大蘇打\",\"channelId\":3,\"status\":1}]",
"matchAllQueryResult": "[{\"payAblAmount\":0.01,\"freeAmount\":0.0,\"payType\":0,\"merchantId\":811001,\"userPayId\":232109,\"discountAmount\":0.0,\"amountOfConsumption\":0.01,\"id\":\"20191212095406497_232102_3042\",\"channelId\":3,\"status\":1},{\"payAblAmount\":0.01,\"freeAmount\":0.0,\"payType\":0,\"merchantId\":811001,\"userPayId\":232109,\"discountAmount\":0.0,\"amountOfConsumption\":0.01,\"id\":\"20191212095406497_232102_3042\",\"channelId\":3,\"status\":1},{\"payAblAmount\":0.01,\"freeAmount\":0.0,\"payType\":0,\"merchantId\":811001,\"userPayId\":232109,\"discountAmount\":0.0,\"amountOfConsumption\":0.01,\"id\":\"20191212095406497_232102_3042\",\"channelId\":3,\"status\":1}]"
}
Es中有的數據:
四、項目中使用場景
在數據庫分庫分表的時候,可以將這些數據放入es,查詢條件中沒有分片鍵的時候可以去ES中查詢,增快速度。