天天看点

solr 自定义 dismax查询方式

1、在solrconfig.xml中增加

solr 自定义 dismax查询方式

<queryparser name="imdismax"  

        class="com.szhtp.search.parse.imdismaxqparserplugin" />  

<requesthandler name="imdismax" class="solr.searchhandler">  

        <lst name="defaults">  

            <str name="deftype">imdismax</str>  

            <!-- 查询关键字和设置权重 -->  

            <str name="qf">keywords^3 question^2 answer^0.4</str>  

            <str name="pf">keywords^3 question^2 answer^0.4</str>  

            <str name="mm">2<-1 5<-2 6<90%</str>  

            <!-- 输出时显示那些字段 -->  

            <str name="fl">id,answer,score</str>  

            <!-- 设置phraseslop的坡度 -->  

            <int name="ps">100</int>  

            <str name="hl.fl">answer</str>  

            <!-- 默认查询语句用于容错处理 -->  

            <str name="q.alt">*:*</str>  

            <!-- 每个snippet返回的最大字符数。默认是100.如果为0,那么该字段不会被fragmented且整个字段的值会被返回。大字段时不会这么做。  

            这里的answer=<str name="hl.fl">answer</str>  

              -->  

            <str name="f.answer.hl.fragsize">50</str>  

            <!-- instructs solr to return the field itself if no query terms are  

                found -->  

            <!-- 如果没有生成snippet(没有terms 匹配),那么使用另一个字段值作为返回 -->  

            <str name="f.answer.hl.alternatefield">answer</str>  

            <!-- 这个是solr制定fragment算法的扩展点。gap是默认值。  

                regex是另一种选项,这种选项指明highlight的边界由一个正则表达式确定。  

                这是一种非典型的高级选项。为了知道默认设置和fragmenters (and formatters)是如何配置的,  

                可以看看solrconfig.xml中的highlight段 -->  

            <str name="f.answer.hl.fragmenter">regex</str>  

            <str name="tie">0.1</str>  

        </lst>  

    </requesthandler>  

2、创建类imdismaxqparserplugin.java

solr 自定义 dismax查询方式

public class imdismaxqparserplugin extends qparserplugin  

{  

    public static string name = "imdismax";  

    public void init(namedlist args) {  

    }  

    public qparser createparser(string qstr, solrparams localparams, solrparams params, solrqueryrequest req) {  

      return new imdismaxqparser(qstr, localparams, params, req);  

}  

3、创建类imdismaxqparser.java 可以在里面增加中文分词

solr 自定义 dismax查询方式

public class imdismaxqparser extends dismaxqparser  

    public imdismaxqparser(string qstr, solrparams localparams,  

            solrparams params, solrqueryrequest req)  

    {  

        super(qstr, localparams, params, req);  

        if (null == this.qstr)  

        {  

            return;  

        }  

        analyzer analyzer = req.getschema().getqueryanalyzer();  

        if (null == analyzer)  

        stringbuilder norm = new stringbuilder();  

        try  

//对question分词  

            tokenstream tokens = analyzer.reusabletokenstream("question",  

                    new stringreader(this.qstr));  

            tokens.reset();  

            token token = tokens.next();  

            while (token != null)  

            {  

                norm.append(  

                        new string(token.termbuffer(), 0, token.termlength()))  

                        .append(" ");  

                token = tokens.next();  

            }  

        catch (exception ex)  

                    }  

        if (norm.length() > 0)  

            this.qstr = norm.tostring();  

}