系列文章
倒排索引
Elasticsearch 使用一種稱爲 倒排索引 的結構,它適用於快速的全文搜索。一個倒排索引由文檔中所有不重複詞的列表構成,對於其中每個詞,有一個包含它的文檔列表。
示例:
- (1):假設文檔集合包含五個文檔,每個文檔內容如圖所示,在圖中最左端一欄是每個文檔對應的文檔編號。我們的任務就是對這個文檔集合建立倒排索引。
- 2):中文和英文等語言不同,單詞之間沒有明確分隔符號,所以首先要用分詞系統將文檔自動切分成單詞序列。這樣每個文檔就轉換爲由單詞序列構成的數據流,爲了系統後續處理方便,需要對每個不同的單詞賦予唯一的單詞編號,同時記錄下哪些文檔包含這個單詞,在如此處理結束後,我們可以得到最簡單的倒排索引“單詞ID”一欄記錄了每個單詞的單詞編號,第二欄是對應的單詞,第三欄即每個單詞對應的倒排列表
- (3):索引系統還可以記錄除此之外的更多信息,下圖還記載了單詞頻率信息(TF)即這個單詞在某個文檔中的出現次數,之所以要記錄這個信息,是因爲詞頻信息在搜索結果排序時,計算查詢和文檔相似度是很重要的一個計算因子,所以將其記錄在倒排列表中,以方便後續排序時進行分值計算。
- (4):倒排列表中還可以記錄單詞在某個文檔出現的位置信息
- (1,<11>,1),(2,<7>,1),(3,<3,9>,2)
有了這個索引系統,搜索引擎可以很方便地響應用戶的查詢,比如用戶輸入查詢詞“Facebook”,搜索系統查找倒排索引,從中可以讀出包含這個單詞的文檔,這些文檔就是提供給用戶的搜索結果,而利用單詞頻率信息、文檔頻率信息即可以對這些候選搜索結果進行排序,計算文檔和查詢的相似性,按照相似性得分由高到低排序輸出,此即爲搜索系統的部分內部流程。
倒排索引原理
1.The quick brown fox jumped over the lazy dog
2.Quick brown foxes leap over lazy dogs in summer
倒排索引:
Term Doc_1 Doc_2
Quick | | X The | X | brown | X | X dog | X | dogs | | X fox | X | foxes | | X in | | X jumped | X | lazy | X | X leap | | X over | X | X quick | X | summer | | X the | X |
搜索quick brown :
Term Doc_1 Doc_2
brown | X | X quick | X |
Total | 2 | 1
計算相關度分數時,文檔1的匹配度高,分數會比文檔2高
問題:
Quick 和 quick 以獨立的詞條出現,然而用戶可能認爲它們是相同的詞。
fox 和 foxes 非常相似, 就像 dog 和 dogs ;他們有相同的詞根。
jumped 和 leap, 儘管沒有相同的詞根,但他們的意思很相近。他們是同義詞。
搜索含有 Quick fox的文檔是搜索不到的
使用標準化規則(normalization): 建立倒排索引的時候,會對拆分出的各個單詞進行相應的處理,以提升後面搜索的時候能夠搜索到相關聯的文檔的概率
Term Doc_1 Doc_2
brown | X | X dog | X | X fox | X | X in | | X jump | X | X lazy | X | X over | X | X quick | X | X summer | | X the | X | X
分詞器介紹及內置分詞器
分詞器:從一串文本中切分出一個一個的詞條,並對每個詞條進行標準化
包括三部分:
- character filter:分詞之前的預處理,過濾掉HTML標籤,特殊符號轉換等
- tokenizer:分詞
- token filter:標準化
ElasticSearch內置分詞器:
- standard 分詞器:(默認的)他會將詞彙單元轉換成小寫形式,並去除停用詞和標點符號,支持中文采用的方法爲單字切分
- simple 分詞器:首先會通過非字母字符來分割文本信息,然後將詞彙單元統一爲小寫形式。該分析器會去掉數字類型的字符。
- Whitespace 分詞器:僅僅是去除空格,對字符沒有lowcase化,不支持中文; 並且不對生成的詞彙單元進行其他的標準化處理。
- language 分詞器:特定語言的分詞器,不支持中文