一、 獲取搜索的關鍵字
獲取用戶輸入的內容,假如我們要搜索文檔中 title 字段包含 “組件” 這個詞的記錄。
二、 根據傳入的字段和關鍵字進行組裝搜索語法
TermQuery:
單字段搜索,精確查詢,搜索的內容不會分詞,"組件"、"刷新 " 可以查詢到數據,“組件刷新” 查詢不到。
new TermQuery(new Term("title", title)
三、 根據搜索語法到索引中查詢得到索引指向的文檔編號
創建一個查詢對象,然后傳入搜索條件,搜索返回TopDocs。
TopDocs存儲的是根據關鍵字查詢出來的文檔編號列表,我們可指定查詢的數量。
// 創建一個索引查詢對象
DirectoryReader reader = DirectoryReader.open(fsd);
IndexSearcher searcher = new IndexSearcher(reader);
// 傳入查詢條件,指定查詢10條記錄
TopDocs docs = searcher.search(new TermQuery(new Term("title", title)), 10);
四、 根據文檔編號的信息查詢出文檔數據對象
我們查詢到文檔的編號以后,我就就可以根據編號來獲取文檔對象了;
TopDocs.totalHits 表示符合條件的數據量。
TopDocs.scoreDocs 表示查詢到的文檔索引對象,里面的doc屬性就表示文檔的編號集合。
我們得到文檔的編號后就可以使用IndexSearcher的doc方法獲取到文檔了。
for (ScoreDoc doc : docs.scoreDocs) {
Document document = searcher.doc(doc.doc);
System.out.println(document.get("title"));
}
附錄:完整代碼
@Test
public void termQuery() {
// lucene索引目錄位置
String indexDir = "E:\\develop\\demo\\lucene-learn\\lucene-index";
File luceneIndexDirectory = new File(indexDir);
String title = "組件";
// 打開索引目錄
try (FSDirectory fsd = FSDirectory.open(luceneIndexDirectory.toPath())) {
// 創建一個索引查詢對象
DirectoryReader reader = DirectoryReader.open(fsd);
IndexSearcher searcher = new IndexSearcher(reader);
// 單字段搜索,單關鍵字精確查詢
// 組件、刷新 可以查詢到數據,組件刷新 查詢不到
TopDocs docs = searcher.search(new TermQuery(new Term("title", title)), 10);
// 打印
for (ScoreDoc doc : docs.scoreDocs) {
Document document = searcher.doc(doc.doc);
System.out.println(document.get("title"));
}
// 關閉查詢Reader
reader.close();
} catch (IOException e) {
System.err.println("打開索引目錄失敗");
e.printStackTrace();
}
}