Wie n-Gramm ungefähre Übereinstimmung mit Solr verwenden?

Wir haben eine Datenbank mit Filmen und Serien, und da die Daten aus vielen Quellen mit unterschiedlicher Zuverlässigkeit stammen, möchten wir in der Lage sein, Fuzzy-String-Matching für die Titel von Episoden durchzuführen. Wir verwenden Solr für die Suche in unserer Anwendung, aber die Standard-Matching-Mechanismen arbeiten auf Wortebene, was für kurze Zeichenfolgen wie Titel nicht ausreicht

Ich hatte in der Vergangenheit eine ungefähre Übereinstimmung mit n-Gramm verwendet, und ich war sehr froh, dass Lucene (und Solr) dies sofort unterstützen. Leider konnte ich es nicht richtig konfigurieren.

Ich bin davon ausgegangen, dass ich dafür einen speziellen Feldtyp benötige, also habe ich meinem Schema.xml den folgenden Feldtyp hinzugefügt:

<fieldType 
   name="trigrams" 
   stored="true" 
   class="solr.StrField"> 
 <analyzer type="index"> 
   <tokenizer 
       class="solr.analysis.NGramTokenizerFactory" 
       minGramSize="3" 
       maxGramSize="5" 
       /> 
   <filter class="solr.LowerCaseFilterFactory"/> 
 </analyzer> 
</fieldType> 

und änderte das entsprechende Feld im Schema auf:

<field name="title" type="trigrams" 
    indexed="true" stored="true" multiValued="false" /> 

Dies funktioniert jedoch nicht wie erwartet. Die Abfrageanalyse sieht korrekt aus, aber ich erhalte keine Ergebnisse, was mich glauben lässt, dass zum Indexzeitpunkt etwas passiert (dh der Titel wird wie ein Standard-Zeichenfolgenfeld anstelle eines Trigrammfelds indexiert).

Die Frage, die ich versuche, ist so etwas wie

title:"guy walks into a psychiatrist office"

(mit einem Tippfehler oder zwei) und es sollte mit "Guy Walks in a Psychiatrist Office" übereinstimmen.

(Ich bin mir nicht sicher, ob die Abfrage korrekt ist.)

Darüber hinaus möchte ich in der Lage sein, tatsächlich etwas mehr zu tun. Ich möchte die Zeichenfolge verringern, alle Satzzeichen und Leerzeichen entfernen, englische Stoppwörter entfernen und dann die Zeichenfolge in Trigramme ändern. Die Filter werden jedoch erst angewendet, nachdem die Zeichenfolge mit einem Token versehen wurde ...

Vielen Dank im Voraus für Ihre Antworten.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage