搜素引擎全文檢索原理
一 全文檢索介紹
先建立索引,再對索引進行搜索的過程就叫全文檢索
搜索引擎核心:建立倒排索引
二 數據庫和 solor搜索引擎對比
1 搜索引擎的索引和 數據庫索引區別
原理相通,只是索引結構不同 一個是B+樹,一個是倒排索引樹
2 各自定位對比
數據庫核心是數據存儲和事務能力,在大數據量下搜索會很慢
搜索引核心是 專職建立索引使在大數據量下快速搜索, 並根據算法和 數據結構對查詢結果進行相關性排序
一個是結構化數據 ,另一個是非結構化數據
三 全文檢索流程圖
四 創建索引過程
第一步:一些要索引的原文檔(Document)。
為了方便說明索引創建過程,這裏特意用兩個文件為例:
文件一:Students should be allowed to go out with their friends, but not allowed to drink beer.
文件二:My friend Jerry went to school to see his students but found them drunk which is not allowed.
第二步:將原文檔進行詞法/語法分析 拆成一堆詞。
文檔拆成一個個詞,大小寫轉換,去掉標點,時態處理等等
“student”,“allow”,“go”,“their”,“friend”,“allow”,“drink”,“beer”,“my”,“friend”,“jerry”,“go”,“school”,“see”,“his”,“student”,“find”,“them”,“drink”,“allow”。
第三步:將得到的詞(Term)傳給索引組件(Indexer)。
索引 組件(Indexer)主要做以下幾件事情:
1. 利用得到的詞(Term)創建一個字典。
在我們的例子中字典如下:
Term | Document ID |
student | 1 |
allow | 1 |
go | 1 |
their | 1 |
friend | 1 |
allow | 1 |
drink | 1 |
beer | 1 |
my | 2 |
friend | 2 |
jerry | 2 |
go | 2 |
school | 2 |
see | 2 |
his | 2 |
student | 2 |
find | 2 |
them | 2 |
drink | 2 |
allow | 2 |
2. 對字典按字母順序進行排序。
Term | Document ID |
allow | 1 |
allow | 1 |
allow | 2 |
beer | 1 |
drink | 1 |
drink | 2 |
find | 2 |
friend | 1 |
friend | 2 |
go | 1 |
go | 2 |
his | 2 |
jerry | 2 |
my | 2 |
school | 2 |
see | 2 |
student | 1 |
student | 2 |
their | 1 |
them | 2 |
3. 合並相同的詞(Term) 成為文檔倒排(Posting List) 鏈表。
在此表中,有幾個定義:
- Document Frequency 即文檔頻次,表示總共有多少文件包含此詞(Term)。
- Frequency 即詞頻率,表示此文件中包含了幾個此詞(Term)。
至此索引創建完畢,下一步搜索過程
五 搜索過程
第一步:用戶輸入查詢語句。
查詢語句同我們普通的語言一樣,也是有一定語法的。
不同的查詢語句有不同的語法,如SQL語句就有一定的語法。
查詢語句的語法根據全文檢索系統的實現而不同。最基本的有比如:AND, OR, NOT等。
舉個例子,用戶輸入語句:lucene AND learned NOT hadoop。
說明用戶想找一個包含lucene和learned然而不包括hadoop的文檔。
第二步:對查詢語句進行詞法分析,語法分析,及語言處理。
由於查詢語句有語法,因而也要進行語法分析,語法分析及語言處理。
1. 詞法分析主要用來識別單詞和關鍵字。
比如關鍵字有AND, NOT等。
2. 語法分析主要是根據查詢語句的語法規則來進行 或/與/非等邏輯判斷。
3. 語言處理同索引過程中的語言處理幾乎相同。
如learned變成learn等。
經過第二步,我們得到一棵經過語言處理的語法樹。
第三步:搜索索引,得到符合語法樹的文檔。
此步驟有分幾小步:
- 首先,在反向索引表中,分別找出包含lucene,learn,hadoop的文檔鏈表。
- 其次,對包含lucene,learn的鏈表進行合並操作,得到既包含lucene又包含learn的文檔鏈表。
- 然後,將此鏈表與hadoop的文檔鏈表進行差操作,去除包含hadoop的文檔,從而得到既包含lucene又包含learn而且不包含hadoop的文檔鏈表。
- 此文檔鏈表就是我們要找的文檔。
第四步:根據得到的文檔和查詢語句的相關性,對結果進行排序。
1. 計算權重(Term weight)的過程。
影響一個詞(Term)在一篇文檔中的重要性主要有兩個因素:
- Term Frequency (tf):即此Term在此文檔中出現了多少次。tf 越大說明越重要。
- Document Frequency (df):即有多少文檔包含次Term。df 越大說明越不重要。
權重公式:
2. 判斷Term之間的關系從而得到文檔相關性的過程,也即向量空間模型的算法(VSM)。
我們把文檔看作一系列詞(Term),每一個詞(Term)都有一個權重(Term weight),不同的詞(Term)根據自己在文檔中的權重來影響文檔相關性的打分計算。
於是我們把所有此文檔中詞(term)的權重(term weight) 看作一個向量。
Document = {term1, term2, …… ,term N}
Document Vector = {weight1, weight2, …… ,weight N}
同樣我們把查詢語句看作一個簡單的文檔,也用向量來表示。
Query = {term1, term 2, …… , term N}
Query Vector = {weight1, weight2, …… , weight N}
我們把所有搜索出的文檔向量及查詢向量放到一個N維空間中,每個詞(term)是一維。
如圖:
我們認為兩個向量之間的夾角越小,相關性越大。
相關性打分公式如下:
舉個例子,查詢語句有11個Term,共有三篇文檔搜索出來。其中各自的權重(Term weight),如下表格。
|
t1 |
t2 |
t3 |
t4 |
t5 |
t6 |
t7 |
t8 |
t9 |
t10 |
t11 |
D1 |
0 |
0 |
.477 |
0 |
.477 |
.176 |
0 |
0 |
0 |
.176 |
0 |
D2 |
0 |
.176 |
0 |
.477 |
0 |
0 |
0 |
0 |
.954 |
0 |
.176 |
D3 |
0 |
.176 |
0 |
0 |
0 |
.176 |
0 |
0 |
0 |
.176 |
.176 |
Q |
0 |
0 |
0 |
0 |
0 |
.176 |
0 |
0 |
.477 |
0 |
.176 |
於是計算,三篇文檔同查詢語句的相關性打分分別為:
於是文檔二相關性最高,先返回,其次是文檔一,最後是文檔三。
到此為止,我們可以找到我們最想要的文檔了。
搜素引擎全文檢索原理