背景回归:
在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以及NOT;phrasequery,顾明司仪是短语查询,也就一定是“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查看。查看同时,需要联合schema、solrconfig、query一起。
精度:短语查询 > 布尔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