全文搜尋之 Elasticsearch

2021-09-02 12:57:00 字數 3665 閱讀 7258

elasticsearch (es)是乙個基於 lucene 的開源搜尋引擎,它不但穩定、可靠、快速,而且也具有良好的水平擴充套件能力,是專門為分布式環境設計的。

json:輸入/輸出格式為 json,意味著不需要定義 schema,快捷方便

restful:基本所有操作(索引、查詢、甚至是配置)都可以通過 http 介面進行

分布式:節點對外表現對等(每個節點都可以用來做入口);加入節點自動均衡

多租戶:可根據不同的用途分索引;可以同時操作多個索引其中乙個節點就是乙個 es 程序,多個節點組成乙個集群。一般每個節點都執行在不同的作業系統上,配置好集群相關引數後 es 會自動組成集群(節點發現方式也可以配置)。集群內部通過 es 的選主演算法選出主節點(目前版本 1.2 存在腦裂問題),而集群外部則是可以通過任何節點進行操作,無主從節點之分(對外表現對等/去中心化,有利於客戶端程式設計,例如故障重連)。

「索引」有兩個意思:

作為動詞,它指的是把乙個文件「儲存」到 es 中的過程,索引乙個文件後,我們就可以使用 es 搜尋到這個文件

作為名詞,它是指儲存文件的地方,相當於乙個資料庫概念中的「庫」

為了方便理解,我們可以將 es 中的一些概念對應到我們熟悉的關係型資料庫上:

es    

索引    

型別    

文件    

db    

庫     錶行

es 是乙個分布式系統,我們一開始就應該以集群的方式來使用它。它儲存索引時會選擇適合的「分片」(primary shard),把索引儲存到其中(我們可以把分片理解為一塊物理儲存區域)。分片的分法是固定的,而且是安裝時候就必須要決定好的(預設是 5),後面就不能改變了。

既然有主分片,那肯定是有「從」分片的,在 es 裡稱之為「副本分片」(replica shard)。副本分片主要有兩個作用:

來個示例總結一下上面的內容(結合下面的圖一起看):

(該圖是使用 es 的 restful 介面獲取的,後面會介紹常用介面)

這個特性非常方便,最關鍵的是 es 的 http 介面不只是可以進行業務操作(索引/搜尋),還可以進行配置,甚至是關閉 es 集群。下面我們介紹幾個很常用的介面:

v 是 verbose 的意思,這樣可以更可讀(有表頭,有對齊),_cat 是監測相關的 apis,/_cat?help 來獲取所有介面。$ 和 $ 分別是具體的某一索引某一型別,是分層次的。我們也可以直接在所有索引所有型別上進行搜尋:/_search。

最後,來份官方的術語表翻譯,鞏固一下理解:

analysis 分析

分析是將文字(text)轉化為查詢詞(term)的過程。使用不同的分析器,這三種短語:foo bar,foo-bar,foo,bar 都有可能被分解成查詢詞 foo 與 bar。這些查詢詞實際上將被儲存在索引中。一次對 foo:bar 的全文查詢(不是查詢詞查詢)可能會被分析為為查詢詞 foo,bar,可以匹配上儲存在索引中的查詢詞。這就是分析處理過程(包含了索引與搜尋),它使得 es 可以進行全文查詢。

cluster 集群

乙個或多個擁有同乙個集群名稱的節點組成了乙個集群。每個集群都會自動選出乙個主節點,如果該主節點故障,則集群會自動選出新的主節點來替換故障節點。

document 文件

乙個文件就是乙個儲存在 es 中的 json 文字,可以把它理解為關係型資料庫表中的一行。每個文件都是儲存在索引中的,擁有一種型別和 id。乙個文件是乙個 json 物件(一些語言中的 hash / hashmap / associative array)包含了 0 或多個字段(鍵值對)。原始的 json 文字在索引後將被儲存在 _source 欄位裡,搜尋完成後返回值中預設是包含該字段的。

idid 是用於標識文件的,乙個文件的索引/型別/id 必須是唯一的。文件 id 是自動生成的(如果不指定)。

field 字段

乙個文件包含了若干字段,或稱之為鍵值對。欄位的值可以是簡單(標量)值(例如字串、整型、日期),也可以是巢狀結構,例如陣列或物件。乙個字段 類似於關係型資料庫表中的一列。每個欄位的對映都有乙個字段型別(不要和文件型別搞混了),它描述了這個字段可以儲存的值型別,例如整型、字串、物件。 對映還可以讓我們定義乙個欄位的值如何進行分析。

index 索引

