Какой анализатор я должен использовать для URL в lucene.net? - PullRequest
5 голосов
/ 03 декабря 2009

У меня проблемы с получением простого URL для правильного токенизации, чтобы вы могли искать его, как и ожидалось.

Я индексирую "http://news.bbc.co.uk/sport1/hi/football/internationals/8196322.stm" с помощью StandardAnalyzer, и он маркирует строку следующим образом (вывод отладки):

(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>)

В целом все выглядит хорошо, само http, затем имя хоста, но проблема, похоже, связана с косой чертой. Конечно, это должно рассматривать их как отдельные слова?

Что мне нужно сделать, чтобы исправить это?

Спасибо

P.S. Я использую Lucene.NET, но я действительно не думаю, что это имеет большое значение в отношении ответов.

Ответы [ 2 ]

5 голосов
/ 03 декабря 2009

StandardAnalyzer, который использует StandardTokenizer, не маркирует URL-адреса (хотя он распознает электронные письма и обрабатывает их как один токен). То, что вы видите, это поведение по умолчанию - разделение на знаки препинания. Самое простое решение может заключаться в использовании специального анализатора и предоставлении UrlTokenizer, который расширяет / изменяет код в StandardTokenizer, для токенизации URL-адресов. Что-то вроде:

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;
}

}

Где URLTokenizer разделяется на /, - _ и все, что вы хотите. Nutch может также иметь некоторый соответствующий код, но я не знаю, есть ли версия .NET.

Обратите внимание, что если у вас есть отдельное поле fieldName для URL-адресов, вы можете изменить приведенный выше код, используя StandardTokenizer по умолчанию, иначе используйте UrlTokenizer.

1010 *, например *

public TokenStream tokenStream(String fieldName, Reader reader) {
    TokenStream result = null;
            if (fieldName.equals("url")) {
                  result = new MyUrlTokenizer(reader);
            } else {
                  result = new StandardTokenizer(reader);
            }
1 голос
/ 03 декабря 2009

Вы должны проанализировать URL-адрес самостоятельно (я думаю, что есть хотя бы один класс .Net, который может анализировать строку URL-адреса и выявлять различные элементы), а затем добавить эти элементы (например, хост или что-то еще, что вас интересует) в фильтрации по) как ключевые слова; не анализировать их вообще.

...