在 Solr 中,RequestHandler 本质上是一个插件(逻辑模块),它以特定方式处理传入的请求。
请求处理程序可以提供查询以外的功能,而不是对实际搜索查询“做”一些事情,例如数据导入。
通常,Solr 中的请求处理程序配置为特定端点(即 URL),而不是通过 qt 参数选择。但是,特定于搜索的处理程序可以使用查询类型参数以特定方式处理查询(即一个处理程序可能能够处理各种查询类型)。
使用什么处理程序,通常取决于您想要实现的目标。我建议您查看提供的处理程序列表,并将它们的描述(许多有 Wiki 页面)与您想要做的匹配。
对于查询,除了默认的 SearchHandler 之外,最常用的请求处理程序是 DisMaxRequestHandler (qt=dismax),它本质上将根据字段重要性使用不同的权重提供跨多个字段的搜索.这通常被人们称为“Google like”搜索。
此外,您可能有兴趣查看 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 的派生类,而后者又将由响应格式参数 wt(在查询中)选择。
如果您正在使用 PHP,那么您肯定会对使用 wt=php 或 wt=phps 生成对您的请求的 PHP 友好响应感兴趣。 p>
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 二进制等),本质上是为了让开发人员更容易使用比解析 XML 或 JSON 更快的机制将 SOLR 集成到他们的 Web 应用程序中。
但是,还有其他类型的 ResponseWriter,实际上是转换基于模板(例如 Velocity)或转换(例如 XSLT)的响应。这在某些情况下很有用,您不想依赖另一个应用程序来处理查询结果(例如,将 XSLT 直接转换为 XHTML)。
Response Writers 也在 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 可能只是要走的路等等。
你看,SOLR 是一个功能强大且用途广泛的平台 :)
如果你想找到一条穿过丛林的路,你可能想求助于一些书,比如"Solr 1.4 Enterprise Search Server"(虽然我不确定它作为介绍是否真的做得最好)。通过反复试验以及耐心和一些在线帮助,您可以最好地弄清楚许多事情。
希望这有助于您继续前进。