Lucene 搜索方法(布尔搜索)

布尔搜索:
布尔查询的对象中,包含一个子句的集合。各种子句间都是“与”、“或”这样的布尔逻辑。

package com.querytype;

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;

public class BooleanQueryDemo {

/**
* @param args
*/
public static void main(String[] args) {
try {
IndexSearcher search = new IndexSearcher("d://demo");
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 = search.search(query);
for(int i=0;i>
2.MUST.MUST_NOT
MUST和MUST_NOT的组合表示查询的结果中不能包含MUST_NOT所对应的查询子句的检索结果。
程序:
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_NOT);


打印:
Document<stored/uncompressed,indexed,tokenized<bookname:英勇儿女>>
Document<stored/uncompressed,indexed,tokenized<bookname:白毛女>>
Document<stored/uncompressed,indexed,tokenized<bookname:女人是水做的>>
Document<stored/uncompressed,indexed,tokenized<bookname:我的兄弟和女儿>>

3.MUST_NOT与MUST_NOT没有含义

4.SHOULD与MUST和SHOULD与MUST_NOT

他和MUST联用,失去意义,检索结果为MUST的结果集,和MUST_NOT联用时候,SHOULD的功能和MUST功能一样。

5.SHOULD与SHOULD

表示一种或的关系。检索结果为两者的并集。

程序:

query.add(q1,BooleanClause.Occur.SHOULD);
query.add(q2,BooleanClause.Occur.SHOULD);

打印:

Document<stored/uncompressed,indexed,tokenized<bookname:篱笆女人和狗>>
Document<stored/uncompressed,indexed,tokenized<bookname:英勇儿女>>
Document<stored/uncompressed,indexed,tokenized<bookname:白毛女>>
Document<stored/uncompressed,indexed,tokenized<bookname:女人是水做的>>
Document<stored/uncompressed,indexed,tokenized<bookname:我的兄弟和女儿>>

 

布尔查询对其子句的数量是有限制的默认限制为1024条子查询,如果查过了,会抛出TooManyClauses异常,当然用户也可以通过BooleanQuery的方法setMaxClauseCount(int maxClauseCount).

布尔查询的子句并非只能对TermQuery的原子查询,也可以进行BooleanQuery的符合查询。

你可能感兴趣的:(apache,Lucene)