lucene精解-BooleanQuery、RangeQuery及rewrite

本文介绍了Lucene中的布尔查询和范围查询的实现方法。布尔查询可通过MUST、MUST_NOT及SHOULD来指定查询条件的包含或排除,而范围查询则通过定义起始和结束词条来检索符合条件的文档。此外还探讨了查询重写和范围查询的效率问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、BooleanQuery

1)

Term t1=new Term("bookname","女");

Term t2=new Term("bookname","的");

Term t3=new Term("bookname","我");

 

TermQuery q1=new TermQuery(t1);

TermQuery q2=new TermQuery(t2);

TermQuery q3=new TeramQuery(t3);

 

BooleanQuery query=new BooleanQuery();

query.add(q1,BooleanClause.Occur.MUST);

query.add(q2,BooleanClause.Occur.MUST);

query.add(q3,BooleanClause.Occur.MUST_NOT);

 

Hits hits=searcher.search(query);

2)

BooleanClause.Occur.MUST_NOT:不能包括

BooleanClause.Occur.MUST:必须包括

SHOULD:或

2、rewrite方法

查询重写,让所有的非原子查询将其进行查询重写,并存储实际的数据,而不是需要再从索引中读取。

3、RangeQuery

1)

Term begin=new Term("booknumber","000001");

Term end=new Term("booknumber","000006");

RangeQuery query=new RangeQuery(begin,end,false);

Hits hits=searcher.search(query);

2)使用RangeQuery会对每个项生成BooleanQuery的SHOULD查询子句,所以范围太大效率低下

3)IndexReader的terms方法取出所有排在某个词条之后的所有词条。当某一个词条与RangeQuery的上界进行比较后,发现取到了正整数,则中止循环,并把之前所有循环过的词条所在的Document取出,从而形成了检索结果集合.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值