轉載請注明出處:[http://blog.csdn.net/xiaojimanman/article/details/42884921](http://blog.csdn.net/xiaojimanman/article/details/42884921)
此事例中的索引數據來自于上一篇博客創建的索引,索引中包含兩篇文檔,每一篇文檔中有兩個域 name 、 content 。
**索引搜索demo**
還是老樣子在介紹之前先看一個簡單索引搜索 demo程序。
~~~
/**
*@Description: 索引檢索demo
*/
package com.lulei.lucene.study;
import java.io.File;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
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 SearchIndex {
public static void main(String[] args) {
Directory directory = null;
try {
//索引硬盤存儲路徑
directory = FSDirectory.open(new File("D://study/index/testindex"));
//讀取索引
DirectoryReader dReader = DirectoryReader.open(directory);
//創建索引檢索對象
IndexSearcher searcher = new IndexSearcher(dReader);
//指定分詞技術,這里采用的語言處理模塊要和創建索引的時候一致,否則檢索的結果很不理想
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_43);
//創建查詢query,搜索詞為“空間向量”
QueryParser parse = new QueryParser(Version.LUCENE_43, "content", analyzer);
Query query = parse.parse("空間向量");
//檢索索引,獲取符合條件的前10條記錄
TopDocs topDocs = searcher.search(query, 10);
if (topDocs != null) {
System.out.println("總共查找到 " + topDocs.totalHits + " 條符合條件的記錄");
//循環輸出記錄內容
for (int i = 0; i < topDocs.scoreDocs.length; i++) {
Document doc = searcher.doc(topDocs.scoreDocs[i].doc);
System.out.println("第" + (i + 1) + "條內容為--\tname:\t" + doc.get("name") + "\tcontent:\t" + doc.get("content"));
}
}
//關閉資源
dReader.close();
directory.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
~~~
上述demo程序運行結果截圖如下:

可以看出關鍵詞 “空間向量” 的搜索結果為索引中的第二個文檔,可以通過document.get方法可以獲取對應的域值。
**搜索索引核心類**
在上述索引搜索過程中,用到了幾個核心類:**Directory**、**DirectoryReader**、**IndexSearcher**、**Analyzer**、**Query**、**TopDocs**,上一篇介紹過的核心類這里就不再繼續介紹了,這里就介紹一下之前沒有介紹過的類。
**DirectoryReader**
DirectoryReader用于讀取索引,創建的dReader對象用于創建用于搜索的IndexSearcher對象。
**IndexSearcher**
IndexSearcher用于索引的搜索,這個類公開了幾個搜索方法,它是連接索引的中心環節;可以將IndexSearcher類看做成一個以只讀打開索引的類,關于IndexSearcher的更深層次的內容,將在后面博客中介紹。
**Query**
Lucene中含有許多具體Query(查詢)子類,Query子類有:TermQuery、BooleanQuery、PhraseQuery、PrefixQuery、PhrasePrefixQuery、TermRangQuery、NumericRangeQuery、FilteredQuery、SpanQuery等,這些子類也將會在以后的博客中一一介紹。
**TopDocs**
TopDocs類是一個簡單的指針容器,指針一般指向前N個排名的搜索結果,搜索結果即匹配查詢條件的文檔。
到目前為止,我們可以用Lucene實現一個簡單的索引創建、搜索事例,在后面的幾篇博客中,我將會逐一介紹分詞技術、Query眾多子類、IndexSearcher的搜索API等,這幾部分可以通過源代碼的閱讀來理解。
- 前言
- 寫在開始之前
- lucene初始認知
- 索引數學模型
- 索引文件結構
- 創建索引
- 搜索索引
- 分詞器介紹
- Query查詢
- IndexSearcher中檢索方法
- 更新說明
- 案例初識
- JsonUtil &amp; XmlUtil
- 基ClassUtil &amp; CharsetUtil
- ParseUtil &amp; ParseRequest
- 數據庫連接池
- 實現實時索引基本原理
- 實時索引管理類IndexManager
- 實時索引的檢索
- 實時索引的修改
- 查詢語句創建PackQuery
- 縱橫小說更新列表頁抓取
- 縱橫小說簡介頁采集
- 縱橫小說章節列表采集
- 縱橫小說閱讀頁采集
- 縱橫小說數據庫設計
- 縱橫小說數據庫操作
- 縱橫小說分布式采集