【问题标题】:Could somebody explain SOLR requestHandlers and responseWriters in detail?有人可以详细解释 SOLR requestHandlers 和 responseWriters 吗?
【发布时间】:2011-01-09 23:31:12
【问题描述】:

首先,对于刚学会如何索引和搜索字段的人来说,solr wiki 的许多部分并不是很有用。好像是为专家写的!它使用与 solr 相关的术语,因此如果不反复阅读,很难理解它。

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

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

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

关于这些处理程序我还应该知道什么?

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

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

感谢您的帮助!

【问题讨论】:

    标签: java php sql mysql database


    【解决方案1】:

    在 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 的派生类,而后者又将由响应格式参数 wt(在查询中)选择。

    如果您正在使用 PHP,那么您肯定会对使用 wt=phpwt=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"(虽然我不确定它作为介绍是否真的做得最好)。通过反复试验以及耐心和一些在线帮助,您可以最好地弄清楚许多事情。

    希望这有助于您继续前进。

    【讨论】:

    • 很好的答案。能不能也解释一下defTypeechoParams
    • @cuh:请为此创建另一个问题。
    猜你喜欢
    • 2011-06-24
    • 2021-04-11
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 2012-05-29
    • 2010-12-13
    相关资源
    最近更新 更多