乙個索引類似關係型資料庫中的乙個資料庫,它可以對映為多種型別。乙個索引就是邏輯上的乙個命名空間,對應到 1 或多個主分片上,可以擁有 0 個或多個副本分片。

乙個對映類似於關係型資料庫中的模式定義。每個索引都存在乙個對映,它定義了該索引中的每一種型別,以及索引相關的配置。對映可以顯示定義,或者在文件被索引時自動建立。

node 節點

乙個節點是集群中的乙個 es 執行例項。測試時,多個節點可以同時啟在同乙個伺服器上,生產環境一般是乙個伺服器上乙個節點。節點啟動時將使用單播(或者是組播)來發現和自己配置的集群名稱相同的集群,並嘗試加入到該集群中。

primary shard 主分片

每個文件都會被儲存在乙個主分片上。當我們索引乙個文件時,它將在乙個主分片上進行索引,然後才放到該主分片的各副本分片上。預設情況下,乙個索引 有 5 個主分片。我們可以指定更少或更多的主分片來伸縮索引可處理的文件數。需要注意的是,一旦索引建立,就不能修改主分片個數。

replica shard 副本分片

每個主分片可以擁有 0 個或多個副本分片。乙個副本分片是主分片的乙份拷貝,這樣做有兩個主要原因:

故障轉移:當主分片失效時,乙個副本分片會被提公升為主分片

提高效能:獲取與搜尋請求可以被主分片或副本分片處理。預設情況下,每個主分片都有乙個副本分片,副本分片的數量可以動態調整。在同乙個節點上,副本分片和其主分片不會同時執行

routing 路由

當我們索引乙個文件時,它將被儲存在乙個主分片上,分片的選擇是通過路由值雜湊得到的。預設情況下,路由值來自於文件 id,如果該文件指定來了父文件,則路由值來自于父文件 id(這是為了確保子文件和父文件被儲存在相同的分片上)。該值可以在索引時指定,也可以通過對映路由欄位來指定。

shard 分片

乙個分片就是乙個 lucene 例項,它是 es 管理的底層「工作單元」。乙個索引是邏輯上的乙個命名空間,指向主分片和副本分片。索引的主分片和副本分片數量必須明確指定好,在應用**使用時只需要處 理和索引的互動,不會涉及到和分片的互動。elasticsearch 會在集群中的所有節點上設定好分片,但節點失效或加入新節點時會自動將移動節點分片。

source field 源欄位

預設情況下,在獲取和搜尋請求返回值中的 _source 字段儲存了源 json 文字,這使得我們可以直接在返回結果中訪問源資料,而不需要根據 id 再發一次檢索請求。注意:索引的 json 字串將完整返回,無論是否是乙個合法的 json。該字段的內容也不會描述資料如何被索引。

term 查詢詞

乙個查詢詞是乙個被 es 索引的確切值。查詢詞 foo,foo,foo 是不同的。查詢詞可以使用查詢詞查詢介面進行獲取。

text 文字

文字(或稱之為全文)是普通的、非結構化的文字,例如本段話。預設情況下,文字將被分析為查詢詞,查詢詞將被儲存在索引中。為能夠進行全文搜尋,文字欄位在索引時將被分析為查詢詞,查詢關鍵字在搜尋時也將被分析為查詢詞,通過對比查詢詞是否相同而完成全文搜尋。

type 型別

一種型別類似於關係型資料庫中的一張表。每種型別都有若干字段,可以用於指定給該型別文件。對映定義了該文件中的每個字段如何進行分析。

全文搜尋之 Elasticsearch

elasticsearch es 是乙個基於 lucene 的開源搜尋引擎,它不但穩定 可靠 快速,而且也具有良好的水平擴充套件能力,是專門為分布式環境設計的。json 輸入 輸出格式為 json,意味著不需要定義 schema,快捷方便 restful 基本所有操作 索引 查詢 甚至是配置 都可以...

redis之RediSearch全文搜尋

redisearch是乙個高效能的全文搜尋引擎,可作為乙個redis module 執行在redis上,是由redislabs團隊開發的。主要特性如下 簡單,快速索引和搜尋 資料儲存在記憶體中,使用記憶體 有效的自定義資料結構 支援多種使用utf 8編碼的語言 文件和字段評分 結果的數值過濾 通過詞...

mysql中布林搜尋 MySQL全文搜尋之布林搜尋

利用in boolean mode修改程式,mysql 也可以執行布林全文搜尋 mysql select from articles where match title,body against mysql yoursql in boolean mode id title body 1 mysql ...