漫畫 ES原理 必知必會的倒排索引和分詞

2022-07-08 08:18:10 字數 3068 閱讀 4374

倒排索引,它也是索引。索引,初衷都是為了快速檢索到你要的資料。

我相信你一定知道mysql的索引,如果對某乙個欄位加了索引,一般來說查詢該欄位速度是可以有顯著的提公升。

每種資料庫都有自己要解決的問題(或者說擅長的領域),對應的就有自己的資料結構,而不同的使用場景和資料結構,需要用不同的索引,才能起到最大化加快查詢的目的。

對 mysql 來說,是 b+ 樹,對 elasticsearch/lucene 來說,是倒排索引。

剛剛胖滾豬說到圖書的例子,目錄和索引頁,其實就很形象的可以比喻為正排索引和倒排索引。為了進一步加深理解,再看看熟悉的搜尋引擎。沒有搜尋引擎時,我們只能直接輸入乙個**,然後獲取**內容,這時我們的行為是document -> words。此謂「正向索引」。後來,我們希望能夠輸入乙個單詞,找到含有這個單詞,或者和這個單詞有關係的文章,即word -> documents。於是我們把這種索引,叫「反向索引」,或者「倒排索引」。

好了,我們來總結一下:

假如一篇文章當中,有這麼一段話"胖滾豬程式設計讓你收穫快樂",我要通過"胖滾豬"這個詞來搜尋到這篇文章,那麼應該如何實現呢。

我們是很容易想到,可以將這篇文章的詞都拆開,拆分為"胖滾豬"、"程式設計"、"收穫"、"快樂"。注意我們把沒用的詞,比如"讓"去掉了。這個拆分短語的過程涉及到es的分詞,另外中文分詞還是比較複雜的,不像英文分詞一般用空格分隔就可以。等會我們再來說分詞吧,現在你只要知道,我們是會按一定規則把文章單詞拆分的。

那麼拆開了,怎麼去找呢?自然會維護乙個單詞和文件的對應關係,如圖:

倒排索引的核心組成

1、單詞詞典:記錄所有文件的單詞,一般都比較大。還會記錄單詞到倒排列表的關聯資訊。

2、倒排列表:記錄了單詞對應的文件集合,由倒排索引項組成。倒排索引項包含如下資訊:

下圖是 elasticsearch 中資料索引過程的流程。es由 analyzer 元件對文件執行一些操作並將具體子句拆分為 token/term,簡單說就是分詞,然後將這些術語作為倒排索引儲存在磁碟中。

還是回到我們開頭的那個查詢例子,畢竟胖滾豬心心念念為什麼會搜出兩個文件!首先我們用_analyze來分析一下es會如何對它進行分詞及倒排索引:

現在你是不是一目了然了呢!先不管_analyze是何方神聖,反正你看到結果了,es將它分成了乙個個字,這是es中預設的中文分詞。掌握分詞要先懂兩個名詞:analysis與analyzer

** analysis:**

文字分析,是將全文本轉換為一系列單詞的過程,也叫分詞。analysis是通過analyzer(分詞器)來實現的,可以使用elasticearch內建的分詞器,也可以自己去定製一些分詞器。

** analyzer(分詞器): **

由三部分組成:

注意:除了在資料寫入時將詞條進行轉換,查詢的時候也需要使用相同的分析器對語句進行分析。即我們寫入蘋果的時候分詞成了蘋和果,查詢蘋果的時候同樣也是分詞成蘋和果去查。

es內建分詞器

看概念太虛了!一定要動手實操才有用!我們可以用_analyze進行分析,會輸出分詞後的結果,舉兩個例子吧!其他的你也要自己課後動手試試哦!

#預設分詞器 按詞切分 小寫處理

get _analyze

​#可以發現停用詞被去掉了

get _analyze

中文擴充套件分詞器現在來解決胖滾豬的問題,蘋果明明乙個詞,不想讓它分為兩個呀!中文分詞在所有搜尋引擎中都是乙個很大的難點,中文的句子應該是切分成乙個個的詞,但是一句中文,在不同的上下文,其實是不同的理解,例如: 這個蘋果,不大好吃/這個蘋果,不大,好吃。

有一些比較不錯的中文分詞外掛程式:ik、thulac等。我們可以試試用ik進行中文分詞。

#安裝外掛程式

在plugins目錄下建立analysis-ik目錄 解壓zip包到當前目錄 重啟es

#檢視外掛程式

bin/elasticsearch-plugin list

#檢視安裝的外掛程式

** ik分詞器:支援自定義詞庫、支援熱更新分詞字典 **

'** 如何使用分詞器 **

列舉了很多的分詞器,那麼在實際中該如何使用呢?看看下面這個**演示就懂啦!

# 建立索引時候指定某個欄位的分詞器

put iktest}}}

# 插入一條文件

put iktest/_doc/1

# 測試分詞效果

get /iktest/_analyze

mysql的必知必會 mysql 必知必會 筆記

好久沒有寫了。1 show columns from table 等同於describe table顯示的是表的結構。而select from table 則顯示的是整個表中插入的資料。2 select distinct c1,c2 from table除非列不相同,否則所有行將被檢索出來,即不能對...

MySQL 索引與優化必知必會

mysql 是業務後台系統經常用到的結構化資料庫。掌握 mysql 相關知識是研發人員必備的能力。與此同時,在面試過程當中,mysql 的知識點也是經常被當做面試題目,以此來考量候選人的能力。隨著業務量的增加,對於 mysql 效能優化的要求也越來越高,而索引方面是效能優化重點考慮的方向,所以深入理...

ES倒排索引原理與實現過程 建立倒排索引的步驟

提取詞項 首先對文件進行分詞,英文文件使用空格分隔。去掉沒有實際意義的詞,如is a in as等 大小寫轉換,使用關鍵字elasticsearch 能把elasticsearch 和elasticsearch都查詢出來,因此所有的單詞統一大小寫。單 複數,過去式 進行時等進行轉換,如希望使用ind...