5 votes

Quel analyseur dois-je utiliser pour une URL dans lucene.net ?

J'ai du mal à faire en sorte qu'une simple URL soit correctement tokenisée afin que vous puissiez la rechercher comme prévu.

J'indexe " http://news.bbc.co.uk/sport1/hi/football/internationals/8196322.stm "avec le StandardAnalyzer et il tokenise la chaîne comme suit (sortie de débogage) :

(http,0,4,type=<ALPHANUM>)
(news.bbc.co.uk,7,21,type=<HOST>)
(sport1/hi,22,31,type=<NUM>)
(football,32,40,type=<ALPHANUM>)
(internationals/8196322.stm,41,67,type=<NUM>)

En général, tout semble correct, le http lui-même, puis le nom d'hôte, mais le problème semble venir des barres obliques. Il faut les considérer comme des mots séparés.

Que dois-je faire pour corriger cela ?

Merci

P.S. J'utilise Lucene.NET mais je ne pense pas que cela fasse une grande différence en ce qui concerne les réponses.

5voto

Joel Points 11003

Le StandardAnalyzer, qui utilise le StandardTokenizer, ne tokenise pas les urls (bien qu'il reconnaisse les emails et les traite comme un seul token). Ce que vous voyez est son comportement par défaut - la division sur divers caractères de ponctuation. La solution la plus simple serait d'utiliser un analyseur personnalisé et de fournir un UrlTokenizer, qui étend/modifie le code de StandardTokenizer, pour tokeniser les URLs. Quelque chose comme :

public class MyAnalyzer extends Analyzer {

public MyAnalyzer() {
    super();
}

public TokenStream tokenStream(String fieldName, Reader reader) {
    TokenStream result = new MyUrlTokenizer(reader);
    result = new LowerCaseFilter(result);
    result = new StopFilter(result);
    result = new SynonymFilter(result);

    return result;
}

}

Où l'URLTokenizer se divise sur /, - _ et tout ce que vous voulez. Nutch a peut-être aussi du code pertinent, mais je ne sais pas s'il existe une version .NET.

Notez que si vous avez un fieldName distinct pour les urls, vous pouvez modifier le code ci-dessus pour utiliser le StandardTokenizer par défaut, sinon utilisez le UrlTokenizer.

par exemple

public TokenStream tokenStream(String fieldName, Reader reader) {
    TokenStream result = null;
            if (fieldName.equals("url")) {
                  result = new MyUrlTokenizer(reader);
            } else {
                  result = new StandardTokenizer(reader);
            }

1voto

Jonathan Feinberg Points 24791

Vous devriez analyser l'URL vous-même (j'imagine qu'il existe au moins une classe .Net capable d'analyser une chaîne d'URL et d'en extraire les différents éléments), puis ajouter ces éléments (comme l'hôte, ou tout autre élément sur lequel vous souhaitez filtrer) en tant que mots-clés ; ne les analysez pas du tout.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X