我在获取正确的标记化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,但我真的不认为这对答案有很大影响。
答案 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字符串并梳理出不同的元素),然后添加这些元素(例如主机或其他您感兴趣的内容)在过滤上)作为关键词;不要分析它们。