Solr BooleanQuery AND phraseQuery用法比较

简介: 假期重新把之前在新浪博客里面的文字梳理了下,搬到这里。 本文Solr BooleanQuery 与PhraseQuery 用法比较。主要内容理解布尔查询、短语查询在分词后,AND OR 关系,帮助理解查询语义,和对结果的影响。顺便温习3种实现形式。

背景回归:      

solr中,定义schem.xml 中域的类型的时候,1.4版本是默认布尔查询,3.4之后,默认是短语查询。其他相关背景 Function Query, Local Params, Nested Queries, Query Parser, Query Parser Plugin, Query Syntax
明白:1)存在布尔或者短语查询,一定是针对分词的域,也就是text类型的字段,进一步也就是说对于数值域,没有这个说法。即使定义了也没有意义。booleanQuery 这里是指,经过queryparser解析之后,termquery之间的关系,是布尔关系,也就是 AND OR以及NOTphrasequery,顾明司仪是短语查询,也就一定是“AND”关系了。

使用技巧1)部分指定  

solr3.4 包括更高版本。如果没有指定是否自动生成短语查询,默认是短语查询。  

启动短语查询配置,需要显示指定、同时solrconfig.xml指定lucene版本。schema.xml指定:  

    <fieldType name="string"     class="solr.TextField"      omitNorms="true" />


solrconfig.xml指定:

<luceneMatchVersion>3.4  3.4 //具体版本具体值啊

表明采取布尔查询,eg 阿里巴巴上市, 将会分解为  “阿里|阿里巴巴|上市”(假定是这种分解,不一定是你的分词器分词的结果)、那么,查询语义是“  阿里 AND 阿里巴巴 AND 上市”,此时,schema.xml中指定的defautlOperator没有影响。直观结果 查询结果比较少。eg 命中的doc  阿里巴巴上市时间正在公布中。

表明采取短语查询,eg 阿里巴巴上市, 将会分解为  “阿里|阿里巴巴|上市”(假定是这种分解,不一定是你的分词器分词的结果)、那么,查询语义是“  阿里 AND 阿里巴巴 AND 上市”,此时,schema.xml中指定的defautlOperator没有影响,并且,严格要求 命中的文档是: 阿里阿里巴巴上市或者 阿里  阿里巴巴 上市 或者 阿里,阿里巴巴,上市 这种格式。与上面的微妙差异就在于:要求是短语!实际用户输入,一般2.7个词的话,往往很少有交叉出现,从而这种分词之后的命中结果的“差异”被隐藏起来了。

2)静态指定默认配置+指定schema+指定luceneMatchVersion选择哪种解析之外,另外一种是 直接在handler里面指定解析类型。默认是 lucene,也可以指定自己定制的 排版问题 把< > 省了

<requestHandler name="standard" class="solr.SearchHandler"  
   default="true" >
   !-- default values for query parameters --  
   <lst name="defaults"
       str name="echoParams"explicit/str
       !--   10   *  2.1  
       --  
   </lst>
</requestHandler>

下面是可供选择的类型,并且都是可以在查询中通过本地参数动态调用的。其中地理相关的两个非常有用。

publicabstractclassQParserPluginimplementsNamedListInitializedPlugin{LuceneQParserPlugin.NAME, 
LuceneQParserPlugin.class, //luceneOldLuceneQParserPlugin.NAME,
OldLuceneQParserPlugin.class,//lucenePlusSortFunctionQParserPlugin.NAME, 
FunctionQParserPlugin.class,//funcPrefixQParserPlugin.NAME, 
PrefixQParserPlugin.class,//prefixBoostQParserPlugin.NAME, 
BoostQParserPlugin.class,//boostDisMaxQParserPlugin.NAME, 
DisMaxQParserPlugin.class,//dismaxExtendedDismaxQParserPlugin.NAME, 
ExtendedDismaxQParserPlugin.class,//edismaxFieldQParserPlugin.NAME, 
FieldQParserPlugin.class,//fieldRawQParserPlugin.NAME, 
RawQParserPlugin.class,//rawTermQParserPlugin.NAME, 
TermQParserPlugin.class,//termNestedQParserPlugin.NAME, 
NestedQParserPlugin.class,//queryFunctionRangeQParserPlugin.NAME, 
FunctionRangeQParserPlugin.class,//frangeSpatialFilterQParserPlugin.NAME, 
SpatialFilterQParserPlugin.class,//geofiltSpatialBoxQParserPlugin.NAME,
SpatialBoxQParserPlugin.class,//bbox


3)动态指定最后,在query参数中动态指定,也就是说上面的都是静态指定。或者说默认没有指定的时候的选择。动态指定都是在query中传入的。并且传入形式本地参数 {!lucene q.op=AND} 或者 {!lucene q.op=OR}
针对paoding分词,并且是布尔查询,此时,如果查询中无动态指定,那么分词是按照AND 结果出来。如果查询中动态指定 是OR关系,那么 eg 阿里巴巴上市,分解阿里OR 阿里巴巴OR 上市,意味着会有更多结果。

总结    

lucenequeryparser中,query中的q.op优先级比schema中要高。    defaultOperator的用法是没有显示指定或者无法明确判断ANd OR的时候,就按defaultOperator组装    

最终解释形式,请以具体版本+debug查看。查看同时,需要联合schemasolrconfigquery一起。  

 精度:短语查询 > 布尔AND查询 > 布尔OR查询,具体场景具体分析使用。

String opParam = getParam(QueryParsing.OP);
   if (opParam != null) {
     lparser.setDefaultOperator("AND".equals(opParam) ? QueryParser.Operator.AND : QueryParser.Operator.OR);
   } else {
     // try to get default operator from schema
     QueryParser.Operator operator = getReq().getSchema().getSolrQueryParser(null).getDefaultOperator();
     lparser.setDefaultOperator(null == operator ? QueryParser.Operator.OR : operator);
   }

另外参考 and or陷阱
http://blog.sina.com.cn/s/blog_4d58e3c00102uw1u.html

目录
相关文章
|
XML JSON 搜索推荐
12Solr简介
12Solr简介
49 0
|
Java API Maven
使用solrJ操作solr常用方法
使用solrJ操作solr常用方法
112 0
|
XML 存储 JSON
Solr学习总结
Solr学习总结
156 0
Solr学习总结
|
Apache 数据格式 算法
|
存储 SQL 编解码
Solr-lucene 使用案例大全
假期重新把之前在新浪博客里面的文字梳理了下,搬到这里。 本文sole lucene的使用案例汇总。
233 0
|
存储 自然语言处理 Java
Luke:用于Lucene / Solr / Elasticsearch索引的GUI工具
Luke:用于Lucene / Solr / Elasticsearch索引的GUI工具
631 0
Luke:用于Lucene / Solr / Elasticsearch索引的GUI工具
|
XML 缓存 自然语言处理
Solr 的作用,为什么要用solr服务,
Solr 的作用,为什么要用solr服务,
293 0
|
Apache 数据格式 XML