lucene&solr學習——建立和查詢索引(代碼篇)

1. Lucene的下載java

Lucene是開發全文檢索功能的工具包,從官網下載Lucene4.10.3並解壓。spring

官網:http://lucene.apache.org/apache

版本:lucene7.7.0 (學習上不必最新的,由於企業中也不會升級太快)工具

Jdk要求:1.7以上學習

2.使用的jar包測試

核心包spa

其餘:code

 

 3. 建立索引庫對象

(1) 實現步驟 (程序的編寫步驟與以前分析的理論步驟是顛倒過來的)blog

第一步:建立java工程,並導入jar包

第二步:建立一個indexwriter對象(建立索引)

  1.指定索引庫的存放位置Directory對象

  2.指定一個分析器,對文檔內容進行分析

第三步:建立document對象 (構建文檔對象)

第四步:建立field對象,將field添加到document

第五步:使用indexwriter對象將document對象寫到索引庫,此過程進行索引建立。並將索引和document對象寫入索引庫。

第六步:關閉IndexWriter對象

(2) Field域的屬性

是否分析:是否對域的內容進行分詞處理。前提是咱們要對域的內容進行查詢。

是否索引:將Field分析後的詞或整個Field值進行索引,只有索引方可搜索到。

好比:商品名稱,商品簡介分析後進行索引,訂單號,身份證號不用分析但也要索引,這些未來都要做爲查詢條件

是否存儲:將Field值存儲在文檔中,存儲在文檔中的Field才能夠從Document中獲取。

好比:商品名稱,訂單號,凡是未來要從Document中獲取的Field都要存儲

是否存儲的標準:是否將內容展現給用戶

 

測試代碼:

將下面的文件,建立成索引

 

 代碼:

public class FirstLucene { @Test public void textIndex() throws Exception { // 第一步:建立java工程,並導入jar包 // 第二步:建立一個indexwriter對象(建立索引) //   1.指定索引庫的存放位置Directory對象
        Directory directory = FSDirectory.open(Paths.get("E:\\temp\\index"));  //文件系統目錄 file system directory //   2.指定一個分析器,對文檔內容進行分析
        Analyzer analyzer = new StandardAnalyzer();//官方推薦分詞器
        IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer); IndexWriter indexWriter = new IndexWriter(directory, indexWriterConfig); File f = new File("E:\\searchSource"); File[] listFiles = f.listFiles(); for (File file : listFiles) { // 第三步:建立document對象 (構建文檔對象)
            Document document = new Document(); // 第四步:建立field對象,將field添加到document //文件名稱
            String file_name = file.getName(); Field fieldNameField = new TextField("fileName", file_name, Store.YES); //文件大小
            long file_size = FileUtils.sizeOf(file); Field fileSizeField = new LongPoint("fileSize", file_size); Field fileSizeFieldStore = new StoredField("fileSize", file_size); //文件路徑
            String file_path = file.getPath(); Field filePathField = new StoredField("filePath", file_path); //文件內容
            String file_content = FileUtils.readFileToString(file); Field fileContentField = new TextField("fileContent", file_content, Store.NO); document.add(fieldNameField); document.add(fileSizeField); document.add(fileSizeFieldStore); document.add(filePathField); document.add(fileContentField); // 第五步:使用indexwriter對象將document對象寫到索引庫,此過程進行索引建立。並將索引和document對象寫入索引庫。
 indexWriter.addDocument(document); } // 第六步:關閉IndexWriter對象
 indexWriter.close(); } }

結果:

4.查詢索引

(1) 實現步驟:

  第一步:建立一個Directory對象,也就是索引庫存放的位置

  第二步:建立一個indexReader對象,須要制定Directory對象

  第三步:建立一個indexsearcher對象,須要指定IndexReader對象

  第四步:建立一個TermQuery對象,制定查詢的域和查詢的關鍵詞

  第五步:執行查詢。

  第六步:返回查詢結果,便利查詢結果並輸出

  第七步:關閉IndexReader對象。

(2) IndexSearcher搜索方法

代碼:

@Test public void testSearch() throws Exception { // 第一步:建立一個Directory對象,也就是索引庫存放的位置
        Directory directory = FSDirectory.open(Paths.get("E:\\temp\\index")); // 第二步:建立一個indexReader對象,須要指定Directory對象
        IndexReader indexReader =DirectoryReader.open(directory); // 第三步:建立一個indexsearcher對象,須要指定IndexReader對象
        IndexSearcher indexSearcher = new IndexSearcher(indexReader); // 第四步:建立一個TermQuery對象,制定查詢的域和查詢的關鍵詞
        Query query = new TermQuery(new Term("fileName", "spring")); // 第五步:執行查詢。
        TopDocs topDocs = indexSearcher.search(query, 2); // 第六步:返回查詢結果,遍歷查詢結果並輸出
        ScoreDoc[] scoreDocs = topDocs.scoreDocs; for (ScoreDoc scoreDoc : scoreDocs) { int doc = scoreDoc.doc; Document document = indexSearcher.doc(doc); //文件名稱
            String fileName = document.get("fileName"); System.out.println(fileName); //文件內容
            String fileContent = document.get("fileContent"); System.out.println(fileContent); //文件路徑
            String fileSize = document.get("fileSize"); System.out.println(fileSize); //文件大小
            String filePath = document.get("filePath"); System.out.println(filePath); System.out.println("---------"); } // 第七步:關閉IndexReader對象。
 indexReader.close(); }

結果:

相關文章
相關標籤/搜索