在Solr中,RequestHandler本质上是以特定方式处理传入请求的插件(逻辑模块).
请求处理程序可以提供查询之外的功能,例如数据导入,而不是对实际的搜索查询"执行"某些操作.
通常,Solr中的请求处理程序被配置为特定的端点(即URL),并且不是通过qt参数 Select 的.然而,搜索特定处理程序可以使用查询类型参数以特定方式处理查询(即,一个处理程序可能能够处理各种查询类型).
使用什么处理程序,通常取决于您想要实现什么.我建议您查看提供的处理程序列表,并将它们的描述(许多都有Wiki页面)与您想要做的事情进行匹配.
对于查询,除了默认的SearchHandler之外,最常用的请求处理程序是DisMaxRequestHandler(qt=dismax),它将根据字段重要性使用不同的权重提供跨多个字段的搜索.这通常被人们称为"类似谷歌"的搜索.
此外,您可能会对MoreLikeThisHandler感兴趣,它旨在提供与特定文档相似的命中结果(例如,来自以前的搜索结果).
请注意,作为念力的源代码,较新版本的Solr中的DisMaxRequestHandler实际上是由默认的SearchHandler提供的,查询类型为dismax.
处理程序配置为solrconfig.xml:
<requestHandler name="dismax" class="solr.SearchHandler" >
<lst name="defaults">
<str name="defType">dismax</str>
<str name="echoParams">explicit</str>
<float name="tie">0.01</float>
<str name="qf">
id^10.0 keyword^1.5 title^1.0 region^0.5 country^0.5 city^0.5
</str>
<str name="pf">
keyword^1.5 title^1.0 region^0.5 country^0.5 city^0.5
</str>
<str name="bf">
</str>
<str name="mm">
2<-1 5<-2 6<90%
</str>
<int name="ps">100</int>
<str name="q.alt">*:*</str>
<!-- example highlighter config, enable per-query with hl=true -->
<str name="hl.fl">text features name</str>
<!-- for this field, we want no fragmenting, just highlighting -->
<str name="f.name.hl.fragsize">0</str>
<!-- instructs Solr to return the field itself if no query terms are
found -->
<str name="f.name.hl.alternateField">name</str>
<str name="f.text.hl.fragmenter">regex</str> <!-- defined below -->
</lst>
在本例中,qf是要应用于每个字段的字段和提升.上述配置将跨id、关键字、标题、区域、国家和城市进行搜索.有关更多信息,请查看相应的Wiki页面(适用于DisMaxRequestHandler).
使用它们最有效的方法当然是首先确切知道您想要实现什么,然后根据处理程序找到最佳匹配,然后调整配置以提供您和您的社区所期望的结果.
响应写入器是插件(逻辑模块),它将提供以特定格式编写响应的方法和手段.目前,这个概念主要应用于搜索,在这里您将处理QueryResponseWriter的派生,而QueryResponseWriter将由响应格式参数wt(在查询中) Select .
如果您正在使用PHP,那么您肯定会对使用wt=php或wt=phps为您的请求生成PHP友好的响应感兴趣.
php响应可以求值为:
$code = file_get_contents('http://localhost:8983/solr/select?q=iPod&wt=php');
eval("\$result = " . $code . ";");
print_r($result);
phps响应可以通过PHP的序列化机制读取:
$serializedResult = file_get_contents('http://localhost:8983/solr/select?q=iPod&wt=phps');
$result = unserialize($serializedResult);
print_r($result);
还有对其他应用程序的支持(如Ruby、Python、Java Binary等),这些应用程序的构建本质上是为了让开发人员更容易使用比解析XML或JSON更快的机制将SOLR集成到他们的web应用程序中.
然而,也有其他类型的ResponseWriter实际上transform基于模板(例如Velocity)或转换(例如XSLT)进行响应.这在某些情况下很有用,因为您不想依赖另一个应用程序来处理查询结果(例如,直接将XSLT转换为XHTML).
solrconfig.xml中也配置了响应编写器,通常您将启用您感兴趣的响应编写器,例如:
<queryResponseWriter name="xml" class="org.apache.solr.request.XMLResponseWriter" default="true"/>
<queryResponseWriter name="json" class="org.apache.solr.request.JSONResponseWriter"/>
<queryResponseWriter name="php" class="org.apache.solr.request.PHPResponseWriter"/>
<queryResponseWriter name="phps" class="org.apache.solr.request.PHPSerializedResponseWriter"/>
使用它们的最有效方式取决于您的环境和您想要实现的目标.显然,如果您使用的是PHP,phps可能会给您带来更好(通过语言轻松访问)和更快(内置序列化机制,不太冗长)的结果.如果是在Javascript中,json可能只是个不错的 Select ,以此类推.
您可以看到,Solr是一个功能强大、用途广泛的平台:)
如果你想找到一条穿过丛林的路,你可能会想求助于某本书,比如"Solr 1.4 Enterprise Search Server"本(尽管我不确定它作为导论真的是最好的可能的工作).许多事情你可以通过反复试验、耐心和一些在线帮助来弄清楚.
希望这能让你振作起来.