solr 自定义 dismax查询方式

1、在solrconfig.xml中增加

<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&lt;-1 5&lt;-2 6&lt;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

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 可以在里面增加中文分词

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)
        {
            return;
        }

        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();
    }
}

 

你可能感兴趣的:(算法,xml,正则表达式,F#,Solr)