2010-12-28 7 views
1

Ich möchte, dass Lucene.NET einen Wert speichert, während eine modifizierte, abgespeckte Version des gespeicherten Wertes indiziert wird. z.B. Betrachten Sie den Wert:Make Lucene einen Wert indexieren und einen anderen speichern

this_example-has some/weird (chars) 100% 

ich es richtig so gespeichert werden soll (so dass ich genau, dass in der Ergebnisliste für die Ansicht abrufen kann), aber ich mag lucene zu indizieren als:

this example has some weird chars 100 

(Sie sehen, wie eine "sanitized" Version des ursprünglichen Wertes) für eine vereinfachte Suche.

Ich denke, das wäre die Aufgabe eines Analysators, aber ich möchte nicht mit dem Rollen meiner eigenen Verwirrung. Idealerweise sollte die Lösung alles entfernen, was nicht ein Buchstabe, eine Zahl oder ein Anführungszeichen ist, und die entfernten Zeichen vor der Indizierung durch einen Leerraum ersetzen.

Irgendwelche Vorschläge, wie man das umsetzt?

Dies liegt daran, dass ich Produkte für eine E-Commerce-Suche indexieren, und einige haben wirklich gruselige Namen. Ich denke, dies würde die Durchsetzungsfähigkeit der Suche verbessern.

Vielen Dank im Voraus.

Antwort

1

Wenn Sie keinen benutzerdefinierten Analysator möchten, versuchen Sie, den Wert als separates nicht indiziertes Feld zu speichern, und verwenden Sie einen einfachen Regex, um die bereinigte Version zu generieren.

Sie erwähnen, dass Sie einen anderen Analyzer für einige Suchfunktionen benötigen. Vergessen Sie nicht den PerFieldAnalyzerWrapper, mit dem Sie verschiedene Analysatoren innerhalb desselben Dokuments verwenden können.

public static void Main() { 
    var wrapper = new PerFieldAnalyzerWrapper(defaultAnalyzer: new StandardAnalyzer(Version.LUCENE_29)); 
    wrapper.AddAnalyzer(fieldName: "id", analyzer: new KeywordAnalyzer()); 

    IndexWriter writer = null; // TODO: Retrieve these. 
    Document document = null; 
    writer.AddDocument(document, analyzer: wrapper); 
} 
+0

Schön, ich wusste nichts über den PerFieldAnalyzer, und es wird sicherlich nützlich sein! Über den Vorschlag, zwei getrennte Felder zu haben, denke ich, dass dies in meinem Fall der richtige Weg sein wird. Vielen Dank! –

0

Sie haben Recht, dass dies die Arbeit des Analysators ist. Und ich würde mit einem Tool wie luke beginnen, um zu sehen, was der Standardanalysator mit Ihrem Begriff macht, bevor Sie anfangen zu verwenden - es tendiert dazu, einen guten Job zu machen, Rauschzeichen und Wörter abziehend.

+0

ich in sie aussehen, und leider ist es nicht so verhalten, wie ich es brauche .. Es verwandelte ** [this_example-hat einig/seltsam (Zeichen) 100%] ** in ** [ "Beispiel hat" "einige komische" Zeichen 100] **. Aber für ** [meta-6] ** hat es nicht dasselbe getan, während es ** [meta-6] ** geblieben ist. Darüber hinaus muss das System Produktnamen in brasilianischen Portugiesisch indizieren und suchen, und dazu muss ich einen anderen Analyzer (BrazilianAnalyzer) verwenden. Deshalb dachte ich, es wäre einfacher, getrennte Werte für das Suchen und Suchen zu haben ... irgendwelche Gedanken? –