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();
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM