倒排索引,它也是索引。索引,初衷都是爲了快速檢索到你要的數據。html
我相信你必定知道mysql的索引,若是對某一個字段加了索引,通常來講查詢該字段速度是能夠有顯著的提高。
每種數據庫都有本身要解決的問題(或者說擅長的領域),對應的就有本身的數據結構,而不一樣的使用場景和數據結構,須要用不一樣的索引,才能起到最大化加快查詢的目的。
對 Mysql 來講,是 B+ 樹,對 Elasticsearch/Lucene 來講,是倒排索引。mysql
剛剛胖滾豬說到圖書的例子,目錄和索引頁,其實就很形象的能夠比喻爲正排索引和倒排索引。爲了進一步加深理解,再看看熟悉的搜索引擎。沒有搜索引擎時,咱們只能直接輸入一個網址,而後獲取網站內容,這時咱們的行爲是document -> words。此謂「正向索引」。後來,咱們但願可以輸入一個單詞,找到含有這個單詞,或者和這個單詞有關係的文章,即word -> documents。因而咱們把這種索引,叫「反向索引」,或者「倒排索引」。
好了,咱們來總結一下:git
假如一篇文章當中,有這麼一段話"胖滾豬編程讓你收穫快樂",我要經過"胖滾豬"這個詞來搜索到這篇文章,那麼應該如何實現呢。es6
咱們是很容易想到,能夠將這篇文章的詞都拆開,拆分爲"胖滾豬"、"編程"、"收穫"、"快樂"。注意咱們把沒用的詞,好比"讓"去掉了。這個拆分短語的過程涉及到ES的分詞,另外中文分詞仍是比較複雜的,不像英文分詞通常用空格分隔就能夠。等會咱們再來講分詞吧,如今你只要知道,咱們是會按必定規則把文章單詞拆分的。
那麼拆開了,怎麼去找呢?天然會維護一個單詞和文檔的對應關係,如圖:github
倒排索引的核心組成正則表達式
一、單詞詞典:記錄全部文檔的單詞,通常都比較大。還會記錄單詞到倒排列表的關聯信息。
二、倒排列表:記錄了單詞對應的文檔集合,由倒排索引項組成。倒排索引項包含以下信息:sql
下圖是 Elasticsearch 中數據索引過程的流程。ES由 Analyzer 組件對文檔執行一些操做並將具體子句拆分爲 token/term,簡單說就是分詞,而後將這些術語做爲倒排索引存儲在磁盤中。
數據庫
ES的JSON文檔中的每個字段,都有本身的倒排索引,固然你能夠指定某些字段不作索引,優勢是這樣能夠節省磁盤空間。可是不作索引的話字段沒法被搜索到。
注意兩個關鍵詞:分詞和倒排索引。倒排索引我相信你已經懂了!分詞咱們立刻就來聊聊!編程
仍是回到咱們開頭的那個查詢例子,畢竟胖滾豬心心念念爲何會搜出兩個文檔!首先咱們用_analyze來分析一下ES會如何對它進行分詞及倒排索引:
json
如今你是否是一目瞭然了呢!先無論_analyze是何方神聖,反正你看到結果了,ES將它分紅了一個個字,這是ES中默認的中文分詞。掌握分詞要先懂兩個名詞:analysis與analyzer
analysis:
文本分析,是將全文本轉換爲一系列單詞的過程,也叫分詞。analysis是經過analyzer(分詞器)來實現的,可使用Elasticearch內置的分詞器,也能夠本身去定製一些分詞器。
analyzer(分詞器):
由三部分組成:
注意:除了在數據寫入時將詞條進行轉換,查詢的時候也須要使用相同的分析器對語句進行分析。即咱們寫入蘋果的時候分詞成了蘋和果,查詢蘋果的時候一樣也是分詞成蘋和果去查。
ES內置分詞器
看概念太虛了!必定要動手實操纔有用!咱們能夠用_analyze進行分析,會輸出分詞後的結果,舉兩個例子吧!其餘的你也要本身課後動手試試哦!
#默認分詞器 按詞切分 小寫處理 GET _analyze { "analyzer": "standard", "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening." } #能夠發現停用詞被去掉了 GET _analyze { "analyzer": "stop", "text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening." }
中文擴展分詞器
如今來解決胖滾豬的問題,蘋果明明一個詞,不想讓它分爲兩個呀!中文分詞在全部搜索引擎中都是一個很大的難點,中文的句子應該是切分紅一個個的詞,可是一句中文,在不一樣的上下文,實際上是不一樣的理解,例如: 這個蘋果,不大好吃/這個蘋果,不大,好吃。
有一些比較不錯的中文分詞插件:IK、THULAC等。咱們能夠試試用IK進行中文分詞。
#安裝插件 https://github.com/medcl/elasticsearch-analysis-ik/releases 在plugins目錄下建立analysis-ik目錄 解壓zip包到當前目錄 重啓ES #查看插件 bin/elasticsearch-plugin list #查看安裝的插件 GET http://localhost:9200/_cat/plugins?v
IK分詞器:支持自定義詞庫、支持熱更新分詞字典
curl -X GET "localhost:9200/_analyze?pretty" -H 'Content-Type: application/json' -d' { "analyzer" : "ik_max_word", "text" : "這個蘋果不大好吃" } '
如何使用分詞器
列舉了不少的分詞器,那麼在實際中該如何使用呢?看看下面這個代碼演示就懂啦!
# 建立索引時候指定某個字段的分詞器 PUT iktest { "mappings": { "properties": { "content": { "type": "text", "analyzer": "ik_smart" } } } } # 插入一條文檔 PUT iktest/_doc/1 { "content":"這個蘋果不大好吃" } # 測試分詞效果 GET /iktest/_analyze { "field": "content", "text": "這個蘋果不大好吃" }
本文轉載自公衆號【胖滾豬學編程】