一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

全文搜索之 Elasticsearch

 kevin1981fu 2016-03-24

概述

Elasticsearch (ES)是一個基于 Lucene 的開源搜索引擎,它不但穩(wěn)定、可靠、快速,而且也具有良好的水平擴展能力,是專門為分布式環(huán)境設計的。

特性

  • 安裝方便:沒有其他依賴,下載后安裝非常方便;只用修改幾個參數(shù)就可以搭建起來一個集群
  • JSON:輸入/輸出格式為 JSON,意味著不需要定義 Schema,快捷方便
  • RESTful:基本所有操作(索引、查詢、甚至是配置)都可以通過 HTTP 接口進行
  • 分布式:節(jié)點對外表現(xiàn)對等(每個節(jié)點都可以用來做入口);加入節(jié)點自動均衡
  • 多租戶:可根據(jù)不同的用途分索引;可以同時操作多個索引

集群

其中一個節(jié)點就是一個 ES 進程,多個節(jié)點組成一個集群。一般每個節(jié)點都運行在不同的操作系統(tǒng)上,配置好集群相關參數(shù)后 ES 會自動組成集群(節(jié)點發(fā)現(xiàn)方式也可以配置)。集群內(nèi)部通過 ES 的選主算法選出主節(jié)點(目前版本 1.2 存在腦裂問題),而集群外部則是可以通過任何節(jié)點進行操作,無主從節(jié)點之分(對外表現(xiàn)對等/去中心化,有利于客戶端編程,例如故障重連)。

索引

“索引”有兩個意思:

  • 作為動詞,它指的是把一個文檔“保存”到 ES 中的過程,索引一個文檔后,我們就可以使用 ES 搜索到這個文檔
  • 作為名詞,它是指保存文檔的地方,相當于一個數(shù)據(jù)庫概念中的“庫”

為了方便理解,我們可以將 ES 中的一些概念對應到我們熟悉的關系型數(shù)據(jù)庫上:

    ES         索引         類型         文檔    
    DB         庫          表     行

分片

ES 是一個分布式系統(tǒng),我們一開始就應該以集群的方式來使用它。它保存索引時會選擇適合的“分片”(Primary Shard),把索引保存到其中(我們可以把分片理解為一塊物理存儲區(qū)域)。分片的分法是固定的,而且是安裝時候就必須要決定好的(默認是 5),后面就不能改變了。

既然有主分片,那肯定是有“從”分片的,在 ES 里稱之為“副本分片”(Replica Shard)。副本分片主要有兩個作用:

  • 高可用:某分片節(jié)點掛了的話可走其他副本分片節(jié)點,節(jié)點恢復后上面的分片數(shù)據(jù)可通過其他節(jié)點恢復
  • 負載均衡:ES 會自動根據(jù)負載情況控制搜索路由,副本分片可以將負載均攤

一個示例

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

  • 3 個 ES 節(jié)點(es-58/59/60)組成一個集群
  • 搭建集群時使用默認的主分片數(shù) 5,shard0~shard4
  • 該集群內(nèi)有加入兩個索引 index1、index2
  • 這兩個索引中分別“索引”(保存)了兩個文檔
  • index1 索引中這個文檔被 ES 自動保存到了分片 2 中,主分片在 es-58 節(jié)點,副本分片在 es-59 節(jié)點
  • index2 索引中這個文檔被 ES 自動保存到了分片 2 中,主分片在 es-59 節(jié)點,副本分片在 es-58 節(jié)點

shards

(該圖是使用 ES 的 RESTful 接口獲取的,后面會介紹常用接口)

多租戶

ES 的多租戶簡單的說就是通過多索引機制同時提供給多種業(yè)務使用,每種業(yè)務使用一個索引(關于多租戶的詳細定義與用途,可以參考這里)。前面我們提到過可以把索引理解為關系型數(shù)據(jù)庫里的庫,那多索引可以理解為一個數(shù)據(jù)庫系統(tǒng)建立多個庫給不同的業(yè)務使用。

在實際使用時,我們可以通過每個租戶一個索引的方式將他們的數(shù)據(jù)進行隔離,并且每個索引是可以單獨配置參數(shù)的(可對特定租戶進行調(diào)優(yōu)),這在典型的多租戶場景下非常有用:例如我們的一個多租戶應用需要提供搜索支持,這時可以通過 ES 根據(jù)租戶建立索引,這樣每個租戶就可以在自己的索引下搜索相關內(nèi)容了。

RESTful

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

  •  /_cat/nodes?v:查集群狀態(tài)
  • /_cat/shards?v:查看分片狀態(tài)
  • /${index}/${type}/_search:搜索

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

官方術語表

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

analysis 分析

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

cluster 集群

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

document 文檔

一個文檔就是一個保存在 es 中的 JSON 文本,可以把它理解為關系型數(shù)據(jù)庫表中的一行。每個文檔都是保存在索引中的,擁有一種類型和 id。一個文檔是一個 JSON 對象(一些語言中的 hash / hashmap / associative array)包含了 0 或多個字段(鍵值對)。原始的 JSON 文本在索引后將被保存在 _source 字段里,搜索完成后返回值中默認是包含該字段的。

id

Id 是用于標識文檔的,一個文檔的索引/類型/id 必須是唯一的。文檔 id 是自動生成的(如果不指定)。

field 字段

