词条搜索
TermQuery
Term t=new Term( 被搜索的 Field, 搜索关键词 );
TermQuery q=new TermQuery(t);
组合搜索
组合搜索可以满足搜索词之间一些逻辑关系。
BooleanQuery.
BooleanQuery 的构建方法是,首先常见多个 TermQuery, 然后以多个 TermQuery 为参数构建 BooleanQuery, 在多个 Term 之间要进行逻辑运算。
例如:
Term t1=new Term(“text”,”love”);
TermQuery query1=new TermQuery(t1);
Term t1=new Term(“text”,”you”);
TermQuery query2=new TermQuery(t1);
BooleanQuery q=new BooleanQuery();
q.add(query1, BooleanClause.Occur.MUST );
q.add(query2,BooleanClause.Occur.MUST);
这个请求可以要求结果种出现 love you.
BooleanClause.Occur.MUST: 必须满足
BooleanClause.Occur.MUST_NOT: 必须不满足
BooleanClause.Occur.SHOULD: 搜索结果可以满足。
利用这三种逻辑可以构造出一些组合逻辑。
例如:让搜索结果同时满足多个条件,全 MUST 。
让搜索结果满足一些条件,同时不满足另外一些条件,可以用 MUST 和 MUST_NOT 的组合。
只包含排斥的条件,全用 MUST_NOT 。
含有某个关键字后者其他的关键字。可以用 SHOULD 。
BooleanQuery 对象所支持的子查询数量默认的情况下最多是 1024 个。可以通过 setMaxClauseCount(int num) 方法修改这个值。当然,子查询数量越少,查询的速度会越快。
范围搜索
让搜索的结果处于某个搜索的范围内。
RangeQuery 。
RangeQuery(Term lowerTerm,Term upperTerm,Boolean inclusive);
第一个参数是起始的 Term, 第二个参数是终止的 Term, 第三个参数表示是否包含边界。
包含边界值得搜索:
Term tb=new Term(“id”,”0”);
Term te=new Term(“id”,”2”);
RangeQuery q=new RangeQuery(tb,te,true);
不包含边界的搜索:
RangeQuery q=new RangeQuery(tb,te,false);
前缀搜索
只要求某一些搜索要求,满足某些前缀。这种情况,就要用前缀搜索来处理。
PrefixQuery(Term prefix)
要建立 PrefixQuery 对象,只需指定一个 Term 为其前缀即可以。
短语搜索
将短语组合起来,形成新的短语。例如将 ” 软 ” ,“件 ”, 组合起来,可以形成“软件”。并且可以设置匹配度。
设置不同的间隔量,可以得到不同的短语,如 ” 软 * 件 ”
构建短语搜索的方法,就是先建立几个 Term, 然后按顺添加到 PharseQuery 对象中,如下所示:
Term t1=new Term(“text”,” 软 ”);
Term t2=new Term(“text”,” 件 ”);
PhraseQuery q=new PharseQuery();
q.add(t1);
q.add(t2);
使用 setSlop(int s) 可以设定短语允许的间隔字符数量。
设置为 1, 那么 ” 软硬件 ” 也符合要求。
多短语搜索
MultiPharseQuery 类,可以先指定一个前缀,然后把其他词语加在它的后面,从而组成词语。
例如指定“飞“作为统一前缀,然后指定“机”,“鸟”作为后缀, Lucene 会组成 ” 飞鸟 ” 和 ” 飞机 ” 两个词进行搜索。
Term t1=new Term(“text”,” 飞 ”);
Term t2=new Term(“text”,” 机 ”);
Term t3=new Term(“text”,” 鸟 ”);
MultiPhraseQuery q=new MultiPhraseQuery();
添加统一前缀
q.add(t1);
添加后缀
q.add(new Term[]{t2,t3});
模糊搜索
FuzzyQuery 类,用于英文搜索。根据设定的匹配度,判断词形的相似度,从而得出相应的结果。
“good” 和 ”god” 在某种情况下,看作模糊匹配。
Term t=new Term(“text”,”god”);
FuzzyQuery q=new FuzzyQuery(t,0.6f);
第二个参数指定模糊度,是一个 float 值,默认是 0.5, 这个值越小,搜索的模糊性就越强。搜索的模糊性越强,结果就越多,越不精确。
通配符搜索
可以用 ”*” 表示任意多个字符,用 ”?” 表示任意一个字符。
WildcardQuery 来实现通配符搜索。
Term t=new Term(“text”,” 飞 *”);
WildcardQuery q=new WildcardQuery(t);
可以匹配以 ” 飞 ” 开始的词语。
正则表达式匹配搜索
支持正则表达式的搜索。是最有用的模糊搜索之一。
Term t=new Term(“text”,” 正则表达式 ”);
RegexQuery q=new RegexQuery(t);