Solr DisMax 分析

fieldOne^2.3 fieldTwo fieldThree^0.4,
最近有朋友用到solr dismax的功能,dismax 功能是solr提供在搜索时,可以对指定的field,query等设定权重,权重越大得分越高,说明越重要,结果拍在越前。

要用dismax,就必须启用,在solr1.3以后,solr的dismax功能通过 DisMaxQParserPlugin 来解析了。
我测试的版本是3.3,是通过在查询url里添加defType=dismax来启用dismax功能的。通过qt=dismax的话不会起作用的。
通过 defType=dismax 时,Solr 的QueryComponent组件的prepare的方法会取到defType参数的值,去创建对应的quey解析器。代码如下:

   //QueryParsing.DEFTYPE 的值为defType。
   String defType = params.get(QueryParsing.DEFTYPE,QParserPlugin.DEFAULT_QTYPE);
    if (rb.getQueryString() == null) {
      rb.setQueryString( params.get( CommonParams.Q ) );
    }
    try {
       //这里得到的是DisMaxQParserPlugin,对应的parse为DisMaxQParser
      QParser parser = QParser.getParser(rb.getQueryString(), defType, req);
      rb.setQuery( parser.getQuery() );
      rb.setSortSpec( parser.getSort(true) );
      rb.setQparser(parser);
所以从这可以看出dismax就是负责生成一个query。

下面讲下dismax的主要参数qf,因为其他的参数没有去分析。不能乱讲。

qf 

例如:qf=fieldOne^2.3 fieldTwo fieldThree^0.4,
qf 参数时指定solr从哪些field中搜索。像下面的话就只会在fieldOne,fieldTwo fieldThree这三个field中搜索。如果你还指定了q参数,比如q=“hadoop”,那么solr会认为是到 fieldOne,fieldTwo, fieldThree这三个field中搜索hadoop,这三个是并集的关系。生成的query为:fieldOne:hadoop^2.3 | fieldTwo:hadoop | fieldThree:hadoop^0.4 所以你定义了dismax的话,你的查询参数q就不要写成类似q=“title:hadoop”这样了。因为这样的话最终的查询 为:fieldOne:title:hadoop^2.3 | fieldTwo:title:hadoop | fieldThree:title:hadoop^0.4 除非你的这几个field里有“title:hadoop”这样的词存在,否则是查不到结果的。

你可能感兴趣的:(Solr)