2012-05-11 35 views
6

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

我的Suggester配置有问题吗?当q =生物+ BER

<!--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> 

实施例响应:

<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> 
+0

自己跑到这个问题,只使用基本的Solr玩具应用程序(start.jar)。我尝试了拼写检查参数的所有可能组合,包括spellcheck.maxCollat​​ions,但似乎无法获得多个排序规则。任何见解,将不胜感激。 – nlawson

回答

14

我有相同的问题,因为你,我设法解决这个问题。事实证明,为了使多个排序规则正常工作,您需要知道几件事情。

首先,必须下的components列表中指定一个QueryComponentsolrconfig.xml的“建议” requestHandler。否则,您的requestHandler不知道如何查询索引,因此无法确定每个更正的查询有多少个匹配,因此您只能得到一个。如果您已将spellcheck.collateExtendedResults=true添加到您的查询中,您会看到hits为0,这表明Solr没有打扰检查针对索引的纠正查询。

他们暗示这个带有几分不透明的错误消息:

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(杜),而不太直观,需要设置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> 

成功!

+0

+1这给了我一些尝试的东西。 – Aaron

+0

'@ nlawson':你会帮助解决这些错误:[http://stackoverflow.com/questions/27502903/threshold-frequency-is-not-working-in-spell-check-in-solr]&[http ://stackoverflow.com/questions/27484326/getting-most-likely-documents-of-the-query-using-phonetic-filter-in-solr] – iNikkz

0

有同样的问题。

这是Solr 3.6.1的一个bug(不知道以前的版本)。请检查: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.maxCollationTries

错误未关闭,但已提交补丁。

此外我已经检查了Solr 4.0.0-BETA的代码 - 修复已经存在。

祝你好运Solrs!)