ElasticSearch在項目中使用場景以及本地demo實現

公司在使用ElasticSearch,放置一些數據,所以打算整理一下基礎知識以及本地實現一下一個demo

一、windows安裝ElasticSearch和kibana(這裏用作es數據可視化)

安裝ElasticSearch
  1. 安裝jdk1.8+版本

  2. 下載ElasticSearch
    由於官網版本實在是太慢,所以ElasticSearch 7.6的百度雲鏈接:ElasticSearch 7.6提取碼:r80d

  3. 下載解壓後,打開bin文件夾下elasticsearch.bat文件,出現下面畫面則啓動成功在這裏插入圖片描述打開瀏覽器輸入:127.0.0.1:9200 出現如下頁面則顯示成功
    在這裏插入圖片描述

  4. 如果想多節點運行,可以在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
  1. 下載鏈接:百度網盤地址,提取碼:l6nj

  2. 解壓後執行bin文件夾下Kibana.bat在這裏插入圖片描述

  3. 出現下圖訪問:http://127.0.0.1:5601在這裏插入圖片描述

  4. 進入es數據區在這裏插入圖片描述

  5. 將索引(index)名稱放入標紅位置,然後點擊下一步(next step)在這裏插入圖片描述

  6. 按照圖中標紅點擊即可看到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中查詢,增快速度。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章