2010-06-30 2 views
5

Je rencontre un problème avec la ponctuation de striping de l'index solr Lorsque le signe de ponctuation suit juste après un mot, ce mot n'est pas correctement indexé. Par exemple: si nous indexons "bonjour, John", l'actif ne sera pas trouvé par le mot clé "bonjour" alors qu'il n'y aura pas de problème si nous enlevons la virgule après le mot "bonjour".Solr: dépouiller la ponctuation avant l'index

Y a-t-il une FilterFactory supposée supprimer la ponctuation? Des idées?

Merci, Bogdan.

Répondre

6

Ceci est fait avec WordDelimiterFilterFactory. Définissez generateWordParts = 1.

Il ya aussi le PatternTokenizerFactory qui pourrait être utilisé, mais je ne l'ai jamais essayé.

+0

Pour les personnes avec des cas de pointe comme le mien: Les generateWordParts = 1 normalement travailler, mais si vous faites ce que je fais, ce ne sera pas: J'utilise le attribut 'types' de WDFF à mapper. et $ à ALPHA, de sorte que je puisse correspondre à des termes comme «10,00 $». Cela a l'effet secondaire négatif d'inclure des périodes de préfixe et de suffixe dans le mot. Donc, dans mon cas, la réponse par @claytron peut être un meilleur ajustement. –

6

Vous pouvez utiliser le solr.PatternReplaceFilterFactory pour dépouiller début et ponctuation finale avec ceci:

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

Et si vous vouliez dépouiller tous les signes de ponctuation au début et à la fin, à l'exception (par exemple) le signe dollar devant d'un mot, vous pouvez utiliser ceci:

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

Je crois que l'édition de Mason a changé cette réponse trop radicalement. Il aurait dû ajouter une autre réponse. – CorayThan

+0

@CorayThan Comment est-ce trop radical d'un changement? J'ai légèrement modifié la regex sur la réponse originale d'Claytron, car capturer la ponctuation pour la jeter plus tard est inutile, puis ajouter un exemple de comment modifier cette regex si l'on veut supprimer toute ponctuation SAUF pour un caractère spécifique ... Cela pourrait être très utile. Ni l'un ni l'autre ne me paraissent une réponse complètement différente, il ne me semble donc pas correct de l'afficher comme tel. –

0

utilisez 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> 

...

Questions connexes