2010-06-30 10 views
5

Mam problem z paskiem interpunkcyjnym ze wskaźnika Solr Gdy znak interpunkcyjny następuje zaraz po słowie, to słowo nie jest poprawnie indeksowane.Solr: strip interpunkcja przed indeksem

Na przykład: jeśli zindeksujemy "Witaj, John", zasób nie zostanie znaleziony przez słowo kluczowe "cześć", podczas gdy nie będzie problemu, jeśli usuniemy przecinek po słowie "cześć".

Czy jest jakiś obiekt FilterFactory, który powinien usuwać znaki interpunkcyjne? Jakieś pomysły?

Dzięki, Bogdan.

Odpowiedz

6

Dokonuje się tego za pomocą programu WordDelimiterFilterFactory. Ustaw generateWordParts = 1.

Istnieje również PatternTokenizerFactory, którego można użyć, ale nigdy go nie wypróbowałem.

+0

Dla osób z przypadków brzegowych jak moje są generateWordParts = 1 będzie normalnie działać, ale jeśli robisz to, co robię, to nie będzie: Używam atrybut 'types' w WDFF do odwzorowania. i $ do ALPHA, dzięki czemu mogę dopasować terminy takie jak "10,00 $". Ma to negatywny skutek uboczny, polegający na tym, że okresy prefiksu i sufiksu są uwzględniane jako część słowa. Więc w moim przypadku odpowiedź @claytron może być lepiej dopasowana. –

6

Można użyć solr.PatternReplaceFilterFactory rozebrać początku i na końcu znak interpunkcyjny z tym:

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

A jeśli chciał rozebrać wszystkie znaki interpunkcyjne na początku i na końcu, z wyjątkiem (na przykład) znak dolara z przodu wyrazu, można użyć to:

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

Wierzę, że redakcja Masona zmieniła tę odpowiedź zbyt radykalnie. Powinien dodać kolejną odpowiedź. – CorayThan

+0

@CorayThan Jak to jest zbyt radykalne zmiany? Nieznacznie zmodyfikowałem wyliczenie oryginalnej odpowiedzi claytrona, ponieważ przechwytywanie interpunkcji tylko po to, aby ją później wyrzucić było zbędne, a następnie dodałem przykład, jak ulepszyć to wyrażenie, jeśli chce się usunąć całą interpunkcję Z WYJĄTKIEM określonej postaci ... coś to może być całkiem przydatne. Żadna z nich nie wydaje mi się zupełnie inną odpowiedzią, więc nie wydaje się słuszne, aby ją opublikować jako taką. –

0

Używaj 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> 

...