5

我在获取正确标记化的简单 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 本身,然后是主机名,但问题似乎与正斜杠有关。当然它应该将它们视为单独的词吗?

我需要做什么来纠正这个问题?

谢谢

PS我正在使用Lucene.NET,但我真的认为它对答案没有太大影响。

4

2 回答 2

5

使用 StandardTokenizer 的 StandardAnalyzer 不标记 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 版本。

请注意,如果您有一个不同的 url 字段名称,那么您可以修改上面的代码,默认使用 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);
            }
于 2009-12-03T17:13:15.517 回答
1

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

于 2009-12-03T17:09:30.207 回答