lucene7.3.1 多個field時,用MultiFieldQueryParser實現篩選式搜尋
阿新 • • 發佈:2018-11-29
package com.rokid.server.framework.test; import java.io.IOException; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import org.apache.lucene.index.IndexReader; import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.document.TextField; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.index.IndexWriterConfig.OpenMode; import org.apache.lucene.queryparser.classic.MultiFieldQueryParser; import org.apache.lucene.queryparser.classic.ParseException; import org.apache.lucene.search.BooleanClause.Occur; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TopDocs; import org.apache.lucene.search.similarities.BM25Similarity; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.store.IOContext; import org.apache.lucene.store.RAMDirectory; public class Example { public static IndexWriter writer; public static RAMDirectory idxDir; public static SmartChineseAnalyzer analyzer; public static void makeIndex() throws IOException { FSDirectory fsDir = FSDirectory.open(Paths.get("C:\\Users\\gt\\Desktop\\_ROKID_\\fast-sent-match\\example")); idxDir = new RAMDirectory(fsDir, IOContext.DEFAULT); analyzer = new SmartChineseAnalyzer(); IndexWriterConfig iwc = new IndexWriterConfig(analyzer); iwc.setSimilarity(new BM25Similarity()); iwc.setOpenMode(OpenMode.CREATE); writer = new IndexWriter(idxDir, iwc); List<String> listSent = new ArrayList<String>(); listSent.add("戰旗春秋是最好玩的戰棋遊戲"); listSent.add("金古江湖是最好玩的金庸遊戲"); for (String sent : listSent) { Document doc = new Document(); doc.add(new TextField("questionID", String.valueOf(1), Field.Store.YES)); doc.add(new TextField("question", sent.trim(), Field.Store.YES)); writer.addDocument(doc); } List<String> listSent2 = new ArrayList<String>(); listSent2.add("戰旗春秋是最好玩的手機遊戲"); listSent2.add("金古江湖是最好玩的角色扮演遊戲"); for (String sent : listSent2) { Document doc = new Document(); doc.add(new TextField("questionID", String.valueOf(2), Field.Store.YES)); doc.add(new TextField("question", sent.trim(), Field.Store.YES)); writer.addDocument(doc); } writer.commit(); int nMaxDoc = writer.maxDoc(); System.out.println("nMaxDoc = " + nMaxDoc); writer.close(); } public static void main(String[] args) throws IOException, ParseException { makeIndex(); // String[] stringQuery={"2","金古江湖"}; //通過1,2來篩選 String[] stringQuery = { "1", "金古江湖" }; String[] fields = { "questionID", "question" }; Occur[] occ = { Occur.MUST, Occur.MUST }; Query query = MultiFieldQueryParser.parse(stringQuery, fields, occ, analyzer); TopDocs results = null; IndexReader reader = DirectoryReader.open(idxDir); IndexSearcher searcher = new IndexSearcher(reader); results = searcher.search(query, 3); ScoreDoc[] hits = results.scoreDocs; for (int i = 0; i < hits.length; ++i) { Document doc = searcher.doc(hits[i].doc); String strDocSent = doc.get("question"); System.out.println(strDocSent); } } }