Elasticsearch 從入門到實戰

2021-12-09 Java後端

這篇文章我們來講下 Spring Boot 中如何整合 ES,以及如何在 Spring Cloud 微服務項目中使用 ES 來實現全文檢索,來達到搜索題庫的功能。而且題庫的數據量是非常大的,題目的答案也是非常長的,通過 ES 正好可以解決 mysql 模糊搜索的低效性。

項目中如何使用 ES 來達到全文檢索。

主要內容本文案例都是基於 PassJava 實戰項目來演示的。Github 地址:https://github.com/Jackson0714/PassJava-Platform為了讓大家更清晰地理解 PassJava 項目中 ES 是如何使用的,我畫了三個流程圖:首先定義 question 索引,然後在 ES 中創建索引。前端保存數據時,保存的 API 請求先經過網關,然後轉發到 passjava-question 微服務,然後遠程調用 passjava-search 微服務,將數據保存進 ES 中。前端查詢數據時,先經過網關,然後將請求轉發給 passjava-search 微服務,然後從 ES 中查詢數據。一、Elasticsearch 組件庫介紹全文檢索: 指以全部文本信息作為檢索對象的一種信息檢索技術。而我們使用的資料庫,如 Mysql,MongoDB 對文本信息檢索能力特別是中文檢索並沒有 ES 強大。所以我們來看下 ES 在項目中是如何來代替 SQL 來工作的。我使用的 Elasticsearch 服務是 7.4.2 的版本,然後採用官方提供的 Elastiscsearch-Rest-Client 庫來操作 ES,而且官方庫的 API 上手簡單。
https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high.html

另外這個組件庫是支持多種語言的:

支持多語言注意:Elasticsearch Clients 就是指如何用 API 操作 ES 服務的組件庫。可能有同學會提問,Elasticsearch 的組件庫中寫著 JavaScript API,是不是可以直接在前端訪問 ES 服務?可以是可以,但是會暴露 ES 服務的埠和 IP 地址,會非常不安全。所以我們還是用後端服務來訪問 ES 服務。我們這個項目是 Java 項目,自然就是用上面的兩種:Java Rest Client 或者 Java API。我們先看下 Java API,但是會發現已經廢棄了。如下圖所示:Java API 已經廢棄了所以我們只能用 Java REST Client 了。而它又分成兩種:高級和低級的。高級包含更多的功能,如果把高級比作MyBatis的話,那麼低級就相當於JDBC。所以我們用高級的 Client。高級和低級 Client二、整合檢索服務我們把檢索服務單獨作為一個服務。就稱作 passjava-search 模塊吧。1.1 添加搜索服務模塊首先我們在 PassJava-Platform 模塊創建一個 搜索服務模塊 passjava-search。然後勾選 spring web 服務。如下圖所示。第一步:選擇 Spring Initializr,然後點擊 Next。選擇 Spring Initializrpassjava-search 服務模塊第三步:選擇 Web->Spring Web 依賴,然後點擊 Next。1.2 配置 Maven 依賴進入到 ES 官方網站,可以看到有低級和高級的 Rest Client,我們選擇高階的(High Level Rest Client)。然後進入到高階 Rest Client 的 Maven 倉庫。官網地址如下所示:
https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.9/index.html

Rest Client 官方文檔

加上 Maven 依賴。

對應文件路徑:\passjava-search\pom.xml

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.4.2</version>
</dependency>

配置 elasticsearch 的版本為7.4.2

因加上 Maven 依賴後,elasticsearch 版本為 7.6.2,所以遇到這種版本不一致的情況時,需要手動改掉。

對應文件路徑:\passjava-search\pom.xml

<properties>
<elasticsearch.version>7.4.2</elasticsearch.version>
</properties>

刷新 Maven Project 後,可以看到引入的 elasticsearch 都是 7.4.2 版本了,如下圖所示:設置版本為 7.4.2引入 PassJava 的 Common 模塊依賴。Common 模塊是 PassJava 項目獨立的出來的公共模塊,引入了很多公共組件依賴,其他模塊引入 Common 模塊依賴後,就不需要單獨引入這些公共組件了,非常方便。對應文件路徑:\passjava-search\pom.xml
 <dependency>
     <groupId>com.jackson0714.passjava</groupId>
     <artifactId>passjava-common</artifactId>
     <version>0.0.1-SNAPSHOT</version>
</dependency>

