全文搜索Apache Lucene簡介

在本教程中,我想談談Apache Lucene 。 Lucene是一個開源項目,提供基于Java的索引和搜索技術。 使用其API,很容易實現全文搜索 。 我將處理Lucene Java版本 ,但請記住,還有一個名為Lucene.NET的.NET端口,以及一些有用的子項目。

我最近閱讀了有關該項目的精彩教程 ,但沒有提供實際的代碼。 因此,我決定提供一些示例代碼來幫助您開始使用Lucene。 我們將構建的應用程序將允許您索引自己的源代碼文件并搜索特定的關鍵字。

首先,讓我們從其中一個Apache Download Mirrors下載最新的穩定版本。 我將使用的版本是3.0.1,所以我下載了lucene-3.0.1.tar.gz捆綁包(請注意,.tar.gz版本明顯小于相應的.zip版本)。 解壓縮tarball并找到lucene-core-3.0.1.jar文件,稍后將使用它。 此外,請確保在瀏覽器中打開Lucene API JavaDoc頁面(文檔也包含在壓縮包中以供離線使用)。 接下來,設置一個新的Eclipse項目,假設其名稱為“ LuceneIntroProject”,并確保在項目的類路徑中包含上述JAR。

在開始運行搜索查詢之前,我們需要構建一個索引,將針對該索引執行查詢。 這將在名為IndexWriter的類的幫助下完成,該類是創建和維護索引的類。 IndexWriter接收Document作為輸入,其中document是索引和搜索的單位。 每個Document實際上是一組Field ,每個字段都有一個名稱和一個文本值。 要創建IndexWriter,需要使用分析器 。 此類是抽象的,我們將使用的具體實現是SimpleAnalyzer 。

已經說夠了,讓我們創建一個名為“ SimpleFileIndexer”的類,并確保包含一個主要方法。 這是此類的源代碼:

package com.javacodegeeks.lucene;import java.io.File;
import java.io.FileReader;
import java.io.IOException;import org.apache.lucene.analysis.SimpleAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.FSDirectory;public class SimpleFileIndexer {public static void main(String[] args) throws Exception {File indexDir = new File("C:/index/");File dataDir = new File("C:/programs/eclipse/workspace/");String suffix = "java";SimpleFileIndexer indexer = new SimpleFileIndexer();int numIndex = indexer.index(indexDir, dataDir, suffix);System.out.println("Total files indexed " + numIndex);}private int index(File indexDir, File dataDir, String suffix) throws Exception {IndexWriter indexWriter = new IndexWriter(FSDirectory.open(indexDir), new SimpleAnalyzer(),true,IndexWriter.MaxFieldLength.LIMITED);indexWriter.setUseCompoundFile(false);indexDirectory(indexWriter, dataDir, suffix);int numIndexed = indexWriter.maxDoc();indexWriter.optimize();indexWriter.close();return numIndexed;}private void indexDirectory(IndexWriter indexWriter, File dataDir, String suffix) throws IOException {File[] files = dataDir.listFiles();for (int i = 0; i < files.length; i++) {File f = files[i];if (f.isDirectory()) {indexDirectory(indexWriter, f, suffix);}else {indexFileWithIndexWriter(indexWriter, f, suffix);}}}private void indexFileWithIndexWriter(IndexWriter indexWriter, File f, String suffix) throws IOException {if (f.isHidden() || f.isDirectory() || !f.canRead() || !f.exists()) {return;}if (suffix!=null && !f.getName().endsWith(suffix)) {return;}System.out.println("Indexing file " + f.getCanonicalPath());Document doc = new Document();doc.add(new Field("contents", new FileReader(f)));        doc.add(new Field("filename", f.getCanonicalPath(), Field.Store.YES, Field.Index.ANALYZED));indexWriter.addDocument(doc);}}

