7.Lucene精確搜索

一、 獲取搜索的關鍵字

獲取用戶輸入的內容,假如我們要搜索文檔中 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();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章