添加完依賴後,我們就可以將搜索服務註冊到 Nacos 註冊中心了。Nacos 註冊中心的用法在前面幾篇文章中也詳細講解過,這裡需要注意的是要先啟動 Nacos 註冊中心,才能正常註冊 passjava-search 服務。1.3 註冊搜索服務到註冊中心

修改配置文件:src/main/resources/application.properties。配置應用程式名、註冊中心地址、註冊中心的命名中間。

spring.application.name=passjava-search
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=passjava-search

給啟動類添加服務發現註解:@EnableDiscoveryClient。這樣 passjava-search 服務就可以被註冊中心發現了。

因 Common 模塊依賴數據源,但 search 模塊不依賴數據源,所以 search 模塊需要移除數據源依賴:

exclude = DataSourceAutoConfiguration.class

以上的兩個註解如下所示:

@EnableDiscoveryClient
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class PassjavaSearchApplication {
    public static void main(String[] args) {
        SpringApplication.run(PassjavaSearchApplication.class, args);
    }
}

接下來我們添加一個 ES 服務的專屬配置類,主要目的是自動加載一個 ES Client 來供後續 ES API 使用,不用每次都 new 一個 ES Client。

1.4 添加 ES 配置類

配置類:PassJavaElasticsearchConfig.java

核心方法就是 RestClient.builder 方法,設置好 ES 服務的 IP 地址、埠號、傳輸協議就可以了。最後自動加載了 RestHighLevelClient。

package com.jackson0714.passjava.search.config;

import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Author: 公眾號 | 悟空聊架構
 * @Date: 2020/10/8 17:02
 * @Site: www.passjava.cn
 * @Github: https://github.com/Jackson0714/PassJava-Platform
 */
@Configuration
public class PassJavaElasticsearchConfig {

    @Bean
    // 給容器註冊一個 RestHighLevelClient,用來操作 ES
    // 參考官方文檔:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.9/java-rest-high-getting-started-initialization.html
    public RestHighLevelClient restHighLevelClient() {
        return new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("192.168.56.10", 9200, "http")));
    }
}

接下來我們測試下 ES Client 是否自動加載成功。

1.5 測試 ES Client 自動加載在測試類 PassjavaSearchApplicationTests 中編寫測試方法,列印出自動加載的 ES Client。期望結果是一個 RestHighLevelClient 對象。
package com.jackson0714.passjava.search;

import org.elasticsearch.client.RestHighLevelClient;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class PassjavaSearchApplicationTests {

    @Qualifier("restHighLevelClient")
    @Autowired
    private RestHighLevelClient client;

    @Test
    public void contextLoads() {
        System.out.println(client);
    }
}

運行結果如下所示,列印出了 RestHighLevelClient。說明自定義的 ES Client 自動裝載成功。

ES 測試結果1.6 測試 ES 簡單插入數據測試方法 testIndexData,省略 User 類。users 索引在我的 ES 中是沒有記錄的,所以期望結果是 ES 中新增了一條 users 數據。
/**
 * 測試存儲數據到 ES。
 * */
@Test
public void testIndexData() throws IOException {
    IndexRequest request = new IndexRequest("users");
    request.id("1"); // 文檔的 id
    
    //構造 User 對象
    User user = new User();
    user.setUserName("PassJava");
    user.setAge("18");
    user.setGender("Man");
    
    //User 對象轉為 JSON 數據
    String jsonString = JSON.toJSONString(user);
    
    // JSON 數據放入 request 中
    request.source(jsonString, XContentType.JSON);

    // 執行插入操作
    IndexResponse response = client.index(request, RequestOptions.DEFAULT);

    System.out.println(response);
}

執行 test 方法,我們可以看到控制臺輸出以下結果,說明數據插入到 ES 成功。另外需要注意的是結果中的 result 欄位為 updated,是因為我本地為了截圖,多執行了幾次插入操作,但因為 id = 1,所以做的都是 updated 操作,而不是 created 操作。控制臺輸出結果

我們再來到 ES 中看下 users 索引中數據。查詢 users 索引:

GET users/_search

查詢 users 索引結果可以從圖中看到有一條記錄被查詢出來,查詢出來的數據的 _id = 1,和插入的文檔 id 一致。另外幾個欄位的值也是一致的。說明插入的數據沒有問題。
"age" : "18",
"gender" : "Man",
"userName" : "PassJava"

1.7 測試 ES 查詢複雜語句

示例:搜索 bank 索引,address 欄位中包含 big 的所有人的年齡分布 ( 前 10 條 ) 以及平均年齡,以及平均薪資。

