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