elasticsearch 概念(2)插件和使用

安裝

ES依賴於JDK,使用Oracke JDK或OpenJDK都可。html

JDK在不一樣平臺的安裝方式各異,具體方法這裏再也不介紹。ES的安裝也很是容易,一般只須要簡單修改其配置文件中的集羣名稱,並啓動服務便可,這裏再也不贅述。緩存

ElasticSearch在設計上支持插件式體系結構,用戶可根據須要經過插件來加強ElasticSearch的功能。app

目前,經常使用的經過插件擴展的功能包括添加自定義映射類型、自定義分析器、本地腳本、自定義發現方式等等。dom

安裝及移除插件

插件的安裝有兩種方式:直接將插件放置於plugins目錄中,或經過plugin腳本進行安裝。curl

Marvel、BigDesk及Head這三個是較爲經常使用的插件。學習

使用

ElasticSearch提供了易用但功能強大的RESTful API以用於與集羣進行交互,這些API大致可分爲以下四類:ui

(1) 檢查集羣、節點、索引等健康與否,以及獲取其相關狀態與統計信息;
(2) 管理集羣、節點、索引數據及元數據;
(3) 執行CRUD操做及搜索操做;
(4) 執行高級搜索操做,例如paging、filtering、scripting、faceting、aggregations及其它操做;url

數據查詢

Query API是ElasticSearch的API中較大的一部分,基於Query DSL(JSON based language for building complex queries),可完成諸多類型查詢操做,例如simple term query, phrase, range, boolean, fuzzy, span, wildcard, spatial等簡單類型查詢、組合簡單查詢類型爲複雜類型查詢,以及文檔過濾等。spa

另外,查詢執行過程一般要分紅兩個階段,分散階段及合併階段。.net

分散階段是向所查詢的索引中的全部shard發起執行查詢的過程,合併階段是將各shard返回的結果合併、排序並響應給客戶端的過程。

向ElasticSearch發起查詢操做有兩種方式:一是經過RESTful request API傳遞查詢參數,也稱「query-string」;另外一個是經過發送REST request body,也稱做JSON格式。

經過發送request body的方式進行查詢,能夠經過JSON定義查詢體編寫更具表現形式的查詢請求。訪問ElasticSearch的search API須要經過_search端點進行。例如,向students索引起起一個空查詢。

~]$ curl -XGET 'localhost:9200/students/_search?pretty'

上面的查詢命令也可改寫爲帶request body的格式,其等同效果的命令以下。

~]$ curl -XGET 'localhost:9200/students/_search?pretty' -d '
{ 
  "query": { "match_all": { } }
}'

此命令所示的查詢語句是ElasticSearch提供的JSON風格的域類型查詢語言,也即所謂的Query DSL。

上面的命令中,「query」參數給出了查詢定義,match_all給出了查詢類型,它表示返回給定索引的全部文檔。

除了query參數以外,還能夠額外指定其它參數來控制搜索結果,例如「size」參數可定義返回的文檔數量(默認爲10),而「from」參數可指定結果集中要顯示出的文檔的起始偏移量(默認爲0),「sort」參數可指明排序規則等。
ElasticSearch的大多數search API(除了Explain API)都支持多索引(mutli-index)和多類型(multi-type)。若是不限制查詢時使用的索引和類型,查詢請求將發給集羣中的全部文檔。

ElasticSearch會把查詢請求並行發給全部shard的主shard或某一副本shard,將返回的結果集中的前10返回給用戶。

不過,若是是想向某一或某些個索引的某一或某些類型發起查詢請求,可經過指定查詢的URL進行。

/_search:搜索全部索引的全部類型;
/students/_search:搜索students索引的全部類型;
/students,tutors/_search:搜索students和tutors索引的全部類型;
/s*,t*/_search:搜索名稱以s和t開頭的全部索引的全部類型;
/students/class1/_search:搜索students索引的class1類型;
/_all/class1,class2/_search:搜索全部索引的class1和class2類型;

索引一個文檔時,Elasticsearch會取得其全部域的全部值,並將其鏈接起來合併爲一個大字符串,其被索引爲一個特殊域_all。

在某次查詢中,若是在query-string中未指定查詢的域,則使用_all域進行查詢。

下面四個查詢的功用會有所不一樣。前兩個在_all域中搜索,然後兩個將會在class域上作精確搜索。

GET /_search?q="Huashan"
GET /_search?q="Huashan Pai"
GET /_search?q=class:"Huashan Pai"
GET /_search?q=class:"Huahan"

須要注意的是,文檔中每一個域的值可能會存儲爲特定類型,而非字符串類型,所以,_all域的索引方式與特域的索引方式未必徹底相同。

文檔中,域的數據存儲時支持「string」、「numbers」、「Booleans」和「dates」幾種類型,不一樣類型的數據在索引時是略有區別的。

在建立文檔時,Elasticsearch會經過檢查域的值來動態爲其建立mapping,可經過Mapping API來查看type的mapping,其訪問端點是_mapping。

ES的精確值、full-text及倒排索引

ES的數據可被廣義的分爲兩種類型:「types:exect」和「full-text」。