1.7.1 構造檢索條件我們可以參照官方文檔給出的示例來創建一個 SearchRequest 對象,指定要查詢的索引為 bank,然後創建一個 SearchSourceBuilder 來組裝查詢條件。總共有三種條件需要組裝:代碼如下所示,需要源碼請到我的 Github/PassJava 上下載。查詢複雜語句示例將列印出來的檢索參數複製出來,然後放到 JSON 格式化工具中格式化一下,再粘貼到 ES 控制臺執行,發現執行結果是正確的。列印出檢索參數

用在線工具格式化 JSON 字符串,結果如下所示:

然後我們去掉其中的一些默認參數,最後簡化後的檢索參數放到 Kibana 中執行。Kibana Dev Tools 控制臺中執行檢索語句如下圖所示,檢索結果如下圖所示:控制臺中執行檢索語句地址中包含 Road 的:263 Aviation Road。和 IDEA 中執行的測試結果一致,說明複雜檢索的功能已經成功實現。17.2 獲取命中記錄的詳情而獲取命中記錄的詳情數據,則需要通過兩次 getHists() 方法拿到,如下所示:
// 3.1)獲取查到的數據。
SearchHits hits = response.getHits();
// 3.2)獲取真正命中的結果
SearchHit[] searchHits = hits.getHits();

我們可以通過遍歷 searchHits 的方式列印出所有命中結果的詳情。

// 3.3)、遍曆命中結果
for (SearchHit hit: searchHits) {
    String hitStr = hit.getSourceAsString();
    BankMember bankMember = JSON.parseObject(hitStr, BankMember.class);
}

拿到每條記錄的 hitStr 是個 JSON 數據,如下所示:

{
 "account_number": 431,
 "balance": 13136,
 "firstname": "Laurie",
 "lastname": "Shaw",
 "age": 26,
 "gender": "F",
 "address": "263 Aviation Road",
 "employer": "Zillanet",
 "email": "laurieshaw@zillanet.com",
 "city": "Harmon",
 "state": "WV"
}

而 BankMember 是根據返回的結果詳情定義的的 JavaBean。可以通過工具自動生成。在線生成 JavaBean 的網站如下:

https://www.bejson.com/json2javapojo/new/

把這個 JavaBean 加到 PassjavaSearchApplicationTests 類中:

@ToString
@Data
static class BankMember {
    private int account_number;
    private int balance;
    private String firstname;
    private String lastname;
    private int age;
    private String gender;
    private String address;
    private String employer;
    private String email;
    private String city;
    private String state;
}

然後將 bankMember 列印出來:

System.out.println(bankMember);

bankMember得到的結果確實是我們封裝的 BankMember 對象,而且裡面的屬性值也都拿到了。1.7.3 獲取年齡分布聚合信息ES 返回的 response 中,年齡分布的數據是按照 ES 的格式返回的,如果想按照我們自己的格式來返回,就需要將 response 進行處理。如下圖所示,這個是查詢到的年齡分布結果,我們需要將其中某些欄位取出來,比如 buckets,它代表了分布在 21 歲的有 4 個。ES 返回的年齡分布信息
Aggregations aggregations = response.getAggregations();
Terms ageAgg1 = aggregations.get("ageAgg");
for (Terms.Bucket bucket : ageAgg1.getBuckets()) {
    String keyAsString = bucket.getKeyAsString();
    System.out.println("用戶年齡: " + keyAsString + " 人數:" + bucket.getDocCount());
}

最後列印的結果如下,21 歲的有 4 人,26 歲的有 4 人,等等。

列印結果:用戶年齡分布1.7.4 獲取平均薪資聚合信息現在來看看平均薪資如何按照所需的格式返回,ES 返回的結果如下圖所示,我們需要獲取 balanceAvg 欄位的 value 值。ES 返回的平均薪資信息
Avg balanceAvg1 = aggregations.get("balanceAvg");
System.out.println("平均薪資:" + balanceAvg1.getValue());

列印結果如下,平均薪資 28578 元。

列印結果:平均薪資三、實戰:同步 ES 數據3.1 定義檢索模型PassJava 這個項目可以用來配置題庫,如果我們想通過關鍵字來搜索題庫,該怎麼做呢?類似於百度搜索,輸入幾個關鍵字就可以搜到關聯的結果,我們這個功能也是類似,通過 Elasticsearch 做檢索引擎,後臺管理界面和小程序作為搜索入口,只需要在小程序上輸入關鍵字,就可以檢索相關的題目和答案。首先我們需要把題目和答案保存到 ES 中,在存之前,第一步是定義索引的模型,如下所示,模型中有 title 和 answer 欄位,表示題目和答案。
"id": {
    "type": "long"
},
"title": {
    "type": "text",
    "analyzer": "ik_smart"
},
"answer": {
    "type": "text",
    "analyzer": "ik_smart"
},
"typeName": {
    "type": "keyword"
}

