2012-04-02 10 views
2

Dies erfordert ein wenig Erklärung, aber ich denke, diese Diskussion könnte jedem mit wichtigen Phrasen in ihrem Solr-Index helfen.Sortierung der Rechtschreibprüfung Ergebnisse in Solr

Ich verwende Solr zur Suche in einem E-Commerce-Kontext, und ich versuche, Rechtschreibprüfung Vorschläge für Markennamen zu verbessern. Standardmäßig überprüft Solr jedes Wort einzeln, ohne Rücksicht darauf, ob die resultierende Phrase Sinn ergibt. Zum Beispiel bringt eine Suche nach "paula dean" zurück "Meintest du: Paula Bohne?", Während der Markenname tatsächlich "Paula Deen" ist. Zur Zeit ist mein Wörterbuch für Rechtschreibprüfung ein whitespace-Token-Feld namens spellField. Um vollständige Markennamen für die Rechtschreibprüfung zu indizieren, ersetze ich meinen Solr-Import Whitespace in Markennamen aus meiner Datenbank mit Unterstrichen, d. H. Entree Casual Dining -> Entree_Casual_Dining. Hier ist das Schema für den Feldtyp von spellField:

<fieldType name="spellcheckquery" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.PatternReplaceFilterFactory" pattern="(\s[0-9]+\s)|(^[0-9]+\s)|(\s[0-9]+$)|(^[0-9]+$)" replacement="" replace="all"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.PatternReplaceFilterFactory" pattern="(\s[0-9]+\s)|(^[0-9]+\s)|(\s[0-9]+$)|(^[0-9]+$)" replacement="" replace="all"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.ShingleFilterFactory" minShingleSize="2" maxShingleSize="4" outputUnigrams="true"/> 
    </analyzer> 
</fieldType> 

Unterstreicht in dem Markennamen Putting war der beste Weg, ich denken konnte, Mehrwortmarkennamen als einziges Token in einem Leerzeichen Token versehen Feld zu halten. Ich kann den zurückgegebenen Rechtschreibvorschlag von Unterstreichungen leicht entfernen, nachdem er zurückkommt. So, jetzt, wenn eine Abfrage hereinkommt, schichtet Solr die Abfrage und sucht nach einem Rechtschreibvorschlag für jeden Schindel, dh Suche nach der Marke mit einem Rechtschreibfehler: "entre casual dining" -> "entre", "casual", " Dining "," Entre lässig "," Casual Dining "," Entre Casual Dining ". Die Schindel "entre casual dining" ist ähnlich wie im Index ("Entree_Casual_Dining"), daher kommt "entree_casual_dining" als Vorschlag zurück. Groß.

Angenommen, die Abfrage enthält einen Markennamen und eine Art von Produkt, wie "Entre Casual Esstisch gesetzt." Wir möchten die Rechtschreibkorrektur für den Markennamen finden und die gesamte falsch geschriebene Marke ersetzen, um den Vorschlag "entree_casual_dining table set" zurückzugeben. Ich dachte mir, Solrs Collate-Funktionalität würde damit gut umgehen. Als ich diese Suche eingeben, obwohl, findet Solr die richtige Marke Vorschlag, aber es ist es nicht in das Ergebnis collate zurück:

<response> 
    <lst name="responseHeader"> 
    <int name="status">0</int> 
    <int name="QTime">48</int> 
    </lst> 
    <result name="response" numFound="100" start="0"/> 
    <lst name="spellcheck"> 
    <lst name="suggestions"> 
     **<lst name="entre casual dining">** 
     <int name="numFound">1</int> 
     <int name="startOffset">0</int> 
     <int name="endOffset">19</int> 
     <int name="origFreq">0</int> 
     <arr name="suggestion"> 
      <lst> 
      **<str name="word">entree_casual_dining</str>** 
      <int name="freq">21</int> 
      </lst> 
     </arr> 
     </lst> 
     <bool name="correctlySpelled">false</bool> 
     **<str name="collation">entre casual dining table set</str>** 
    </lst> 
    </lst> 
</response> 

es kein Problem, Zusammenstellen hat, wenn die Korrektur von einem einzelnen falsch geschriebenen Wort in der Abfrage kam . Zum Beispiel, wenn Sie "Tabelle" falsch schreiben, es wird es zurück in die Abfrage richtig sortieren.

Was könnte schief gehen, wenn versucht wird, einen Vorschlag aus einem Mehrwort-Shingle zusammenzustellen?

Antwort

0

Ich habe gesehen, wie Solr erfolgreich Vorschläge für Multi-Wort-Keywords ohne irgendein Problem zusammentragen. Ich hatte Solr 3.1 obwohl verwendet. Das einzige Problem, das ich hatte, war, wenn mehrere Wörter in einem Mehrwort-Schlüsselwort falsch geschrieben sind und es Vorschläge von solr gibt, dann gibt es mehrere Kombinationen, die von der Rechtschreibprüfung angezeigt werden, wenn Sie "Sortieren" aktiviert haben - also wenn es kniffliger wird.

Auch bei Verwendung von "_" in Ihrem Szenario nehme ich an, dass es kompliziert werden könnte, je nachdem, wie schlecht das Wort falsch geschrieben ist, weil es "_" auch als Teil des Wortes betrachten und für seine Berechnungen verwenden würde. Ich frage mich nur, ob es so funktioniert, wie Sie es erwarten, denn die Schindelfabrik produziert auch zerbrochene Schindeln.

+0

Es stimmt, es gibt ein unerwartetes Verhalten. Glauben Sie, dass es eine Möglichkeit gibt, vollständige Marken-Tokens in mein Feld für die Rechtschreibprüfung zu setzen, während die übrigen Begriffe in diesem Feld whitespace-tokenisiert sind?Könnten Sie ein Beispiel für das Zusammenstellen von Mehrwort-Stichwörtern durch Solr zeigen? Vielen Dank für Ihre Antwort! –

1

würde ich ändern Ihre Analysator betrachten mehr wie folgt aussehen:

<analyzer type="index"> 
    <tokenizer class="solr.KeywordTokenizerFactory"/> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" preserveOriginal="1" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
</analyzer> 
<analyzer type="query"> 
    <tokenizer class="solr.KeywordTokenizerFactory"/> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" preserveOriginal="0" /> 
    <filter class="solr.LowerCaseFilterFactory"/> 
</analyzer>  

von preserveOriginal auf 1 setzen, wird es den Markennamen als beide einzelne Wörter und als ein großes Zeichen tokenize. Außerdem glaube ich, dass das Shingle-Zeug veraltet ist und in 4.0 zum Entfernen vorgesehen ist.

Verwandte Themen