精確值(Exact values)就是指數據不曾加工過的原始值,而Full-text則用於引用文本中的數據。

在查詢中,精確值是很容易進行搜索的,但full-text則須要判斷文檔在「多大程度上」匹配查詢請求,換句話講,即須要評估文檔與給定查詢的相關度(relevant)。

所以,所謂的full-text查詢一般是指在給定的文本域內部搜索指定的關鍵字,但搜索操做該須要真正理解查詢者的目的,例如:

(1) 搜索「UK」應該返回包含「United Kingdom」的相關文檔;
(2) 搜索「jump」應該返回包含「JUMP」、「jumped」、「jumps」、「jumping」甚至是「leap」的文檔;
(3) 搜索「johnny walker」應該匹配包含「Johnnie Walker」的文檔;

爲了完成此類full-text域的搜索,ES必須首先分析文本並將其構建成爲倒排索引(inverted index),倒排索引由各文檔中出現的單詞列表組成,列表中的各單詞不能重複且須要指向其所在的各文檔。

所以,爲了建立倒排索引,須要先將各文檔中域的值切分爲獨立的單詞(也稱爲term或token),然後將之建立爲一個無重複的有序單詞列表。這個過程稱之爲「分詞(tokenization)」。
圖片描述
其次,爲了完成此類full-text域的搜索,倒排索引中的數據還需進行「正規化(normalization)」爲標準格式,才能評估其與用戶搜索請求字符串的類似度。

例如,將全部大寫字符轉換爲小寫,將複數統一單數,將同義詞統一進行索引等。

另外,執行查詢以前,還須要將查詢字符串按照同與索引過程的同種格式進行「正規化(normalization)」。

這裏的「分詞」及「正規化」操做也稱爲「分析(analysis)」。
其次,爲了完成此類full-text域的搜索,倒排索引中的數據還需進行「正規化(normalization)」爲標準格式,才能評估其與用戶搜索請求字符串的類似度。

例如,將全部大寫字符轉換爲小寫,將複數統一單數,將同義詞統一進行索引等。

另外,執行查詢以前,還須要將查詢字符串按照同與索引過程的同種格式進行「正規化(normalization)」。

這裏的「分詞」及「正規化」操做也稱爲「分析(analysis)」。

分析(analysis)

Analysis過程由兩個步驟的操做組成:首先將文本切分爲terms(詞項)以適合構建倒排索引,其次將各terms正規化爲標準形式以提高其「可搜索度」。這兩個步驟由分析器(analyzers)完成。

一個分析器一般須要由三個組件構成:字符過濾器(Character filters)、分詞器(Tokenizer)和分詞過濾器(Token filters)組成。

字符過濾器:在文本被切割以前進行清理操做,例如移除HTML標籤,將&替換爲字符等;

分詞器:將文本切分爲獨立的詞項;簡單的分詞器一般是根據空白及標點符號進行切分;

分詞過濾器:轉換字符(如將大寫轉爲小寫)、移除詞項(如移除a、an、of及the等)或者添加詞項(例如,添加同義詞);

Elasticsearch內置了許多字符過濾器、分詞器和分詞過濾器,用戶可按需將它們組合成「自定義」的分析器。

當然,建立倒排索引時須要用到分析器,但傳遞搜索字符串時也可能須要分析器,甚至還要用到與索引建立時相同的分析器才能保證單詞匹配的精確度。

執行full-text域搜索時,須要用到分析器,但執行精確值搜索時,查詢過程不會分析查詢字符串而是直接進行精確值匹配。

Queries and Filters

儘管統一稱之爲query DSL,事實上Elasticsearch中存在兩種DSL:查詢DSL(query DSL)和過濾DSL(filter DSL)。

查詢子句和過濾子句的天然屬性很是相近,但在使用目的上略有區別。

簡單來說,當執行full-text查詢或查詢結果依賴於相關度分值時應該使用查詢DSL,當執行精確值(extac-value)查詢或查詢結果僅有「yes」或「no」兩種結果時應該使用過濾DSL。

Filter DSL計算及過濾速度較快,且適於緩存,所以可有效提高後續查詢請求的執行速度。

而query DSL不只要查找匹配的文檔,還須要計算每一個文件的相關度分值,所以爲更重量級的查詢,其查詢結果不會被緩存。

不過,得益於倒排索引,一個僅返回少許文檔的簡單query或許比一個跨數百萬文檔的filter執行起來並得顯得更慢。

Elasticsearch支持許多的query和filter,但最經常使用的也不過幾種。

Filter DSL中常見的有term Filter、terms Filter、range Filter、exists and missing Filters和bool Filter。

而Query DSL中常見的有match_all、match 、multi_match及bool Query。鑑於時間關係,這裏再也不細述,朋友們可參考官方文檔學習。

Queries用於查詢上下文,而filters用於過濾上下文,不過,Elasticsearch的API也支持此兩者合併運行。

組合查詢可用於合併查詢子句,組合過濾用於合併過濾子句,然而,Elasticsearch的使用習慣中,也常會把filter用於query上進行過濾。不過,不多有機會須要把query用於filter上的。

文章來源:http://www.itnose.net/detail/...

相關文章
相關標籤/搜索