3.2 在 ES 中創建索引上面我們已經定義了索引結構,接著就是在 ES 中創建索引。
PUT question
{
 "mappings" : {
     "properties": {
     "id": {
      "type": "long"
     },
     "title": {
      "type": "text",
      "analyzer": "ik_smart"
     },
     "answer": {
      "type": "text",
      "analyzer": "ik_smart"
     },
     "typeName": {
      "type": "keyword"
     }
  }
  }
}

執行結果如下所示:

創建 question 索引

我們可以通過以下命令來查看 question 索引是否在 ES 中:

GET _cat/indices

執行結果如下圖所示:

查看 ES 中所有的索引3.3 定義 ES model

上面我們定義 ES 的索引,接著就是定義索引對應的模型,將數據存到這個模型中,然後再存到 ES 中。

ES 模型如下,共四個欄位:id、title、answer、typeName。和 ES 索引是相互對應的。

@Data
public class QuestionEsModel {
    private Long id;
    private String title;
    private String answer;
    private String typeName;
}

3.4 觸發保存的時機

當我們在後臺創建題目或保存題目時,先將數據保存到 mysql 資料庫,然後再保存到 ES 中。

如下圖所示,在管理後臺創建題目時,觸發保存數據到 ES 。

第一步,保存數據到 mysql 中,項目中已經包含此功能,就不再講解了,直接進入第二步:保存數據到 ES 中。

而保存數據到 ES 中,需要將數據組裝成 ES 索引對應的數據,所以我用了一個 ES model,先將數據保存到 ES model 中。

3.5 用 model 來組裝數據

這裡的關鍵代碼時 copyProperties,可以將 question 對象的數據取出,然後賦值到 ES model 中。不過 ES model 中還有些欄位是 question 中沒有的,所以需要單獨拎出來賦值,比如 typeName 欄位,question 對象中沒有這個欄位,它對應的欄位是 question.type,所以我們把 type 取出來賦值到 ES model 的 typeName 欄位上。如下圖所示:

用 model 來組裝數據3.6 保存數據到 ES我在 passjava-search 微服務中寫了一個保存題目的 api 用來保存數據到 ES 中。保存數據到 ES

然後在 passjava-question 微服務中調用 search 微服務的保存 ES 的方法就可以了。

// 調用 passjava-search 服務,將數據發送到 ES 中保存。
searchFeignService.saveQuestion(esModel);

3.7 檢驗 ES 中是否創建成功我們可以通過 kibana 的控制臺來查看 question 索引中的文檔。通過以下命令來查看:
GET question/_search

執行結果如下圖所示,有一條記錄:

另外大家有沒有疑問:可以重複更新題目嗎?

答案是可以的,保存到 ES 的數據是冪等的,因為保存的時候帶了一個類似資料庫主鍵的 id。

四、實戰:查詢 ES 數據我們已經將數據同步到了 ES 中,現在就是前端怎麼去查詢 ES 數據中,這裡我們還是使用 Postman 來模擬前端查詢請求。4.1 定義請求參數

請求參數我定義了三個:

這裡我將這三個參數定義為一個類:

@Data
public class SearchParam {
    private String keyword; // 全文匹配的關鍵字
    private String id; // 題目 id
    private Integer pageNum; // 查詢第幾頁數據
}

4.2 定義返回參數

返回的 response 我也定義了四個欄位:

定義的類如下所示:

@Data
public class SearchQuestionResponse {
    private List<QuestionEsModel> questionList; // 題目列表
    private Integer pageNum; // 查詢第幾頁數據
    private Long total; // 總條數
    private Integer totalPages; // 總頁數
}

4.3 組裝 ES 查詢參數

調用 ES 的查詢 API 時,需要構建查詢參數。

組裝查詢參數的核心代碼如下所示:

組裝查詢參數第二步:設置哪些欄位需要模糊匹配。這裡有三個欄位:title,answer,typeName。4.4 格式化 ES 返回結果

ES 返回的數據是 ES 定義的格式,真正的數據被嵌套在 ES 的 response 中,所以需要格式化返回的數據。

核心代碼如下圖所示:

