利用Lucene实现一个简单的布尔搜索

在布尔查询的对象中,包含一个子句的集合,各个子句间都是如“与”、“或”这样的布尔逻辑。Lucene中所遇到的各种复杂查询,最终都可以表示成布尔型的查询。下面代码就是实现了一个简单的布尔查询。

package LuceneSearch;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
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.TermQuery;

/**
 * 布尔搜索测试
 * @author sdu20
 *
 */
public class BooleanQueryTest {

	static final String INDEX_STORE_PATH = "E:\\编程局\\Java编程处\\Index\\";
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		try{
			
			IndexWriter writer = new IndexWriter(INDEX_STORE_PATH,new StandardAnalyzer(),true);
			writer.setUseCompoundFile(false);
			
			//创建8个文档
			Document doc1 = new Document();
			Document doc2 = new Document();
			Document doc3 = new Document();
			Document doc4 = new Document();
			Document doc5 = new Document();
			Document doc6 = new Document();
			Document doc7 = new Document();
			Document doc8 = new Document();
			
			Field f1 = new Field("bookname","钢铁是怎样炼成的",Field.Store.YES,Field.Index.TOKENIZED);
			Field f2 = new Field("bookname","英雄儿女",Field.Store.YES,Field.Index.TOKENIZED);
			Field f3 = new Field("bookname","浮生六记",Field.Store.YES,Field.Index.TOKENIZED);
			Field f4 = new Field("bookname","太平广记",Field.Store.YES,Field.Index.TOKENIZED);
			Field f5 = new Field("bookname","文化苦旅",Field.Store.YES,Field.Index.TOKENIZED);
			Field f6 = new Field("bookname","白夜行",Field.Store.YES,Field.Index.TOKENIZED);
			Field f7 = new Field("bookname","白毛女",Field.Store.YES,Field.Index.TOKENIZED);
			Field f8 = new Field("bookname","子不语",Field.Store.YES,Field.Index.TOKENIZED);
			
			doc1.add(f1);
			doc2.add(f2);
			doc3.add(f3);
			doc4.add(f4);
			doc5.add(f5);
			doc6.add(f6);
			doc7.add(f7);
			doc8.add(f8);
			
			writer.addDocument(doc1);
			writer.addDocument(doc2);
			writer.addDocument(doc3);
			writer.addDocument(doc4);
			writer.addDocument(doc5);
			writer.addDocument(doc6);
			writer.addDocument(doc7);
			writer.addDocument(doc8);
			writer.close();
			
			System.out.println("创建索引成功");
			
			IndexSearcher searcher = new IndexSearcher(INDEX_STORE_PATH);
			//创建两个词条对象
			Term t1 = new Term("bookname","生");
			Term t2 = new Term("bookname","记");
			
			TermQuery q1 = new TermQuery(t1);
			TermQuery q2 = new TermQuery(t2);
			
			BooleanQuery query = new BooleanQuery();
			query.add(q1,BooleanClause.Occur.MUST);
			query.add(q2,BooleanClause.Occur.MUST);
			
			Hits hits = searcher.search(query);
			
			for(int i = 0;i<hits.length();i++){
				System.out.println(hits.doc(i));
			}
			System.out.println("搜索成功");		
			
		}catch(Exception e){
			System.out.println(e.getStackTrace());
		}
	}

}

BooleanClause.Occur类主要有3种表示,即MUST、MUST_NOT和SHOULD。MUST与MUST_NOT不难理解,一看名字就知道是什么意思,而SHOULD是一个比较特殊的约束,当它与MUST联用时,它将失去意义。检索的结果为MUST子句的检索结果。当它与MUST_NOT联用时,SHOULD的功能就与MUST一样,就退变为MUST和MUST_NOT的查询结果。当SHOULD与SHOULD联用时,它们就表示一种“或”关系。最终检索结果为所有检索子句的检索结果的并集。

上面代码就是查询索引中有“生”字和“记”字的文档,程序运行结果截图如下

索引目录文件夹下截图如下


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值