使用 MultiFieldQueryParser 組合兩個欄位 code 與 name,設定 Occur.MUST(AND)查無結果;改為 Occur.SHOULD(OR)卻能查到。
AnsjAnalysis 可能將 "特惠" 切分為 "特"、"惠",查詢字串 "特惠" 未經相同分詞處理。"CA0000001")。code 欄位若為 KeywordAnalyzer 不分詞,查詢需完全匹配。Analyzer analyzer = new AnsjAnalysis(); // 索引與查詢使用相同分詞器
QueryParser parser = new MultiFieldQueryParser(Version.LUCENE_36, new String[]{"code", "name"}, analyzer);
parser.setDefaultOperator(QueryParser.Operator.AND); // 預設 AND
Query query = parser.parse("CA0000001 特惠"); // 讓解析器自行處理多欄位
// 使用 Luke 工具或程式碼列出索引詞項
IndexReader reader = DirectoryReader.open(directory);
Terms terms = MultiFields.getTerms(reader, "name");
TermsEnum te = terms.iterator();
BytesRef term;
while ((term = te.next()) != null) {
System.out.println(term.utf8ToString());
}
BooleanQuery.Builder builder = new BooleanQuery.Builder();
builder.add(new TermQuery(new Term("code", "CA0000001")), Occur.MUST);
builder.add(new TermQuery(new Term("name", "特惠")), Occur.MUST);
Query query = builder.build();
MultiFieldQueryParser.parse 陣列版,改用 BooleanQuery 組合更清晰。KeywordAnalyzer 或 StringField。