格式化 ES 返回結果

第一步:獲取查到的數據。

第二步:獲取真正命中的結果。

第三步:格式化返回的數據。

第四步:組裝分頁參數。

4.5 測試 ES 查詢4.5.1 實驗一:測試 title 匹配我們現在想要驗證 title 欄位是否能匹配到,傳的請求參數 keyword = 111,匹配到了 title = 111 的數據,且只有一條。頁碼 pageNum 我傳的 1,表示返回第一頁數據。如下圖所示:測試匹配 title4.5.2 實驗二:測試 answer 匹配我們現在想要驗證 answer 欄位是否能匹配到,傳的請求參數 keyword = 測試答案,匹配到了 title =  測試答案的數據,且只有一條,說明查詢成功。如下圖所示:測試匹配 answer4.5.2 實驗三:測試 id 匹配我們現在想要匹配題目 id 的話,需要傳請求參數 id,而且 id 是精確匹配。另外 id 和 keyword 是取併集,所以不能傳 keyword 欄位。請求參數 id = 5,返回結果也是 id =5 的數據,說明查詢成功。如下圖所示:測試 id 匹配五、總結本文通過我的開源項目 passjava 來講解 ES 的整合,ES 的 API 使用以及測試。非常詳細地講解了每一步該如何做,相信通過閱讀本篇後,再加上自己的實踐,一定能掌握前後端該如何使用 ES 來達到高效搜索的目的。當然,ES API 還有很多功能未在本文實踐,有興趣的同學可以到 ES 官網進行查閱和學習。再次強調:本文的代碼都是辛苦調試出來的,請不要忘記點讚和轉發哦~

