工作小总结

Lucene BooleanQuery中的Occur.MUST与Occur.Should【Lucene实现类似sql中的OR AND】

在使用lucene查询的时候,有时候我们需要使用到类似sql语句的or and这一类的。那么在Lucene中怎么实现呢?

lucene中BooleanQuery 实现与或的复合搜索 .

BooleanClause用于表示布尔查询子句关系的类,包 括:BooleanClause.Occur.MUST,BooleanClause.Occur.MUST_NOT,BooleanClause.Occur.SHOULD。 必须包含,不能包含,可以包含三种.有以下6种组合: 

 

1.MUST和MUST:取得连个查询子句的交集。 

2.MUST和MUST_NOT:表示查询结果中不能包含MUST_NOT所对应得查询子句的检索结果。 

3.SHOULD与MUST_NOT:连用时,功能同MUST和MUST_NOT。

4.SHOULD与MUST连用时,结果为MUST子句的检索结果,但是SHOULD可影响排序。

5.SHOULD与SHOULD:表示“或”关系,最终检索结果为所有检索子句的并集。

6.MUST_NOT和MUST_NOT:无意义,检索无结果。


1.  多个MUST的组合不必多说,就是交集

2.  MUST和SHOULD的组合。是在MUST搜出来的doc里面,根据SHOULD的query进行打分。也就是说,SHOULD的query不会影响最终的HITS,只会提供打分依据。

3.  SHOULD的组合。如果最终的BooleanQuery只有SHOULD,那么搜出来的doc至少要满足一个SHOULD的query,也就是说是逻辑OR。

那么在下面这段代码中,问题就出现了:

代码的本意是在baseQuery的基础上和geoQuery做一个交集

public Map<String, Query> buildGeoQuery(Query baseQuery) {
    Map<String, Query> queryMap = new HashMap<String, Query>();
    for(String key : localHashMap.keySet()) {
        List<String> hashValues = localHashMap.get(key);
        BooleanQuery bq = new BooleanQuery();
        bq.add(baseQuery, Occur.MUST);
        if(hashValues.size() == 1) {
            TermQuery hashQuery =  
new TermQuery(new Term(Constants.FIELD_SEARC

原创不易,完成人机校验,阅读全文

相关推荐