我应该在lucene.net中使用什么分析器来获取URL?

时间:2009-12-03 17:01:03

标签: lucene analyzer

我在获取正确的标记化URL时遇到问题,以便您可以按预期进行搜索。

我正在使用StandardAnalyzer索引“http://news.bbc.co.uk/sport1/hi/football/internationals/8196322.stm”并将字符串标记为以下内容(调试输出):

(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 个答案:

答案 0 :(得分:5)

使用StandardTokenizer的StandardAnalyzer不会对网址进行标记(尽管它会识别电子邮件并将其视为一个标记)。你看到的是它的默认行为 - 分裂各种标点字符。最简单的解决方案可能是使用编写自定义分析器并提供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,则可以修改上述代码,默认情况下使用StandardTokenizer,否则请使用UrlTokenizer。

e.g。

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

答案 1 :(得分:1)

您应该自己解析URL(我想至少有一个.Net类可以解析URL字符串并梳理出不同的元素),然后添加这些元素(例如主机或其他您感兴趣的内容)在过滤上)作为关键词;不要分析它们。