6

我使用 solr 3.6,我想使用来自建议者的排序规则作为多词搜索的自动完成解决方案。不幸的是,对于多词搜索,Suggester 只返回一个排序规则,即使每个单个词存在很多建议。根据我的测试搜索和基础索引数据,我确信必须存在更多排序规则。

我的 Suggester 配置有问题吗?

    <!--configuration -->
<searchComponent class="solr.SpellCheckComponent" name="suggest">
<lst name="spellchecker">
  <str name="name">suggest</str>
  <str name="classname">org.apache.solr.spelling.suggest.Suggester</str>
  <str name="lookupImpl">org.apache.solr.spelling.suggest.fst.WFSTLookupFactory</str>
  <str name="field">text</str>  <!-- the indexed field to derive suggestions from -->
  <!--<float name="threshold">0.0005</float> disabled for test-->
  <str name="buildOnCommit">true</str>
</lst>
</searchComponent>

<requestHandler class="org.apache.solr.handler.component.SearchHandler" name="/suggest">
<lst name="defaults">
  <str name="spellcheck">true</str>
  <str name="spellcheck.dictionary">suggest</str>
  <str name="spellcheck.onlyMorePopular">true</str>
  <str name="spellcheck.count">200</str>
  <str name="spellcheck.collate">true</str>
  <str name="spellcheck.maxCollations">10</str>
</lst>
<arr name="components">
  <str>suggest</str>
</arr>
</requestHandler> 

q=bio+ber 的示例响应:

<response>
<lst name="responseHeader">
    <int name="status">0</int>
    <int name="QTime">4</int>
</lst>
<lst name="spellcheck">
    <lst name="suggestions">
        <lst name="bio">
            <int name="numFound">27</int>
            <int name="startOffset">0</int>
            <int name="endOffset">3</int>
            <arr name="suggestion">
                <str>bio</str>
                <str>bio-estetica</str>
                <str>bio-kosmetik</str>
                                    ...
            </arr>
        </lst>
        <lst name="ber">
            <int name="numFound">81</int>
            <int name="startOffset">4</int>
            <int name="endOffset">7</int>
            <arr name="suggestion">
                <str>beratung</str>
                <str>bern</str>
                ...
            </arr>
        </lst>
        <str name="collation">bio beratung</str>
    </lst>
</lst>
</response>
4

2 回答 2

14

我遇到了和你一样的问题,我设法解决了。事实证明,为了让多个排序规则正常工作,您需要了解几件事。

首先,您必须QueryComponent在. 否则你不知道如何查询索引,所以它无法计算出每个更正的查询有多少命中,所以你只会得到一个。如果您已添加到查询中,您会看到为 0,这表明 Solr 没有费心根据索引检查更正后的查询。componentsrequestHandlersolrconfig.xmlrequestHandlerspellcheck.collateExtendedResults=truehits

他们用一个有点不透明的错误信息暗示了这一点:

INFO: Could not find an instance of QueryComponent. Disabling collation verification against the index.

添加它的最简单方法是使用默认值QueryComponent,称为“查询”。因此,在您在上面发布的 XML 中,您将“组件”部分更改为:

<arr name="components">
  <str>suggest</str>
  <str>query</str>
</arr>

其次,您需要设置spellcheck.maxCollations为大于 1(duh),不太直观,您需要设置spellcheck.maxCollationTries为一些较大的数字(例如 1000)。如果其中任何一个设置为默认值(均为 0),那么 Solr 只会给您一个排序规则。此外,您需要设置spellcheck.count为大于 1。

第三,您需要修改查询以包含您要搜索的字段,并且这些术语必须用引号括起来以确保正确排序。因此,对于您的查询:

q=bio+ber

这真的应该是:

q=text:"bio+ber"

显然,在您的情况下,“文本”是默认字段,因此您不需要它。但就我而言,我使用的是非默认字段,所以我必须指定它。否则,Solr 会针对“文本”字段计算点击数,所有结果都会有 0 次点击,因此排名将毫无用处。

所以在我的例子中,查询看起来像这样:

q=my_field:"brain+c"
&spellcheck.count=5
&spellcheck.maxCollations=10
&spellcheck.maxCollationTries=1000
&spellcheck.collateExtendedResults=true

我的回复是这样的:

<response>
  <lst name="responseHeader">
    <int name="status">0</int>
    <int name="QTime">4</int>
  </lst>
  <lst name="spellcheck">
    <lst name="suggestions">
      <lst name="brain">
        <int name="numFound">1</int>
        <int name="startOffset">15</int>
        <int name="endOffset">20</int>
        <arr name="suggestion">
          <str>brain</str>
        </arr>
      </lst>
      <lst name="c">
        <int name="numFound">4</int>
        <int name="startOffset">21</int>
        <int name="endOffset">23</int>
        <arr name="suggestion">
          <str>cancer</str>
          <str>cambrian</str>
          <str>contusion</str>
          <str>cells</str>
        </arr>
      </lst>
      <lst name="collation">
        <str name="collationQuery">my_field:"brain cancer"</str>
        <int name="hits">2</int>
        <lst name="misspellingsAndCorrections">
          <str name="brain">brain</str>
          <str name="c">cancer</str>
        </lst>
      </lst>
      <lst name="collation">
        <str name="collationQuery">my_field:"brain contusion"</str>
        <int name="hits">1</int>
        <lst name="misspellingsAndCorrections">
          <str name="brain">brain</str>
          <str name="c">contusion</str>
        </lst>
      </lst>
      <lst name="collation">
        <str name="collationQuery">my_field:"brain cells"</str>
        <int name="hits">1</int>
        <lst name="misspellingsAndCorrections">
          <str name="brain">brain</str>
          <str name="c">cells</str>
        </lst>
      </lst>
    </lst>
  </lst>
  <result name="response" numFound="0" start="0"/>
</response>

成功!

于 2012-05-22T17:52:02.430 回答
0

有同样的问题。

这是 Solr 3.6.1 的一个错误(不确定以前的版本)。请检查:https ://issues.apache.org/jira/browse/SOLR-2853 。

实际上,这条评论很重要:https ://issues.apache.org/jira/browse/SOLR-2853?focusedCommentId=13136014&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-13136014

一种可能的解决方法是将 spellcheck.maxCollat​​ionTries 指定为等于您需要的排序规则的数量,但这也会强制 Solr 根据搜索索引检查这些排序规则。所以要小心将此属性设置为一个很大的数字。更多关于这个参数在这里:http ://wiki.apache.org/solr/SpellCheckComponent#spellcheck.maxCollat​​ionTries 。

Bug 没有关闭,但是已经提交了补丁。

我还检查了 Solr 4.0.0-BETA 的代码 - 修复程序已经存在。

祝你好运!)

于 2012-09-21T18:56:42.347 回答