Elasticsearch(2)全文搜索和Lucene


學習ES之前先了解一下全文搜索和Lucene吧,本文只是蜻蜓點水,具體的內部實現和詳細的資料請自行google查閱~~


全文搜索


全文搜索是指計算機搜索程序通過掃描文章的每一個詞,對每一個詞建立一個索引,指明該詞在文章中出現的次數和位置,當用戶查詢的時候,搜索程序會根據之前建立的索引去查找,並將查找結果返回給用戶,這個過程類似於查字典。Lucene是目前全球使用最廣的全文搜索引擎開源庫。

Lucene介紹

Lucene是apache軟件基金會4 jakarta項目組的一個子項目,是一個開放源代碼的全文檢索引擎工具包,但它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文本分析引擎(英文與德文兩種西方語言)。Lucene的目的是爲軟件開發人員提供一個簡單易用的工具包,以方便的在目標系統中實現全文檢索的功能,或者是以此爲基礎建立起完整的全文檢索引擎。Lucene是一套用於全文檢索和搜尋的開源程式庫,由Apache軟件基金會支持和提供。Lucene提供了一個簡單卻強大的應用程式接口,能夠做全文索引和搜尋。在Java開發環境裏Lucene是一個成熟的免費開源工具。就其本身而言,Lucene是當前以及最近幾年最受歡迎的免費Java信息檢索程序庫。人們經常提到信息檢索程序庫,雖然與搜索引擎有關,但不應該將信息檢索程序庫與搜索引擎相混淆。

Lucene倒排索引

首先我們看一個實際問題:有一些學生信息,包括了姓名,家庭住址,聯繫電話。現在我們需要找到甘肅省的學生。傳統的數據庫我們需要建一張學生信息表:

id name address mobile
1 田狗 甘肅省隴南市 13310002212
2 唐狗 甘肅省嘉峪關市 12210001121
3 老馬 廣州市城關區 12210001121

當我們在查詢甘肅省的學生時只需用sql去匹配甘肅省

select * from student where address like "%甘肅省%";

但是當我們在查詢的時候輸入了甘肅省廣州,我們希望可以查出甘肅省和蘭州的所有信息,這樣的話通過一條sql是無法完成的,這個時候我們就有了一種新的選擇方式:我們將學生的住址進行分詞,取得關鍵字,即

甘肅省, 隴南市,嘉峪關市,廣州市,城關區

我們用關鍵詞和學生記錄建立對應關係得到

關鍵詞 記錄編號
城關區 3
甘肅省 1,2
隴南市 1
嘉峪關市 2
廣州市 3

通常情況下我們不僅需要知道關鍵詞在哪條記錄,也需要知道在記錄中的位置和出現的次數,一般有兩種位置:

  1. 字符位置,即記錄該詞是記錄中的第幾個字符(優點是顯示並定位關鍵詞速度快)。
  2. 關鍵詞位置,記錄該詞是記錄中的第幾個關鍵詞(優點是節約索引空間、詞組查詢快),Lucene使用這種方式。

加上出現頻率和出現位置,我們得到如下的索引結構

關鍵詞 記錄編號【出現評率】 出現位置
城關區 3[1] 2
甘肅省 1[1],
2[1]
1,
1
隴南市 1[1] 2
嘉峪關市 2[1] 2
廣州市 3[1] 1

當我們在查詢“甘肅省廣州”時,會同時匹配到甘肅省和廣州兩個詞,得到1,2,3三條記錄。這種由屬性值來確定記錄的索引方式就叫做–倒排索引。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章