轉載請注明出處:[http://blog.csdn.net/xiaojimanman/article/details/42818185](http://blog.csdn.net/xiaojimanman/article/details/42818185)
通過前一篇博客,對所以也許有了一個大致的了解,知道檢索是一個怎樣的過程,這篇博客就簡單的介紹一下lucene實現的數學模型。
前面我們已經提到lucene實現的索引是一種反向索引,有詞典和倒排表組成(實際的結構要比這個復雜很多),那索引的數學模型又是怎樣的呢?在開始這個之前,還是先熟悉下幾個名詞。
**文檔(Document)**:[上篇博客中](http://blog.csdn.net/xiaojimanman/article/details/42804713)的索引創建過程中列舉的幾個事例,每一句話都可以看成一個文檔,當然該文檔只有一個**域(Field)**,通過標準分詞技術,我們將這個域的值分成了很多的**詞元(Term)**,文檔、域、詞元這三個就是我們需要理解的三個名詞。(這里自己想一下我們這次的案例 小說信息中,哪些是文檔、域和詞元?)
**計算權重(Term Weight)過程**?
從上面的介紹可知,一個文檔可以分成多個詞元(不同的分詞技術,分成不同的詞元),不同的詞元對于文檔的重要程度也是不同的。影響一個詞元在一篇文檔中的重要性主要有下面兩個因素:
1、Term Frequency(tf) :即此Term在此文檔中出現的次數,tf越大,說明該詞元越重要;
2、Document Frequency(df) :即有多少文檔包含此Term,df越大,說明該詞元越不重要。
上面這兩個因素對權重的影響也很好理解,這就好比我們自己的技能一樣,掌握很深的技能對自己工作的重要程度要大于那些一般的技能,當然,如果某項技能只有你自己或者少數幾個人了解,那你在這方面就有很大的競爭力(好像又扯遠了)。那我們來看一下公式:

當然這只是一個簡單典型的計算公式,lucene在實際的實現過程中就與此少有不同。
**空間向量模型(VSM)**
我們可以把一篇文檔看作是一系列詞元的集合,每個詞元都有一個權重,如下:
~~~
Document = {term1, term2, term3 …… termN}
DocumentVector = {weight1, weight2, weight3 …… weightN}
~~~
我們把所以的文檔放到一個N維的空間向量中(所有文檔分成N個詞元,就N維向量;其中文檔D在m坐標上的映射為文檔D中的m詞元的權重),如圖:

這樣我們再計算兩個文檔相關程度的時候,就可以看他們之間的夾角大小即可(夾角越小,相關程度越高,否則相關程度越低)。當然該N維向量也可以用于用戶的檢索。
**檢索索引**
在這個數學模型中,對文檔信息的檢索,就轉化為求兩個向量之間的夾角大小,當然,我們也需要對用戶的搜索關鍵詞進行分詞創建空間向量,如下圖:

從上圖中,我們可以認為兩個向量之間的夾角越小,相關性越大,否則相關性越小,因此我們計算夾角的余弦值作為兩者的相關性。這樣我們通過計算查詢向量與每一個向量的夾角余弦值就可得到該查詢字符串與索引中的記錄的相關度,然后對其排序即可得到最終的結果。
下一篇再介紹一下lucene的文件結構就不再介紹lucene的基本原理了,后面就簡單的介紹一下案例中可能用到的API。所以如果想詳細的了解lucene的原理,請參照網上其他學習資料或者相關的資料書。
ps:時間不早了,明天再繼續寫文件結構部分。
- 前言
- 寫在開始之前
- lucene初始認知
- 索引數學模型
- 索引文件結構
- 創建索引
- 搜索索引
- 分詞器介紹
- Query查詢
- IndexSearcher中檢索方法
- 更新說明
- 案例初識
- JsonUtil & XmlUtil
- 基ClassUtil & CharsetUtil
- ParseUtil & ParseRequest
- 數據庫連接池
- 實現實時索引基本原理
- 實時索引管理類IndexManager
- 實時索引的檢索
- 實時索引的修改
- 查詢語句創建PackQuery
- 縱橫小說更新列表頁抓取
- 縱橫小說簡介頁采集
- 縱橫小說章節列表采集
- 縱橫小說閱讀頁采集
- 縱橫小說數據庫設計
- 縱橫小說數據庫操作
- 縱橫小說分布式采集