import java.io.IOException; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.CorruptIndexException; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.Term; import org.apache.lucene.queryParser.MultiFieldQueryParser; import org.apache.lucene.search.BooleanClause; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.Hits; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.TermQuery; /** * 与或非布尔查询——Lucene中的BooleanQuery * @author USER * */ public class TestBooleanQuery { /** * 主函数,运行测试程序 * @param args * @throws Exception */ public static void main(String[] args) throws Exception { //建索引 createIndex(); //多个TermQuery构建BooleanQuery检索 searchIndex4TermQuery(); //一个MultiFieldQueryParser构建BooleanQuery多个域的检索 searchIndex4MultiFieldQueryParser(); } /** * 建索引 * @throws Exception */ public static void createIndex() throws Exception { Document doc1 = new Document(); Field field = null; field = new Field("name", "word1 word2 word3", Field.Store.YES, Field.Index.TOKENIZED); doc1.add(field); field = new Field("title", "doc1", Field.Store.YES, Field.Index.TOKENIZED); doc1.add(field); Document doc2 = new Document(); field = new Field("name", "word4 word5", Field.Store.YES, Field.Index.TOKENIZED); doc2.add(field); field = new Field("title", "doc2", Field.Store.YES, Field.Index.TOKENIZED); doc2.add(field); Document doc3 = new Document(); field = new Field("name", "word1 word2 word6", Field.Store.YES, Field.Index.TOKENIZED); doc3.add(field); field = new Field("title", "doc3", Field.Store.YES, Field.Index.TOKENIZED); doc3.add(field); /** * 为测试MultiFieldQueryParser而添加的文档 */ Document doc4 = new Document(); field = new Field("name", "word1 word2 word3", Field.Store.YES, Field.Index.TOKENIZED); doc4.add(field); field = new Field("title", "doc1 word1", Field.Store.YES, Field.Index.TOKENIZED); doc4.add(field); /** * 对MultiFieldQueryParser更深理解 */ Document doc5 = new Document(); field = new Field("title", "北京2008年奥运会", Field.Store.YES, Field.Index.TOKENIZED); doc5.add(field); field = new Field("name", "这是一届创造奇迹、超越梦想的.......", Field.Store.YES, Field.Index.TOKENIZED); doc5.add(field); Document doc6 = new Document(); field = new Field("title", "北京2008年奥运会", Field.Store.YES, Field.Index.TOKENIZED); doc6.add(field); field = new Field("name", "这是一届创造奇迹、超越梦想的奥运会.......", Field.Store.YES, Field.Index.TOKENIZED); doc6.add(field); IndexWriter writer = new IndexWriter("e:\\java\\index", new StandardAnalyzer(), true); writer.addDocument(doc1); writer.addDocument(doc2); writer.addDocument(doc3); writer.addDocument(doc4); writer.addDocument(doc5); writer.addDocument(doc6); writer.close(); } /** * 由TermQuery和BooleanQuery构建的多个域检索 * @throws Exception */ public static void searchIndex4TermQuery() throws Exception{ TermQuery query1 = null; TermQuery query2 = null; TermQuery query3 = null; TermQuery query4 = null; TermQuery query5 = null; TermQuery query6 = null; BooleanQuery bquerymain = null; BooleanQuery bquery1 = null; BooleanQuery bquery2 = null; BooleanQuery bquery3 = null; Hits hits = null; IndexSearcher searcher = new IndexSearcher("e:\\java\\index"); query1 = new TermQuery(new Term("name", "word1")); query2 = new TermQuery(new Term("name", "word2")); query3 = new TermQuery(new Term("name", "word3")); query4 = new TermQuery(new Term("name", "word4")); query5 = new TermQuery(new Term("name", "word5")); query6 = new TermQuery(new Term("name", "word6")); // 构造布尔查询(可根据你的要求随意组合) bquerymain = new BooleanQuery(); bquery1 = new BooleanQuery(); bquery2 = new BooleanQuery(); bquery3 = new BooleanQuery(); bquery1.add(query1, BooleanClause.Occur.MUST); bquery1.add(query3, BooleanClause.Occur.MUST); bquery2.add(query3, BooleanClause.Occur.MUST); bquery2.add(query4, BooleanClause.Occur.MUST); bquery3.add(query5, BooleanClause.Occur.MUST); bquery3.add(query6, BooleanClause.Occur.MUST_NOT); bquerymain.add(bquery1, BooleanClause.Occur.SHOULD); bquerymain.add(bquery2, BooleanClause.Occur.SHOULD); bquerymain.add(bquery3, BooleanClause.Occur.MUST); /** * 根据你的要求建一个BooleanQuery对象,然后来查询 */ hits = searcher.search(bquery3); printResult(hits, bquery1.toString()); } /** * 由MultiFieldQueryParser和BooleanQuery构建的多个域检索 * @throws Exception */ public static void searchIndex4MultiFieldQueryParser() throws Exception{ Hits hits = null; IndexSearcher searcher = new IndexSearcher("e:\\java\\index"); // 构造布尔查询(可根据你的要求随意组合) BooleanClause.Occur[] flags = new BooleanClause.Occur[] { BooleanClause.Occur.MUST, BooleanClause.Occur.MUST}; Query query = MultiFieldQueryParser.parse("word1", new String[] { "name", "title"}, flags, new StandardAnalyzer()); /* //加深对MultiFieldQueryParser的理解(注意看建索引的文档doc5,doc6与检索后的结果) Query query = MultiFieldQueryParser.parse("北京 奥运会", new String[] { "name", "title"}, flags, new StandardAnalyzer()); */ hits = searcher.search(query); printResult(hits, query.toString()); } /** * 打印输出检索出的文档,并输出检索的布尔语句 * @param hits * @param key * @throws Exception */ public static void printResult(Hits hits, String key) throws Exception { System.out.println("查询 " + key); if (hits != null) { if (hits.length() == 0) { System.out.println("没有找到任何结果"); } else { System.out.println("找到" + hits.length() + "个结果"); for (int i = 0; i < hits.length(); i++) { Document d = hits.doc(i); String dname = d.get("title"); System.out.print(dname + " "); } System.out.println(); System.out.println(); } } } }