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取出,从而形成了检索结果集合.