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

Joh*_*hn_ 5 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>)
Run Code Online (Sandbox Code Playgroud)

一般来说它看起来不错,http本身,然后主机名,但问题似乎与正斜杠.当然它应该把它们视为单独的词?

我需要做些什么才能纠正这个问题?

谢谢

PS我正在使用Lucene.NET,但我真的不认为这对答案有很大影响.

Joe*_*oel 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;
}
Run Code Online (Sandbox Code Playgroud)

}

URLTokenizer在/, - _以及您想要的任何其他内容上分割的位置.Nutch也可能有一些相关的代码,但我不知道是否有.NET版本.

请注意,如果您为网址设置了明确的fieldName,则可以修改上述代码,默认情况下使用StandardTokenizer,否则使用UrlTokenizer.

例如

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