一個文檔包含了若干字段,或稱之為鍵值對。字段的值可以是簡單(標量)值(例如字符串、整型、日期),也可以是嵌套結(jié)構(gòu),例如數(shù)組或?qū)ο蟆R粋€字段類似于關系型數(shù)據(jù)庫表中的一列。每個字段的映射都有一個字段類型(不要和文檔類型搞混了),它描述了這個字段可以保存的值類型,例如整型、字符串、對象。映射還可以讓我們定義一個字段的值如何進行分析。

index 索引

一個索引類似關系型數(shù)據(jù)庫中的一個數(shù)據(jù)庫,它可以映射為多種類型。一個索引就是邏輯上的一個命名空間,對應到 1 或多個主分片上,可以擁有 0 個或多個副本分片。

mapping 映射

一個映射類似于關系型數(shù)據(jù)庫中的模式定義。每個索引都存在一個映射,它定義了該索引中的每一種類型,以及索引相關的配置。映射可以顯示定義,或者在文檔被索引時自動創(chuàng)建。

node 節(jié)點

一個節(jié)點是集群中的一個 es 運行實例。測試時,多個節(jié)點可以同時啟在同一個服務器上,生產(chǎn)環(huán)境一般是一個服務器上一個節(jié)點。節(jié)點啟動時將使用單播(或者是組播)來發(fā)現(xiàn)和自己配置的集群名稱相同的集群,并嘗試加入到該集群中。

primary shard 主分片

每個文檔都會被保存在一個主分片上。當我們索引一個文檔時,它將在一個主分片上進行索引,然后才放到該主分片的各副本分片上。默認情況下,一個索引有 5 個主分片。我們可以指定更少或更多的主分片來伸縮索引可處理的文檔數(shù)。需要注意的是,一旦索引創(chuàng)建,就不能修改主分片個數(shù)。

replica shard 副本分片

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

  1. 故障轉(zhuǎn)移:當主分片失效時,一個副本分片會被提升為主分片
  2. 提高性能:獲取與搜索請求可以被主分片或副本分片處理。默認情況下,每個主分片都有一個副本分片,副本分片的數(shù)量可以動態(tài)調(diào)整。在同一個節(jié)點上,副本分片和其主分片不會同時運行

routing 路由

當我們索引一個文檔時,它將被保存在一個主分片上,分片的選擇是通過路由值哈希得到的。默認情況下,路由值來自于文檔 id,如果該文檔指定來了父文檔,則路由值來自于父文檔 id(這是為了確保子文檔和父文檔被保存在相同的分片上)。該值可以在索引時指定,也可以通過映射路由字段來指定。

shard 分片

一個分片就是一個 Lucene 實例,它是 es 管理的底層“工作單元”。一個索引是邏輯上的一個命名空間,指向主分片和副本分片。索引的主分片和副本分片數(shù)量必須明確指定好,在應用代碼使用時只需要處理和索引的交互,不會涉及到和分片的交互。Elasticsearch 會在集群中的所有節(jié)點上設置好分片,但節(jié)點失效或加入新節(jié)點時會自動將移動節(jié)點分片。

source field 源字段

默認情況下,在獲取和搜索請求返回值中的 _source 字段保存了源 JSON 文本,這使得我們可以直接在返回結(jié)果中訪問源數(shù)據(jù),而不需要根據(jù) id 再發(fā)一次檢索請求。注意:索引的 JSON 字符串將完整返回,無論是否是一個合法的 JSON。該字段的內(nèi)容也不會描述數(shù)據(jù)如何被索引。

term 查詢詞

一個查詢詞是一個被 es 索引的確切值。查詢詞 foo,F(xiàn)oo,F(xiàn)OO 是不同的。查詢詞可以使用查詢詞查詢接口進行獲取。

text 文本

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

type 類型

一種類型類似于關系型數(shù)據(jù)庫中的一張表。每種類型都有若干字段,可以用于指定給該類型文檔。映射定義了該文檔中的每個字段如何進行分析。

參考

---- EOF ----

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    国内尹人香蕉综合在线| 91蜜臀精品一区二区三区| 亚洲午夜av一区二区| 成人免费在线视频大香蕉| 在线懂色一区二区三区精品| 日韩国产亚洲一区二区三区| 丰满人妻少妇精品一区二区三区| 搡老熟女老女人一区二区| 亚洲精品日韩欧美精品| 久久热在线视频免费观看| 欧美日韩国产免费看黄片| 亚洲永久一区二区三区在线| 午夜久久久精品国产精品| 一区二区三区免费公开| 国产高清在线不卡一区| 色无极东京热男人的天堂| 日本加勒比中文在线观看| 久久精品色妇熟妇丰满人妻91| 亚洲精品高清国产一线久久| 国产超碰在线观看免费| 国产一级内片内射免费看| 日本一级特黄大片国产| 人妻人妻人人妻人人澡| 欧美国产日产综合精品| 草草草草在线观看视频| 黄色国产自拍在线观看| 一区二区三区人妻在线| 精品精品国产自在久久高清| 国产在线成人免费高清观看av| 欧美一区二区三区五月婷婷| 亚洲精品一区三区三区| 在线欧美精品二区三区| 很黄很污在线免费观看| 日韩中文字幕欧美亚洲| 伊人欧美一区二区三区| 国产欧美精品对白性色| 久久久免费精品人妻一区二区三区| 在线日本不卡一区二区| 日韩欧美中文字幕人妻| 久久精品国产在热亚洲| 国产又大又硬又粗又湿|