讓我們來談談這個課程。 我們提供了索引的位置,即索引數據將保存在磁盤上的位置(“ c:/ index /”)。 然后,我們提供數據目錄,即將遞歸掃描輸入文件的目錄。 為此,我選擇了整個Eclipse工作區(“ C:/ programs / eclipse / workspace /”)。 由于我們只希望為Java源代碼文件建立索引,因此我還添加了一個后綴字段。 您顯然可以根據您的搜索需求調整這些值。 “索引”方法考慮了先前的參數,并使用IndexWriter的新實例來執行目錄索引。 “ indexDirectory”方法使用一種簡單的遞歸算法來掃描所有目錄以查找帶有.java后綴的文件。 對于每個符合條件的文件,將在“ indexFileWithIndexWriter”中創建一個新文檔,并填充相應的字段。 如果您通過Eclipse將類作為Java應用程序運行,則輸入目錄將被索引,輸出目錄將如下圖所示: 好的,我們完成了索引工作,讓我們繼續進行方程式的搜索部分。 為此,需要一個IndexSearcher類,它是實現主要搜索方法的類。 對于每次搜索,都需要一個新的Query對象(SQL可以使用SQL嗎?),可以從QueryParser實例中獲得該對象。 請注意,必須使用與創建索引相同的分析器類型來創建QueryParser,在我們的示例中,使用SimpleAnalyzer。 根據JavaDocs, Version也用作構造函數參數,并且是一個“被某些類用來在Lucene的各個發行版之間匹配版本兼容性”的類。 諸如此類的存在使我感到困惑,但是無論如何,讓我們為應用程序使用適當的版本( Lucene_30 )。 由IndexSearcher執行搜索時,將返回TopDocs對象作為執行結果。 此類僅表示搜索結果,并允許我們檢索ScoreDoc對象。 使用ScoreDocs,我們找到符合搜索條件的文檔,然后從這些文檔中檢索所需的信息。 讓我們看看所有這些都在起作用。 創建一個名為“ SimpleSearcher”的類,并確保包含一個主要方法。 此類的源代碼如下:

package com.javacodegeeks.lucene;import java.io.File;import org.apache.lucene.analysis.SimpleAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;public class SimpleSearcher {public static void main(String[] args) throws Exception {File indexDir = new File("c:/index/");String query = "lucene";int hits = 100;SimpleSearcher searcher = new SimpleSearcher();searcher.searchIndex(indexDir, query, hits);}private void searchIndex(File indexDir, String queryStr, int maxHits) throws Exception {Directory directory = FSDirectory.open(indexDir);IndexSearcher searcher = new IndexSearcher(directory);QueryParser parser = new QueryParser(Version.LUCENE_30, "contents", new SimpleAnalyzer());Query query = parser.parse(queryStr);TopDocs topDocs = searcher.search(query, maxHits);ScoreDoc[] hits = topDocs.scoreDocs;for (int i = 0; i < hits.length; i++) {int docId = hits[i].doc;Document d = searcher.doc(docId);System.out.println(d.get("filename"));}System.out.println("Found " + hits.length);}}

我們提供索引目錄,搜索查詢字符串和最大匹配數,然后調用“ searchIndex”方法。 在該方法中,我們創建一個IndexSearcher,一個QueryParser和一個Query對象。 請注意,QueryParser使用我們用于使用IndexWriter創建文檔的字段的名稱(“內容”),并且再次使用相同類型的分析器(SimpleAnalyzer)。 我們執行搜索,并為找到匹配項的每個Document提取包含文件名(“ filename”)的字段的值,然后進行打印。 就是這樣,讓我們??執行實際的搜索。 作為Java應用程序運行它,您將看到包含您提供的查詢字符串的文件的名稱。

可以從此處下載本教程的Eclipse項目,包括依賴庫。

更新:您還可以使用Apache Lucene Spell-Checker查看我們后續的文章“您的意思是”功能 。

請享用!

相關文章 :
  • Apache Lucene拼寫檢查器的“您是不是要”功能
  • 使用Spring AspectJ和Maven進行面向方面的編程
  • 調度Java應用程序中的主體
  • 依賴注入–手動方式

