一朋凉、倒排索引
Elasticsearch使用一種稱為倒排索引的結構唠梨,它適用于快速的全文捜索.一個倒排索引由文檔中所有不重復詞的列表構成,對于其中每個詞侥啤,有一個包含它的文檔列表当叭。
示例:
- 假設文檔集合包含五個文檔,毎個文檔內容如圖所示盖灸,在圖中最左端一欄是每個文檔對應的文擋編號蚁鳖。我們的任務就是對這個文檔集合建立倒排索引。
文檔編號赁炎,文檔內容
- 中文和英文等語言不同醉箕,單詞之間沒有明確分隔符號钾腺,所以首先要用分詞系統(tǒng)將文擋自動切分成單詞序列.這樣每個文檔就轉換為由單詞序列構成的數據
流,為了系統(tǒng)后續(xù)處理方便讥裤,需要對每個不同的單詞賦予唯一的單詞編號放棒,同時記錄下哪些文擋包含這個單詞,在如此處理結束后己英,我們可以得到最簡單的倒排索引间螟。
單詞id 單詞 文檔ID
- 索引系統(tǒng)還可以記錄除此之外的更多信息,下圖還記載了單詞頻率信息损肛。 (TF) 即這個單詞在某個文檔中的出現(xiàn)次數厢破。之所以要記錄這個信息,是因為詞頻信息在搜索結果排序時治拿,計算查詢和文檔相似度是很重要的一個計算因子摩泪,所以將其記錄在倒排列表中,以方便后續(xù)排序時進行分值計算劫谅。
谷歌(1:2) 1是文檔id见坑,2是出現(xiàn)次數
- 倒排列表中還可以記錄單詞在某個文檔出現(xiàn)的位置信息
#id是1的單詞,出現(xiàn)1次捏检,文檔位置是11
#id是2的文檔荞驴,出現(xiàn)1次,文檔位置是7
#id是3的文檔未檩,出現(xiàn)2次戴尸,文檔位置是3粟焊,9
(1,<11>,1),(2,<7>,1),(3,<3,9>,2)
有了這個索引系統(tǒng)冤狡,搜索引擎可以很方便地響應用戶的查詢,比如用戶輸入查詢詞Facebook项棠,搜索系統(tǒng)查找倒排索引悲雳,從中可以讀出包含這個單詞的文
檔,這些文檔就是提供給用戶的搜索結果香追,而利用單詞頻率信息合瓢、文檔頻率信息即可以對這些搜索結果進行排序,計算文檔和查詞的相似性透典,按照相似性
得分由高到低排序輸出晴楔,此即為搜索系統(tǒng)的部分內部流程。
image.png
image.png
二峭咒、分詞器
1. 分詞器概念
從一串文本中切分出一個一個的詞條税弃,并対每個詞條進行標準化 ,包括三部分:
1)character filter:分詞之前的預處理凑队,過濾掉HTML標簽.持殊符號轉換等
2)tokenizer:分詞
3)token filter: 標 準 化
2. 內置分詞器:
-
standard分詞器:
(默認的)他會枵詞匯單元轉換成d烏形式则果,并去除俸用詞和標點符號?支持中文采用的方法為單字切分 -
simple分詞器:
酋先會通過非字母字符來分割文本信息,然后枵詞匯單元統(tǒng)一為兩形式?該分忻器會去掉數字類型的字符? -
Whitespace分詞器:
僅僅是去除空格,對字符沒有l(wèi)owcase化,不支持中文西壮;并且不對生成的詞匯單元進行其他的標準化處理, -
language分詞器:
持走語言的分詞器?不支持中文
安裝中文分詞器
- 下載中文分詞器 https://github.com/medcl/elasticsearch-analysis-ik
下載elasticsearch-analysis-ik-master.zip - 解壓elasticsearch-analysis-ik-master.zip
unzip elasticsearch-analysis-ik-master.zip - 進入elasticsearch-analysis-ik-master,編譯源碼
mvn clean install -Dmaven.test.skip=true
#生成文件
/target/releases/elasticsearch-analysis-ik-7.0.0.zip
cd elasticsearch-7.1.1/plugins/
#
mv elasticsearch-analysis-ik-7.0.0.zip elasticsearch-7.1.1/plugins/ik
- 在es的plugins文件夾下創(chuàng)建目錄ik
- 編譯后生成的elasticsearch-analysis-ik-版本.zip移動到ik下遗增,并解壓
- 解壓后的內容移動到ik目錄下
- 重啟elasticsearch,啟動報錯
Plugin [analysis-ik] was built for Elasticsearch version 7.0.0 but version 7.1.1 is running
問題原因
Es 版本和 ik分詞器版本不一致款青。
由于我用的Es時最新版本 7.1.1做修,而ik分詞器master編譯出來也只是7.0.0
解決辦法
修改ik目錄下的 plugin-descriptor.properties 文件中的
elasticsearch.version=你的ES版本號
刪除ik目錄,重新解壓可都,先改變版本號缓待,再重啟elasticsearch
#啟動日志
[INFO ][o.e.p.PluginsService ] loaded module [x-pack-watcher]
[INFO ][o.e.p.PluginsService ] loaded plugin [analysis-ik]