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);&