java - 有人可以详细解释 SOLR requestHandlers 和 responseWriters 吗?

标签 java php sql mysql database

首先,solr wiki 的许多部分对于刚刚学习如何索引和搜索字段的人来说并不是很有用。好像是为高手写的!它使用相对于 solr 的术语,因此如果不多读几遍就很难理解它。

注意 :我有一个分类广告网站,最近的广告总是最先出现,所以排序对我来说无关紧要,除了按价格和日期排序之外,没有其他选项可供用户使用,以及每页有多少结果。

我知道一个 requestHandler是一种“对查询做一些事情”的方法,对吗?
但是如何知道使用哪个处理程序对我来说很难。以及如何配置一个。
我所知道的是处理程序是在查询字符串中指定的,如“qt=my_handler”。

此外,同样的问题也适用于 responseWriters ,使用哪个?如何配置?

关于这些处理程序,我还应该了解什么?

如何使用它们是一种好的和有效的方法?

在我了解了所有这些之后,我真的应该写一些关于在 PHP 网站中实现 solr 的内容。

感谢你的帮助!

最佳答案

在 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&lt;-1 5&lt;-2 6&lt;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 的派生类,而后者又将由响应格式参数 选择。重量 (在查询中)。

如果您使用 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);

并且可以使用 PHP 的序列化机制读取 phps 响应:
$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 可以根据模板(例如 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 可能只是要走的路等。

您看,SOLR 是一个功能强大且用途广泛的平台 :)
如果你想在丛林中找到一条路,你可能需要求助于一些书,比如 "Solr 1.4 Enterprise Search Server" (虽然我不确定它作为介绍是否真的做得最好)。许多事情可以通过反复试验、耐心和一些在线帮助来最好地解决。

希望这有助于让你前进。

关于java - 有人可以详细解释 SOLR requestHandlers 和 responseWriters 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2147346/

相关文章:

java - 为什么 Scala List 没有 size 字段?

javascript - 使用在动态表单字段中选择的 jQuery

javascript - 显示内容 Jquery

android - 如何在我的应用程序中组织 SQLite 数据库

java - 通用接口(interface)的多种实现

java - LibGDX Sprite + Box2D CircleShape : Positioning while taking into account origin

php - 对照另一个数组检查数组

sql - 从外表中存储和检索多个值

mysql - 错误 1064 (42000) 未能授予权限

java - 使用 Scala 在 .zip 文件夹中创建一个新文件