1. 程式人生 > >搜素引擎全文檢索原理

搜素引擎全文檢索原理

alias img 結構化 com 數據結構 sql lis count jpg

一 全文檢索介紹

先建立索引,再對索引進行搜索的過程就叫全文檢索

搜索引擎核心:建立倒排索引

二 數據庫和 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等。

經過第二步,我們得到一棵經過語言處理的語法樹。

技術分享圖片

第三步:搜索索引,得到符合語法樹的文檔。

此步驟有分幾小步:

  1. 首先,在反向索引表中,分別找出包含lucene,learn,hadoop的文檔鏈表。
  2. 其次,對包含lucene,learn的鏈表進行合並操作,得到既包含lucene又包含learn的文檔鏈表。
  3. 然後,將此鏈表與hadoop的文檔鏈表進行差操作,去除包含hadoop的文檔,從而得到既包含lucene又包含learn而且不包含hadoop的文檔鏈表。
  4. 此文檔鏈表就是我們要找的文檔。

第四步:根據得到的文檔和查詢語句的相關性,對結果進行排序。

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

於是計算,三篇文檔同查詢語句的相關性打分分別為:

技術分享圖片

技術分享圖片

技術分享圖片

於是文檔二相關性最高,先返回,其次是文檔一,最後是文檔三。

到此為止,我們可以找到我們最想要的文檔了。

搜素引擎全文檢索原理