【Elastic Search權威指南 讀書小記5】ES之映射和分析

有道雲筆記:http://note.youdao.com/noteshare?id=ebcd395028460a105f45f79e4e5ac7cd

映射(mapping)機制用於進行字段類型確認,將每個字段匹配爲一種確定的數據類型

( string , number , booleans , date 等)。

分析(analysis)機制用於進行全文文本(Full Text)的分詞,以建立供搜索用的反向索引。

就我的理解來說,映射通過類型猜測實現了傳統關係數據庫的數據類型存儲問題。這裏的好處很多,確定不同的數據類型有利於存儲時選擇對應的數據結構,精準查詢時性能也會更高。分析機制即es獨有的倒排索引實現的全文檢索。兩者相輔相成。

 

分析和分析器

分析(analysis)是這樣一個過程:

首先,標記化一個文本塊爲適用於倒排索引單獨的詞(term)

然後標準化這些詞爲標準形式,提高它們的“可搜索性”或“查全率”

這個工作是分析器(analyzer)完成的。一個分析器(analyzer)只是一個包裝用於將三個功能放

到一個包裏:

字符過濾器

首先字符串經過字符過濾器(character filter),它們的工作是在標記化前處理字符串。字符過

濾器能夠去除HTML標記,或者轉換 "&" 爲 "and" 。

分詞器

下一步,分詞器(tokenizer)被標記化成獨立的詞。一個簡單的分詞器(tokenizer)可以根據空

格或逗號將單詞分開(譯者注:這個在中文中不適用)。

標記過濾

最後,每個詞都通過所有標記過濾(token filters),它可以修改詞(例如將 "Quick" 轉爲小

寫),去掉詞(例如停用詞像 "a" 、 "and" 、 "the" 等等),或者增加詞(例如同義詞

像 "jump" 和 "leap" )

Elasticsearch提供很多開箱即用的字符過濾器,分詞器和標記過濾器。這些可以組合來創建

自定義的分析器以應對不同的需求。我們將在《自定義分析器》章節詳細討論。

內建的分析器

不過,Elasticsearch還附帶了一些預裝的分析器,你可以直接使用它們。下面我們列出了最

重要的幾個分析器,來演示這個字符串分詞後的表現差異:

"Set the shape to semi-transparent by calling set_trans(5)"

標準分析器

Elasticsearch權威指南(中文版)

分析

113標準分析器是Elasticsearch默認使用的分析器。對於文本分析,它對於任何語言都是最佳選

擇(譯者注:就是沒啥特殊需求,對於任何一個國家的語言,這個分析器就夠用了)。它根

據Unicode Consortium的定義的單詞邊界(word boundaries)來切分文本,然後去掉大部分標

點符號。最後,把所有詞轉爲小寫。產生的結果爲:

set, the, shape, to, semi, transparent, by, calling, set_trans, 5

簡單分析器

簡單分析器將非單個字母的文本切分,然後把每個詞轉爲小寫。產生的結果爲:

set, the, shape, to, semi, transparent, by, calling, set, trans

空格分析器

空格分析器依據空格切分文本。它不轉換小寫。產生結果爲:

Set, the, shape, to, semi-transparent, by, calling, set_trans(5)

語言分析器

特定語言分析器適用於很多語言。它們能夠考慮到特定語言的特性。例如, english 分析器

自帶一套英語停用詞庫——像 and 或 the 這些與語義無關的通用詞。這些詞被移除後,因爲

語法規則的存在,英語單詞的主體含義依舊能被理解(譯者注: stem English words 這句不

知道該如何翻譯,查了字典,我理解的大概意思應該是將英語語句比作一株植物,去掉無用

的枝葉,主幹依舊存在,停用詞好比枝葉,存在與否並不影響對這句話的理解。)。

english 分析器將會產生以下結果:

set, shape, semi, transpar, call, set_tran, 5

注意 "transparent" 、 "calling" 和 "set_trans" 是如何轉爲詞幹的。

當分析器被使用

當我們索引(index)一個文檔,全文字段會被分析爲單獨的詞來創建倒排索引。不過,當我們

在全文字段搜索(search)時,我們要讓查詢字符串經過同樣的分析流程處理,以確保這些詞在

索引中存在。

全文查詢我們將在稍後討論,理解每個字段是如何定義的,這樣纔可以讓它們做正確的事:

Elasticsearch權威指南(中文版)

分析

114當你查詢全文(full text)字段,查詢將使用相同的分析器來分析查詢字符串,以產生正確

的詞列表。

當你查詢一個確切值(exact value)字段,查詢將不分析查詢字符串,但是你可以自己指

定。

現在你可以明白爲什麼《映射和分析》的開頭會產生那種結果:

date 字段包含一個確切值:單獨的一個詞 "2014-09-15" 。

_all 字段是一個全文字段,所以分析過程將日期轉爲三個

詞: "2014" 、 "09" 和 "15" 。

當我們在 _all 字段查詢 2014 ,它一個匹配到12條推文,因爲這些推文都包含詞 2014 :

GET /_search?q=2014 # 12 results

當我們在 _all 字段中查詢 2014-09-15 ,首先分析查詢字符串,產生匹配任一

詞 2014 、 09 或 15 的查詢語句,它依舊匹配12個推文,因爲它們都包含詞 2014 。

GET /_search?q=2014-09-15 # 12 results !

當我們在 date 字段中查詢 2014-09-15 ,它查詢一個確切的日期,然後只找到一條推文:

GET /_search?q=date:2014-09-15 # 1 result

當我們在 date 字段中查詢 2014 ,沒有找到文檔,因爲沒有文檔包含那個確切的日期:

GET /_search?q=date:2014 # 0 results !

對於中文來說,需要和英文截然不同的分詞器。這個在後面會提到。

 

映射

注意

這意味着,如果你索引一個帶引號的數字—— "123" ,它將被映射爲 "string" 類型,而

不是 "long" 類型。然而,如果字段已經被映射爲 "long" 類型,Elasticsearch將嘗試轉

換字符串爲long,並在轉換失敗時會拋出異常。

 

複合核心字段類型

1.數組:取第一個數據類型。

2.空值會存空值,null,"",[]各種空值都會變成空字段來存儲

3.多層對象會通過加 . 來扁平化處理

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