在學校和老師一起做項目,在老師的推薦下深入學習了一些SqlServer的知識,看一些書下來哎也沒記住多少,不過帶來了新疑問。
不使用模糊查詢,我應該用什麼呢?如何能不影響資料庫性能,還能做模糊查詢呢?是以開始對Lucene有一些簡單的學習。
先舉一個未必恰當的例子:
假如有一天你犯罪了,警察如何找到你呢?肯定不應該是挨家挨戶的搜尋你吧。
警察可能先通過戶籍資訊和一些檔案,查詢到你的住址,學校,機關,去這些地方找。如果還找不到呢?
再找你常交往的朋友,得到一些你經常去的地方,再次索引到一些地點。
總之,雁過留痕,總能通過蛛絲馬迹的資訊,索引到你可能在的地方。這就是在浩瀚的資料搜尋中,索引,縮小範圍的重要性。
Lucene是一款全文搜尋引擎,它幫我們将非結構化的資料,以結構化的形式分析并存儲,以便于我們能類似于資料庫結構化的搜尋擷取到我們想要的資料。
既然要通過Lucene來搜尋,那就要将資料,以Lucene搜尋引擎認識的方式存儲。這個存儲的過程,稱之為索引(動詞),幫我們做這個動作的是索引引擎,幫我們查詢的是查詢引擎。另外文本分析引擎應該參與了查詢和索引的兩個動作。
Lucene以文檔的形式存儲,每一個文檔都有唯一辨別Id。一個文檔基本由多個域組成, 域由域名稱FieldName和域的值Value組成。
比如我們站内搜尋,搜尋目标是所有文章。可以将文章标題作為一個field,則其fieldName為“ArtName”字元串,其value值,為ArtName在資料庫中的值。
是以文章内容,文章作者,文章釋出時間,文章閱讀數,文章标簽等都可以放到同一個文檔中的不同域。
當我們索引上述提到的字段時,不僅在我們參數指定下,設定是否存儲,是否允許索引搜尋。Lucene中最重要的,是其分詞器将會提取詞語,建立詞語索引和文檔id的關聯。隻拿文章标題來說,其他的均可類比,比如四篇文章标題,
1.佳木斯大學簡介 文檔Id被索引為Id1
2.計算機科學與技術專業簡介 Id2
3.Java學習指南 Id3
4..Net學習指南 Id4
列舉幾個典型的分詞索引:
ArtName | 學習 | 3,4 |
指南 | ||
學習指南 | ||
簡介 | 1,2 | |
大學 | 1 | |
ArtContent (亂入一個内容Field) | Java | 4 |
想象一下,如果我們不建立這樣的索引,搜尋帶Java的内容,那麼一定要去周遊每一片文章。以上的索引存儲過程,稱為反向索引,意味着,先分析所需存儲資料的内容,并按照結構來索引存儲。等到我們查詢的時候,就不用每一條資料去周遊了。
上面這種分詞,源于強大的分詞器,Lucene本身不提供中文分詞器,可以使用第三方開源的,社群中比較遊優秀的,應該就是IK了,其可拓展性也是比較強的,我們可以通過在配置檔案中配置新的詞彙,比如“逗比”這個詞,在分詞器開發的時候,沒有這個詞,在索引的時候,則會分開索引,我們也可以很容易在配置檔案中加以配置。
從中得到另一個概念:其中每一個詞語,我們應稱之為Term。重要的是 我們看到其中亂入的ArtContent,由于域的名稱和最後一條資料不同,雖然他們的詞語都是Java,但是這屬于兩條Term。
Term的作用是什麼呢?
可以幫助我們建構查詢,也就是建構一個Term,這個查詢可以指定Field的Name為ArtName,Field的Value為Java。 這也就是說查詢文章标題,域值為Java的資料。而不是指定文章内容域。
我們也可以構造搜尋Query對象,查詢Java學習指南,這樣的搜尋,我們需要規定,标題中一定要帶Java,标題中一定要有學習,一定要有指南。這樣我們搜尋到的是Java學習指南而不是.Net
學習指南。
本篇記錄下Luence的一些基礎概念和意義。明白了這些,我想,看文檔寫代碼應該不是困難所在。