首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Lucene 實戰:從零構建布爾查詢搜尋引擎原型

     編輯:Java 相關知識

Lucene 定位:工具包而非成品搜尋引擎

Apache Lucene 是「全文檢索引擎架構」,提供索引、查詢、分析三大核心模組,但缺乏爬蟲、分佈式、管理介面等產品級功能。生產環境通常直接使用 Elasticsearch/Solr;學習 Lucene 核心 API 有助於理解上層產品原理。

核心概念速覽

  • Document:可檢索單元,包含多個 Field
  • Analyzer:分詞器,決定文本如何切分成 Term(標準分詞器 StandardAnalyzer 適合英文)
  • IndexWriter:建立/更新索引
  • IndexSearcher:執行查詢
  • Query 及其子類:TermQuery、BooleanQuery、WildcardQuery 等

完整可執行範例:BooleanQuery MUST + MUST

需求:查詢書名同時包含「生」與「記」的文檔。

package LuceneSearch;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.*;
import org.apache.lucene.index.*;
import org.apache.lucene.search.*;
import org.apache.lucene.store.FSDirectory;
import java.io.File;

public class BooleanQueryTest {
    static final String INDEX_DIR = "E:/IndexDemo";

    public static void main(String[] args) throws Exception {
        // 1. 建立索引
        try (IndexWriter writer = new IndexWriter(
                FSDirectory.open(new File(INDEX_DIR).toPath()),
                new StandardAnalyzer(),
                IndexWriter.MaxFieldLength.UNLIMITED)) {

            String[] books = {"鋼鐵是怎樣煉成的", "英雄兒女", "浮生六記", 
                              "太平廣記", "文化苦旅", "白夜行", "白毛女", "子不語"};
            for (String title : books) {
                Document doc = new Document();
                doc.add(new TextField("bookname", title, Field.Store.YES));
                writer.addDocument(doc);
            }
            System.out.println("索引建立完成,共 " + writer.numDocs() + " 文檔");
        }

        // 2. 執行布爾查詢
        try (IndexSearcher searcher = new IndexSearcher(DirectoryReader.open(FSDirectory.open(new File(INDEX_DIR).toPath())))) {
            Term t1 = new Term("bookname", "生");
            Term t2 = new Term("bookname", "記");

            BooleanQuery.Builder builder = new BooleanQuery.Builder();
            builder.add(new TermQuery(t1), BooleanClause.Occur.MUST);
            builder.add(new TermQuery(t2), BooleanClause.Occur.MUST);
            BooleanQuery query = builder.build();

            TopDocs hits = searcher.search(query, 10);
            System.out.println("命中 " + hits.totalHits + " 筆:");
            for (ScoreDoc sd : hits.scoreDocs) {
                Document d = searcher.doc(sd.doc);
                System.out.println("  → " + d.get("bookname"));
            }
        }
    }
}

輸出結果

索引建立完成,共 8 文檔
命中 2 筆:
  → 浮生六記
  → 太平廣記

BooleanClause.Occur 三種邏輯關係

Occur邏輯說明
MUSTAND文檔必須匹配該子句
MUST_NOTNOT文檔必須不匹配該子句
SHOULDOR文檔可選匹配;若無 MUST 子句,至少需匹配一個 SHOULD

組合規則:

  • MUST + SHOULD → SHOULD 失效,結果以 MUST 為準
  • MUST_NOT + SHOULD → 相當於 MUST + MUST_NOT
  • 純 SHOULD 組合 → 並集(OR)

進階提示

  1. 中文分詞請改用 SmartChineseAnalyzer 或 IKAnalyzer;
  2. 生產環境索引目錄建議放在 SSD,並定期 forceMerge 優化段合併;
  3. 查詢前建立 QueryParser 解析用戶輸入字串,支援 + - * ? 等豐富語法。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved