天天看點

lucene基礎lucene基礎知識

lucene基礎知識

一.Lucene簡介和核心原理

1.Lucene是什麼

lucene是全文檢索引擎的工具包,并不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構。開發人員可以以此為基礎實作完整的全文檢索的功能,或者以此為基礎建立的完整全文檢索引擎,比如:單機solr、分布式elasticsearch。

2.反向索引

反向索引源于實際應用中需要根據屬性的值來查找記錄。這種索引表中的每一項都包括一個屬性值和具有該屬性值的各記錄的位址。由于不是由記錄來确定屬性值,而是由屬性值來确定記錄的位置,因而稱為反向索引(inverted index)。帶有反向索引的檔案我們稱為反向索引檔案,簡稱倒排檔案(inverted file)。

二.Lucene  API

1.Analyzer

Analyzer 是分析器,它的作用是把一個字元串按某種規則劃分成一個個詞語,并去除其中的無效詞語,這裡說的無效詞語是指英文中的“of”、 “the”,中文中的 “的”、“地”等詞語,這些詞語在文章中大量出現,但是本身不包含什麼關鍵資訊,去掉有利于縮小索引檔案、提高效率、提高命中率。

分詞的規則千變萬化,但目的隻有一個:按語義劃分。這點在英文中比較容易實作,因為英文本身就是以單詞為機關的,已經用空格分開;而中文則必須以某種方法将連成一片的句子劃分成一個個詞語。具體劃分方法下面再詳細介紹,這裡隻需了解分析器的概念即可。

2.Docuement

索引的資料結構單元,對應建立索引目标的一條條記錄,可以是單個檔案、一行字元串或者資料庫表的一條記錄,同時也是field的集合清單;使用者進行搜尋的結果也是以Document清單的形式傳回。

注:類似資料庫中的每一條記錄

3.Field(域)

一個Document可以包含多個資訊域,例如一篇文章可以包含“标題”、“正文”、“最後修改時間”等資訊域,這些資訊域就是通過Field在Document中存儲的。

Field有三個屬性:是否分詞、是否存儲、是否索引;一般是否分詞要和索引結合使用,比如對文章全文檢索為例:

文章有Id、title(标題)、author(作者)、sumary(摘要)、内容(content);

Analyzed Index Store 說明
Id N N Y 一般不會根據Id查詢,是以不需分詞索引,但可能拼接url需要Id
title Y Y Y

關鍵字查詢,需分詞;

根據标題查詢需索引;

可能根據整個标題查詢需存儲

sumary Y Y Y

關鍵字查詢,需分詞;

根據摘要查詢需索引;

可能根據整個摘要查詢需存儲

author N Y Y

隻允許根據作者完整名稱的情況下查詢;

根據作者查詢需索引;

content Y Y N 根據文章内容的關鍵字查詢,需對文章内容進行分詞建立是以,但文章整體内容太大一般不存儲

4.Term

Term是搜尋的最小機關,它表示文檔的一個詞語,由詞語和詞語所要查詢的field組成。比如想查詢作者名稱為“張三”的文章

:author=張三                         是一個term

Term term = new Term(fieldname,str);

注:類似于關系型資料庫中查詢條件中的key和value:select * from tableid=1

5.Token

tocken是term的一次出現,它包含trem文本和相應的起止偏移,以及一個類型字元串。一句話中可以出現多次相同的詞語,它們都用同一個term表示,但是用不同的tocken,每個tocken标記該詞語出現的地方。

6.Segment

添加索引時并不是每個document都馬上添加到同一個索引檔案,它們首先被寫入到不同的小檔案,然後再合并成一個大索引檔案,這裡每個小檔案都是一個segment。

三.建立索引和查詢

         Lucene不同的版本實作方式略微有些差别,比如IndexWriter低版本的實作

:IndexWriter writer = new IndexWriter(indexPath,StandAnlyzer,true);

高版本的實作

:IndexWriter writer = new IndexWriter(directory,indexWriterConfig);

lucene6.0版本以上需要jdk1.8版本,  建立索引和查詢demo參照官網6.0版本,如果jdk為1.7要降用lucene5.0版本,代碼稍微有差異,需根據jdk版本修改

官網位址為:

https://lucene.apache.org/core/6_0_0/demo/index.html

繼續閱讀