翻譯自: https://www.javacodegeeks.com/2010/05/introduction-to-apache-lucene-for-full.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374893.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374893.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374893.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

函數scanf

本節介紹輸入函數 scanf 的用法。scanf 和 printf 一樣&#xff0c;非常重要&#xff0c;而且用得非常多&#xff0c;所以一定要掌握。 概述 scanf 的功能用一句話來概括就是“通過鍵盤給程序中的變量賦值”。該函數的原型為&#xff1a; # include <stdio.h> int scanf(…

C語言中定義變量位置

C標準的問題 C89規定&#xff0c;在任何執行語句之前&#xff0c;在塊的開頭聲明所有局部變量。 即應該如下&#xff1a;定義變量只能在最開始&#xff0c;scanf等執行語句之前 int N 0;double sum 0;scanf("%d",&N);在C99以及C中則沒有這個限制&#xff0c;即…

Java中的低GC:使用原語而不是包裝器

總覽 有兩個很好的理由在可能的地方使用原語而不是包裝器。 明晰。 通過使用原語&#xff0c;您可以清楚地知道null值是不合適的。 性能。 使用原語通常更快。 清晰度通常比性能更重要&#xff0c;并且是使用它們的最佳理由。 但是&#xff0c;本文討論了使用包裝程序對性能…

C# 連接Oracle數據庫以及一些簡單的操作

拖了很久今天終于在博客園寫了自己第一篇隨筆&#xff1a; 話不多說&#xff0c;我們直接進入正題&#xff1a; 1.連接數據庫 using (OracleConnection conn new OracleConnection("data source192.168.97.60/orcl;User Idabc;Passwordabc;")) { …

markdownb編輯器

這是H1 這是H2 這是H3 這是一個標題。 這是第一行列表項。這是第二行列表項。給出一些例子代碼&#xff1a; return shell_exec("echo $input | $markdown_script"); 轉載于:https://www.cnblogs.com/xcl461330197/p/4605163.html

Java Secret:使用枚舉構建狀態機

總覽 Java中的枚舉比許多其他語言更強大&#xff0c;這可能導致令人驚訝的用途。 在本文中&#xff0c;我概述了Java 枚舉的一些單獨功能&#xff0c;并將它們組合在一起形成一個狀態機。 單例和實用程序類的枚舉 您可以非常簡單地將枚舉用作Singleton或Utility。 enum Si…

數組部分筆記

對于數組的初始化需要注意以下幾點&#xff1a; 可以只給部分元素賦值。當{ }中值的個數少于元素個數時&#xff0c;只給前面部分元素賦值。例如&#xff1a; int a[10]{12, 19, 22 , 993, 344};表示只給 a[0]~a[4] 5個元素賦值&#xff0c;而后面 5 個元素自動初始化為 0。 …

指向函數的指針

指向函數的指針變量的一般形式為&#xff1a;數據類型 &#xff08;*指針變量名&#xff09;&#xff08;函數參數表列&#xff09;&#xff1b;如&#xff1a; int (*p)(int ,int );1、int (*p)(int ,int );表示定義一個指向函數的指針變量p&#xff0c;它不是固定只能指向…

核心Java面試答案不正確

總覽 在Internet上&#xff0c;Java面試問題和答案從一個網站復制到另一個網站。 這可能意味著錯誤或過時的答案可能永遠不會得到糾正。 這是一些不太正確或已經過時的問題和答案。 即是Java 5.0之前的版本。 每個提供的問題后都有兩個部分。 斜體的第一部分指示答案不完整/錯…

138.括號序列(區間型DP)

3657 括號序列 時間限制: 1 s空間限制: 256000 KB題目等級 : 黃金 Gold題解查看運行結果題目描述 Description我們用以下規則定義一個合法的括號序列&#xff1a; &#xff08;1&#xff09;空序列是合法的 &#xff08;2&#xff09;假如S是一個合法的序列&#xff0c;則 (S) …