相關焦點

  • 這篇實戰攻略,帶你輕鬆入門Elastic search
    elasticsearch: image: elasticsearch:7.2.0 container_name: es-simple environment: - cluster.name=mytestes #這裡就是ES集群的名稱 - node.name=es-simple #節點名稱 -
  • 乾貨 | Elasticsearch 冷熱集群架構實戰
    冷節點的存儲密度則較大,如需在較長保留期限內保留日誌數據,不失為一種具有成本效益的方法。將這兩種類型的數據節點結合到一起後,您便能夠有效地處理輸入數據,並將其用於查詢,同時還能在節省成本的前提下在較長時間內保留數據。此架構對日誌用例來說尤其大有幫助,因為在日誌用例中,人們的大部分精力都會專注於近期的日誌(例如最近兩周),而較早的日誌(由於合規性或者其他原因仍需要保留)則可以接受較慢的查詢時間。
  • 深入淺出 spring-data-elasticsearch 之 ElasticSearch 架構初探(一)
    在索引中全文搜索,然後會查詢到每個分片,將每個分配的結果進行全局地收集處理,並返回。二、Elasticsearch 工作原理2.1 文檔存儲的路由當索引到一個文檔(如:報價系統),具體的文檔數據(如:報價數據)會存儲到一個分片。具體文檔數據會被切分,並分別存儲在分片 1 或者 分片 2 … 那麼如何確定存在哪個分片呢?
  • ElasticSearch Client詳解
    按照官方的意思,以後ElasticSearch應該不會再為某一種具體語言單獨提供客戶端API,而是使用通用rest請求(http)來與ElasticSearch伺服器進行交互。接下來我們會從java api開始進入ElasticSearch API的學習。
  • 基於 ElasticSearch 實現站內全文搜索
    推薦下自己做的 Spring Cloud 的實戰項目:https://github.com/YunaiV/onemall需要安裝好elastiSearch以及kibana(可選),並且需要lk分詞插件。安裝elasticSearch elasticsearch官網. 筆者使用的是7.5.1。
  • 全文搜尋引擎ElasticSearch入門教程
    $ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.1.zip  $ unzip elasticsearch-5.5.1.zip  $ cd elasticsearch-5.5.1/  接著,進入解壓後的目錄,運行下面的命令,啟動 Elastic。
  • 在elasticsearch中使用function_score查詢
    一、先看語法_search{  "query":{  "function_score":{  "query":{        "match_all":{}   },       "functions":[               {        "gauss":{
  • Elasticsearch 史上最全最常用工具清單
    2)地址:http://mobz.github.io/elasticsearch-head/2、Kibana工具除了支持各種數據的可視化之外,最重要的是:支持Dev支持多個版本間的數據遷移,使用scroll+bulk地址:https://github.com/medcl/elasticsearch-migration7、Elasticsearch-Exporter將ES中的數據向其他導出的簡單腳本實現。
  • 乾貨 | Debezium實現Mysql到Elasticsearch高效實時同步
    2、基於binlog的同步方式1)基於kafka Connect的Debezium 開源工程,地址:. https://debezium.io/2)不依賴第三方的獨立應用: Maxwell開源項目,地址:http://maxwells-daemon.io/由於已經部署過conluent(kafka的企業版本,自帶zookeeper、kafka、ksql、kafka-connector
  • 一步步拆解解決 Elasticsearch 檢索模板問題
    1、線上實戰提問Elasticsearch做模版查詢的時候,在使用 terms 進行批量查詢的時候放入數組在模版中進行查詢失敗,類似於模版傳入數組該如何實現?實戰中可以通過如下_scripts 的方式,將檢索模板定義到伺服器端。如果想檢索別的欄位:客戶端或者請求端傳遞不同的參數即可。真正意義上的實現了:檢索和請求參數的分離。
  • elasticsearch搜索語法梳理 · 貳
    收錄於話題 #elasticsearch昨天我其實已經算是對elasticsearch做了一個我自己的定性——一套獨立的知識體系,所以從今天開始,我覺得有必要對elasticsearch的學習策略做一定的調整:未來會不定期分享es的相關內容,而且儘可能會以分享小知識點的方式來展開,所以暫時不會把es作為核心創作對象來更新。具體原因我放在文末了,感興趣的小夥伴可以去看下。
  • ElasticSearch7使用指導
    /elasticsearch-head/archive/master.zip(5)chrome-es插件:https://github.com/mobz/elasticsearch-head/blob/master/crx/es-head.crx2、es客戶端windows安裝 (1)安裝步驟elasticsearch
  • 《Elasticsearch 權威指南》中文版
    在幾十位社區同學的共同努力下,《Elasticsearch 權威指南》的翻譯工作接近尾聲,在線訪問連結如下:
  • ElasticSearch 億級數據檢索案例實戰!
    三、elasticsearch檢索原理3.1 關於ES和Lucene基礎結構談到優化必須能了解組件的基本原理,才容易找到瓶頸所在,以免走多種彎路,先從ES的基礎結構說起(如下圖):一些基本概念:數據具體被存儲到哪個分片上:shard = hash(routing) % number_of_primary_shards默認情況下 routing參數是文檔ID (murmurhash3),可通過 URL中的 _routing 參數指定數據分布在同一個分片中,index和search
  • ElasticSearch
    2 ESClient對象創建 • 在SpringBoot中定義類,將連接信息通過yaml等配置文件的形式自動進行裝配 @Component @ConfigurationProperties(prefix = "elasticsearch
  • 讓Elasticsearch飛起來!百億級實時查詢優化實戰
    更多 Master 選舉相關內容請參考:https://www.elastic.co/guide/en/elasticsearch/reference/5.3/modules-discovery-zen.html#master-election Data Nodes
  • Open Distro for Elasticsearch 1.1.0 發布,Elasticsearch 發行版
    Open Distro for Elasticsearch 是 AWS 開源的 Elasticsearch 發行版。可以 GitHub 存儲庫中的發行說明中找到有關增強、bug 修復和更多信息的詳細信息:https://github.com/opendistro-for-elasticsearch新特性此版本中提供一些新的插件,以便集成到開發者的應用程式中,雖然這些插件屬於 alpha 版本。
  • Elasticsearch Query DSL概述與查詢、過濾上下文
    收錄於話題 #ElasticSearch實戰把查詢DSL看作是查詢的AST(抽象語法樹),由兩種類型的子句組成:葉子查詢子句指在特定的欄位中尋找特定的值,例如匹配、範圍查詢或term(完全匹配)。這些查詢可以單獨使用。複合查詢字句包裝其他葉子或複合字句,用於以邏輯方式組合多個查詢(如bool、dis_max)或改變他們的行為(如常量查詢)。
  • elasticsearch 八、重要的配置更改
    ——by 歪歪elasticsearch.yml請閱讀本節內容!呈現所有配置都同樣重要,並且不以任何特定的順序列出。請在所有配置選項讀取,並將它們應用到你的集群。Please read this entire section!
  • Hadoop 讀寫 Elasticsearch
    使用Hadoop操作Elasticsearch的方法,關鍵是指定InputFormatClass : EsInputFormat.classOutputFormatClass: EsOutputFormat.class,這個好像是ES官方提供的集成包。網上查了相關資料貌似挺少的。