我在获取正确标记的简单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,但我真的不认为这对答案有很大影响.
使用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)
| 归档时间: |
|
| 查看次数: |
2095 次 |
| 最近记录: |