C# 執行批處理文件(*.bat)的方法代碼

代碼如下:static void Main(string[] args){Process proc null;try{ string targetDir string.Format("D:\adapters\setup");//this is where mybatch.bat liesproc new Process();proc.StartInfo.WorkingDirectory targetDir;proc.StartInfo.Fil…

C語言空格怎么表示

1.直接敲空格就行&#xff0c;或者使用ASCII碼值賦值為32。 空格沒有轉義字符。 printf("12%c45 58",32);輸出 12 45 582.合法轉義字符如下&#xff1a;\a 響鈴(BEL) 、\b 退格(BS)、\f 換頁(FF)、\n 換行(LF)、\r 回車(CR)、\t 水平制表(HT)、\v 垂直制表(VT) 0、…

Tomcat中的零停機部署(和回滾); 演練和清單

親愛的大家&#xff0c; 如果您認為Tomcat不能再進步&#xff0c;那您就錯了。 Tomcat 7引入了所謂的并行部署 。 這是由SpringSource / VMWare貢獻的。 簡而言之&#xff0c;并行部署是一種能夠并行部署一個以上版本的Web應用程序的功能&#xff0c;使所有版本都可以在完全相…

javaweb 學習資源

http://jinnianshilongnian.iteye.com/category/231099轉載于:https://www.cnblogs.com/sishahu/p/5368018.html

HDU 1863 暢通工程(最小生成樹,prim)

題意&#xff1a; 給出圖的邊和點數&#xff0c;要求最小生成樹的代價&#xff0c;注&#xff1a;有些點之間是不可達的&#xff0c;也就是可能有多個連通圖。比如4個點&#xff0c;2條邊:1-2&#xff0c;3-4。 思路&#xff1a; 如果不能連通所有的點&#xff0c;就輸出‘?’…

2000年不算在21世紀

練習3-5 輸出閏年 (15 分) 輸出21世紀中截止某個年份以來的所有閏年年份。注意&#xff1a;閏年的判別條件是該年年份能被4整除但不能被100整除、或者能被400整除。 想當然地以為21世紀是2000~2099&#xff0c;當然沒有通過 if(N > 2000&&N < 2099){for(int i …

使用迭代器時如何避免ConcurrentModificationException

Java Collection類是快速失敗的&#xff0c;這意味著如果在使用迭代器遍歷某個線程的同時更改了Collection&#xff0c;則iterator.next&#xff08;&#xff09;將拋出ConcurrentModificationException 。 在多線程以及單線程環境下都可能出現這種情況。 讓我們通過以下示例探…

Sublime Text 3實用快捷鍵大全

下面是我通過網上教程和文本資料學習sublime Text3時收集的一些實用功能和常用快捷鍵&#xff0c;現在分享出來&#xff0c;如果還有其它的好用的功能可以在下面留言&#xff0c;以便互相學習和交流&#xff0c;謝謝&#xff01;。 選擇類 CtrlD 選中光標所占的文本&#xff0c…

Tomcat中配置JNDI數據源

準備工作&#xff1a; Tomcat版本&#xff1a;tomcat6.0以上 下例中均使用MySQL數據庫 將對應數據源的jar包和MySQL的驅動包拷貝至tomcat的lib文件夾下 一、全局數據源 1步驟一&#xff1a;配置 在tomcat下的conf/server.xml的GlobalNamingResources節點標簽中增加如下配置&…

練習3-8 查詢水果價格 (15 分)

練習3-8 查詢水果價格 (15 分) 給定四種水果&#xff0c;分別是蘋果&#xff08;apple&#xff09;、梨&#xff08;pear&#xff09;、桔子&#xff08;orange&#xff09;、葡萄&#xff08;grape&#xff09;&#xff0c;單價分別對應為3.00元/公斤、2.50元/公斤、4.10元/公…