`

Lucene BooleanQuery中的Occur.MUST与Occur.Should

 
阅读更多

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_SEARCH_HASH, hashValues.get(0)));
            bq.add(hashQuery, Occur.MUST);
        }
        else if(hashValues.size() > 1) {
            for(String value : hashValues) {
                TermQuery hashQuery = new TermQuery(new Term(Constants.FIELD_SEARCH_HASH, value));
                bq.add(hashQuery, Occur.SHOULD);
            }
        }
        queryMap.put(key, bq);
    }
    return queryMap;
}

在第三个用红色标注的语句中,本意是对多个geohash query做逻辑OR的操作(使用了should),但是由于最开始的basequery是以MUST关键字加入的,那么这些个geohash query只做为打分依据,而不是必须出现的,这样就会导致有一些额外的doc被搜出来。

正确的做法应该是用一个独立的GeoQuery来把geohash termquery组合起来,最后将geoQuery和baseQuery用Occur.MUST组合

 

 

 

===============================================================================

 

lucene3.0中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:无意义,检索无结果。

 

 

====================================================================================

 

在输入要搜索的关键字时,Lucene是这样处理的:

+a +b:搜索同时包含a又包含b的结果集

a  b:搜索包含a或包含b的结果集

+a -b:搜索包含a不包含b的结果集

也就是如下结论:

  a & b =>  +a +b

  a || b =>  a  b

  a !b  =>  +a -b

 

那在代码中该如何来构造这种与或非的关系呢?

一般用BooleanQuery来构造。

//构造BooleanQuery
      QueryParser parser = new QueryParser("content", analyzer);
      BooleanQuery bquery = new BooleanQuery();
      TokenStream ts = analyzer.TokenStream(null, new StringReader(querystring));
      Lucene.Net.Analysis.Token token;
      while ((token = ts.Next()) != null)
      {
        Query query = parser.Parse(token.TermText());
        bquery.Add(query, BooleanClause.Occur.MUST);
      }
      //构造完成

            IndexSearcher searcher = new IndexSearcher("IndexDirectory");
      
      //Query query = parser.Parse(querystring);
      //输出我们要查看的表达式
      Console.WriteLine(bquery.ToString());
      Hits hits = searcher.Search(bquery);
      for (int i = 0; i < hits.Length(); i++)
      {
        Document doc = hits.Doc(i);
        Console.WriteLine(doc.Get("title"));
      }
    }

其中,bquery.Add(query, BooleanClause.Occur.MUST);MUST构造出“与”的关系

构造“或”关系:bquery.Add(query, BooleanClause.Occur.SHOULD);

构造“非”关系:bquery.Add(query, BooleanClause.Occur.MUST_NOT);

 

原文链接:http://www.cnblogs.com/weipeng/archive/2012/04/18/2455079.html

分享到:
评论

相关推荐

    Lucene.Net.Analysis.Cn.dll

    《深入理解Lucene.Net.Analysis.Cn.dll与Lucene.Net.dll在C#中的应用》 在C#开发中,搜索引擎的构建是不可或缺的一部分,而Lucene.Net作为一个强大的全文搜索引擎库,为开发者提供了丰富的功能。本文将重点探讨...

    lucene,lucene教程,lucene讲解

    lucene,lucene教程,lucene讲解。...SHOULD与MUST_NOT连用时, SHOULD功能同MUST,相当于MUST和MUST NOT的检索结果。 5.SHOULD与SHOULD:表示“或”关系,最终检索结果为所有检索子句的并集。 。。。

    Lucene.Net中文分词组件 Lucene.Net.Analysis.Cn

    Lucene.Net中文分词组件 Lucene.Net.Analysis.Cn

    lucene.net.analysis.cn

    Lucene.Net完全用C#重写了Java版Lucene的核心算法,保持了与原版的高度兼容性,同时充分利用了.NET Framework的特性,使得开发者在.NET平台上也能享受到Lucene的强大功能。 二、中文分词的重要性 中文分词是中文...

    lucene3.0-highlighter.jar

    lucene3.0-highlighter.jar lucene3.0的高亮jar包,从lucene3.0源码中导出来的

    lucene2.9.1-src.tar.gz源码及完整Demo

    lucene2.9.1-src.tar.gz源码及完整Demo Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供。Lucene提供了一个简单确强大的应用程式接口,能够做全文索引和搜寻,在Java开发环境里Lucene...

    vb.net2.0_Lucene_test.rar_lucene_lucene vb.n_lucene.net vb

    标题中的“vb.net2.0_Lucene_test.rar_lucene_lucene vb.n_lucene.net vb”表明这是一个关于使用VB.NET 2.0版本实现Lucene搜索引擎的测试项目。Lucene是一个高性能、全文本搜索库,广泛应用于Java开发,而这里则是将...

    Lucene3.4开发入门.pdf

    Lucene3.4开发入门.pdf

    第一个lucene的简单实例....

    luceneTest 博文链接:https://wolftou.iteye.com/blog/148701

    Lucene.Net.NLS.rar

    7. **接口与API设计**:作为库的一部分,源码会展示如何设计友好的API,使得开发者可以方便地在自己的应用程序中集成Lucene.NET的中文分词功能。 8. **测试与调试**:完整的源码可能包括了大量的单元测试和示例,...

    lucene-analysis.jar

    其中,"lucene-analysis.jar"是Lucene项目中的一个重要组件,主要负责文本的预处理工作,即文本分析。本文将深入探讨这个jar包及其包含的文件,以揭示其在Lucene中的关键作用。 首先,"lucene-analysis.jar"是...

    Lucene.Net-2.0.doc

    Lucene.Net-2.0.doc 更多信息请查看 www.iubang.com

    lucene 3.0.3.core.jar

    lucene3.0.3.core.jar文件,不用到apache官方网站下载17M的包,直接下载这个core就可以了。

    Lucene学习工具包.zip

    Lucene支持多种语言,但其核心实现是用Java编写的,因此与"java lucene"标签相吻合。 ### Lucene核心组件 1. **Analyzer**: 分析器是处理原始文本的入口,它将文本分解为可搜索的词元(tokens)。分析器的选择会...

    lucene org.apache

    org.apache.lucene.analysis.cjk.CJKAnalyzer .......

    lucene-2.9.4Doc.chm

    lucene-2.9.4doc .chm lucene-2.9.4手册

Global site tag (gtag.js) - Google Analytics