什么是Lucene?
Apache LuceneTM是完全用Java編寫的高性能,功能齊全的文本搜索引擎庫。 它是一項適用于幾乎所有需要全文搜索的應用程序的技術,尤其是跨平臺的應用程序。
Lucene可以純文本,整數,索引PDF,Office文檔。 等等。,
Lucene如何啟用更快的搜索?
Lucence創建了一個稱為倒排索引的東西。 通常我們在文檔中映射文檔->術語。 但是,Lucene則相反。 創建索引詞->包含該詞的文檔列表,這使搜索速度更快。
安裝Lucene
Maven依賴
<pre class='brush:xml'><dependency><groupid>org.apache.lucene</groupid><artifactid>lucene-core</artifactid><version>3.0.2</version><type>jar</type><scope>compile</scope>
</dependency>
下載依賴
從http://lucene.apache.org/下載Lucene,并在類路徑中添加lucene-core.jar。
Lucene如何工作?
首先讓我們從底部開始了解圖片-中心。 原始文本用于創建Lucene“文檔”,使用指定的分析器對其進行分析,然后根據字段的Store,TermVector和Analzed屬性將文檔添加到索引中。
接下來,從上到下搜索。 用戶以文本格式指定查詢。 查詢對象是基于查詢文本構建的,執行查詢的結果作為TopDocs返回。
Lucene核心課程
目錄,FSDirectory,RAMDirectory | 包含索引的目錄 基于文件系統的索引目錄 基于內存的索引目錄 | 目錄 indexDirectory = FSDirectory.open(新文件('c:// lucene // nodes')); |
索引作家 | 處理寫入索引– addDocument,updateDocument,deleteDocuments,merge等 | IndexWriter writer =新的IndexWriter(indexDirectory, 新的StandardAnalyzer(Version.LUCENE_30), 新的MaxFieldLength(1010101)); |
IndexSearcher | 使用indexReader進行搜索-搜索(查詢,整型) | IndexSearcher searcher =新的IndexSearcher(indexDirectory); |
文獻 | DTO用于索引和搜索 | Document document = new Document(); |
領域 | 每個文檔包含多個字段。 有2部分,名稱,值。 | 新字段('id','1',Store.YES,Index.NOT_ANALYZED) |
術語 | 測試一個字。 用于search.2零件。要搜索的字段和要搜索的值 | 條款term = new Term('id','1'); |
詢問 | 所有查詢類型的基礎-TermQuery,BooleanQuery,PrefixQuery,RangeQuery,WildcardQuery,PhraseQuery等。 | 查詢查詢=新的TermQuery(term); |
分析儀 | 從文本構建令牌,并幫助從文本構建索引詞 | 新的StandardAnalyzer() |
Lucene目錄
目錄–是Lucene在其上運行的數據空間。 它可以是文件系統或內存。
以下是常用的目錄
目錄 | 描述 | 例 |
FS目錄 | 基于文件系統的目錄 | 目錄= FSDirectory.open(文件文件); //文件->目錄路徑 |
RAM目錄 | 基于內存的Lucene目錄 | 目錄=新的MemoryDirectory() Directory = new MemoryDirectory(Directory dir)//將基于文件的目錄加載到內存 |
創建索引條目
Lucene的“文檔”對象是索引中使用的主要對象。 文檔包含多個字段。 分析器在文檔字段上進行工作,以將其分解為令牌,然后使用索引編寫器寫入目錄。
索引作家
IndexWriter writer = new IndexWriter(indexDirectory, new StandardAnalyzer(Version.LUCENE_30), true, MaxFieldLength.UNLIMITED);
分析儀
將文本分析為要搜索的標記或關鍵字的工作。 Lucene提供的默認分析器很少。 分析器的選擇定義了如何對索引文本進行標記和搜索。
以下是一些標準分析儀。
示例–分析器如何處理示例文本
定義字段索引的屬性
- 存儲–是否應存儲該字段以便將來檢索
- 分析–應將內容拆分為令牌
- TermVECTOR –是否存儲基于術語的詳細信息
店鋪:
是否應將該字段存儲起來以便以后撤退
是的 | 存儲值,以后可以從索引中檢索 |
商店編號 | 不要儲存。 與Index.ANALYZED一起使用。 當令牌僅用于搜索時 |
分析:
如何分析文字
索引分析 | 將文本分解為標記,對每個標記編制索引以使其可搜索 |
索引。NOT_ANALYZED | 將整個文本作為單個標記編制索引,但不要進行分析(拆分) |
Index.ANALYZED_NO_NORMS | 與ANALYZED相同,但不存儲規范 |
索引:NOT_ANALYZED_NO_NORMS | 與NOT_ANALYZED相同,但沒有規范 |
索引號 | 別 使此字段完全可搜索 |
詞向量
相似,突出顯示等需要術語詳細信息
TermVector.YES | 記錄 每個文檔中的唯一條款+計數+無位置+無偏移 |
TermVector.WITH_POSITIONS | 記錄 每個文檔中的唯一條款+計數+位置+無偏移 |
TermVector.WITH_OFFSETS | 記錄 每個文檔中的唯一條款+計數+無位置+抵消 |
TermVector.WITH_POSITIONS_OFFSETS | 記錄 每個文檔中的唯一條款+計數+位置+偏移 |
TermVector.NO | 不要記錄術語向量信息 |
創建索引的示例
IndexWriter writer = new IndexWriter(indexDirectory, new StandardAnalyzer(Version.LUCENE_30), true,MaxFieldLength.UNLIMITED);Document document = new Document();
document.add(new Field('id', '1', Store.YES, Index.NOT_ANALYZED));
document.add(new Field('name', 'user1', Store.YES, Index.NOT_ANALYZED));
document.add(new Field('age', '20', Store.YES, Index.NOT_ANALYZED));
writer.addDocument(document);
更新索引的示例
IndexWriter writer = new IndexWriter(indexDirectory, new StandardAnalyzer(Version.LUCENE_30), true,MaxFieldLength.UNLIMITED);Document document = new Document();
document.add(new Field("id", "1", Store.YES, Index.NOT_ANALYZED));
document.add(new Field("name", "user1", Store.YES, Index.NOT_ANALYZED));
document.add(new Field("age", "20", Store.YES, Index.NOT_ANALYZED));
writer.addDocument(document);
刪除索引的例子
IndexWriter writer = new IndexWriter(indexDirectory, new StandardAnalyzer(Version.LUCENE_30), MaxFieldLength.UNLIMITED);Term term = new Term('id', '1');
writer.deleteDocuments(term);
搜索索引: 用戶以文本格式指定查詢。 根據查詢文本構建查詢對象,對其進行分析,然后將執行的查詢結果作為TopDocs返回。
查詢是搜索的主要輸入。
術語查詢 | |
布爾查詢 | 是否(合并多個查詢) |
前綴查詢 | 以。。開始 |
通配符查詢 | ? 和* – *開頭不允許 |
詞組查詢 | 精確短語 |
范圍查詢 | 術語范圍或數字范圍 |
模糊查詢 | 相似詞搜索 |
樣本查詢
搜索示例:
IndexSearcher searcher = new IndexSearcher(indexDirectory);
Term term = new Term('id', '1');
Query query = new TermQuery(term);
TopDocs docs = searcher.search(query, 3);
for (int i = 1; i <= docs.totalHits; i++)
{System.out.println(searcher.doc(i));
}
Lucene診斷工具:
- 盧克– http://code.google.com/p/luke/
Luke是一個方便的開發和診斷工具,它可以訪問現有的Lucene索引,并允許您以幾種方式顯示和修改其內容: - 豪華轎車– http://limo.sourceforge.net/
這個想法是要有一個小的工具作為Web應用程序運行,它提供有關Lucene搜索引擎使用的索引的基本信息。
完整的例子:
在這里下載: LuceneTester.java
資源資源
- http://lucene.apache.org/core/
- http://www.amazon.com/Lucene-Action-Second-Edition-Covers/dp/1933988177/ref=dp_ob_title_bk
參考: Lucene –在Techie博客的Thoughts中,從我們的JCG合作伙伴 Srividhya Umashanker 快速添加了索引和搜索功能 。
翻譯自: https://www.javacodegeeks.com/2012/12/lucene-quickly-add-index-and-search-capability.html