2010-06-30 7 views
5

Ich habe ein Problem mit Striping Interpunktion aus dem Solr-Index Wenn das Satzzeichen direkt nach einem Wort folgen, dann wird dieses Wort nicht richtig indiziert.Solr: Streifen Interpunktion vor dem Index

Zum Beispiel: Wenn wir "Hallo, John" indexieren, wird das Asset nicht mit dem Schlüsselwort "Hallo" gefunden, während es kein Problem gibt, wenn wir das Komma nach dem Wort "Hallo" entfernen.

Gibt es eine FilterFactory, die Interpunktion abziehen soll? Irgendwelche Ideen?

Danke, Bogdan.

Antwort

6

Dies geschieht mit der WordDelimiterFilterFactory. Setze generateWordParts = 1.

Es gibt auch die PatternTokenizerFactory, die verwendet werden könnte, aber ich habe es noch nie versucht.

+0

Für Menschen mit Grenzfällen wie meins: Die generateWordParts = 1 wird in der Regel arbeiten, aber wenn Sie das tun, was ich tue, wird es nicht: Ich bin mit der Attribut "types" von WDFF, das zugeordnet werden soll. und $ zu ALPHA, damit ich Begriffe wie $ 10.00 zuordnen kann. Dies hat den negativen Nebeneffekt, dass Präfix- und Suffixperioden als Teil des Wortes enthalten sind. In meinem Fall könnte die Antwort von @claytron besser passen. –

6

können Sie die solr.PatternReplaceFilterFactory verwenden Anfang abzustreifen und Hinter Interpunktion mit diesem:

<filter class="solr.PatternReplaceFilterFactory" 
    pattern="^\p{Punct}*(.*?)\p{Punct}*$" 
    replacement="$1"/> 

Und wenn Sie alle Satzzeichen am Anfang und Ende abzustreifen wollte, mit Ausnahme von (zum Beispiel) der Dollar-Zeichen vor ein Wort, könnten Sie verwenden:

<filter class="solr.PatternReplaceFilterFactory" 
    pattern="^[\p{Punct}&&[^$]]*(.*?)\p{Punct}*$" 
    replacement="$1"/> 
+0

Ich glaube, Masons Bearbeitung hat diese Antwort zu radikal geändert. Er hätte eine andere Antwort hinzufügen sollen. – CorayThan

+0

@CorayThan Wie ist es zu radikal von einer Veränderung? Ich habe die Regex an der ursprünglichen Antwort von Claytron ein wenig angepasst, da das Erfassen der Interpunktion erst später weggeworfen wird und dann ein Beispiel hinzugefügt wird, wie man diese Regex weiter verfeinert, wenn man alle Interpunktion ausnehmen möchte, außer für einen bestimmten Charakter ... etwas das könnte ziemlich nützlich sein. Keine scheint mir eine ganz andere Antwort zu sein, daher scheint es nicht richtig zu sein, sie als solche zu veröffentlichen. –

0

verwenden PatternReplaceFilterFactory

<!-- remove punctuation --> 
    <filter class="solr.PatternReplaceFilterFactory" pattern="^(\p{Punct}*)(.*?)(\p{Punct}*)$" replacement="$2"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
<filter class="solr.StandardFilterFactory"/> 
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
    </analyzer> 

...