2012-05-11 5 views
6

Ich verwende Solr 3.6 und möchte Collationen von suggester als Autocomplete-Lösung für Multi-Term-Suchen verwenden. Leider gibt der Suggester nur eine Kollatierung für eine Mehrtermsuche zurück, auch wenn viele Vorschläge für jeden einzelnen Begriff existieren. Abhängig von meinen Testsuchen und den zugrunde liegenden indizierten Daten bin ich mir sicher, dass mehr Kollatierungen existieren müssen.Solr gibt nur eine Sortierung für Suggester-Komponente zurück

Stimmt etwas nicht mit meiner Suggester-Konfiguration?

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

Beispiel Antwort für 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> 
+0

Ran in dieses Problem selbst, sondern nur die Grund Solr Spielzeug App (start.jar). Ich habe jede erdenkliche Kombination von Rechtschreibparametern ausprobiert, einschließlich spellcheck.maxCollations, kann aber anscheinend nicht mehr als eine Sortierung erhalten. Irgendwelche Einsichten würden geschätzt werden. – nlawson

Antwort

14

ich das gleiche Problem wie Sie haben, und ich es geschafft, es zu lösen. Es stellt sich heraus, dass es mehrere Dinge gibt, die Sie wissen müssen, damit mehrere Kollatierungen ordnungsgemäß funktionieren.

Zuerst müssen Sie eine QueryComponent unter der components Liste der „vorschlagen“ requestHandler in Ihrem solrconfig.xml angeben. Andernfalls weiß Ihre requestHandler nicht, wie Sie den Index abfragen, damit sie nicht herausfinden kann, wie viele Treffer jede korrigierte Abfrage hat, so dass Sie nur eine erhalten. Wenn Sie spellcheck.collateExtendedResults=true zu Ihrer Abfrage hinzugefügt hätten, hätten Sie gesehen, dass hits 0 war, was zeigt, dass Solr sich nicht darum gekümmert hat, die korrigierte Abfrage gegen den Index zu überprüfen.

Sie auf diesen Hinweis mit einer etwas undurchsichtigen Fehlermeldung: „Abfrage“

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

Der einfachste Weg, um es hinzuzufügen, ist die Standard-QueryComponent, zu verwenden, die aufgerufen wird, So in der XML Sie oben geschrieben, dann würden Sie die „Komponenten“ Teil ändern:

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

Zweitens Sie müssen spellcheck.maxCollations einstellen, um mehr als 1 (duh) und weniger intuitiv, was Sie brauchen Setzen Sie spellcheck.maxCollationTries auf eine große Zahl (zB 1000). Wenn einer dieser Werte auf die Standardwerte gesetzt ist (beide 0), gibt Solr Ihnen nur eine Sortierung. Außerdem müssen Sie spellcheck.count größer zu sein als 1.

Drittens setzen, Sie müssen die Abfrage verändern, das Feld schließen Sie suchen möchten gegen, und die Bedingungen müssen in Anführungszeichen gesetzt werden richtige Sortierung zu gewährleisten. So im Fall der Anfrage:

q=bio+ber

Dies sollte wirklich sein:

q=text:"bio+ber"

Offensichtlich in Ihrem Fall, "text" ist das Standardfeld, so dass Sie nicht brauchen es. Aber in meinem Fall benutzte ich ein nicht standardmäßiges Feld, also musste ich es spezifizieren. Sonst würde Solr die Treffer gegen das "Text" -Feld zählen, und alle Ergebnisse würden 0 Treffer haben, so dass das Ranking nutzlos wäre.

Also in meinem Fall sah die Abfrage wie folgt:

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

Und meine Antwort sah wie folgt aus:

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

Erfolg!

+0

+1 das gab mir einige Dinge zu versuchen. – Aaron

+0

'@ nlawson': Werden Sie helfen, diese Fehler zu beheben: [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

Hatte das gleiche Problem.

Dies ist ein Fehler von Solr 3.6.1 (nicht sicher über die vorherigen Versionen). Bitte überprüfen Sie: https://issues.apache.org/jira/browse/SOLR-2853.

Eigentlich stellt dieser Kommentar das Licht: https://issues.apache.org/jira/browse/SOLR-2853?focusedCommentId=13136014&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-13136014

Eine mögliche Abhilfe ist spellcheck.maxCollationTries angeben, die die Anzahl der Sortierungen gleich sein müssen Sie aber das wird auch Solr zwingen diese Sortierungen gegen Suchindex zu überprüfen. Achten Sie also darauf, diese Eigenschaft auf eine große Zahl zu setzen. Mehr zu diesem Parameter hier: http://wiki.apache.org/solr/SpellCheckComponent#spellcheck.maxCollationTries.

Fehler ist nicht geschlossen, aber es wurden bereits Patches eingereicht.

Auch ich habe den Code von Solr 4.0.0-BETA überprüft - Fix gibt es schon.

Viel Glück Solrs!)

Verwandte Themen