我正在使用Lucene.Net 2.9.2并且我认为我需要编写一个自定义标记器,但我想检查一下我是否遗漏了一些明显的东西。
该文档由标题,关键字和内容以及一些元数据(如作者,日期等)组成,每个元数据都存储为字段。这些文件是软件技术文件,可能在标题,关键字和/或内容中包含诸如“.Net”,“C ++”,“C#”等短语。
我正在使用关键字字段的KeywordAnalyzer和标题和内容的StandardAnalyzer - StopWords和LowerCase等是必要的,因为文档可能很长。
我还为搜索编写了一个同义词自定义过滤器,例如,我想搜索“C#”,但也识别'CSharp','C#.Net'等。令牌化器已经删除了'#' 'C#'或来自C ++的'++',因此可能与'C'语言参考混淆
我的想法是,当我为标题和内容编制索引时,我需要根据当前标记是关键字短语的一部分还是其任何同义词来分支标记化。
这是最好的方法吗?非常感谢提前:))
答案 0 :(得分:2)
可以使用下面提到的类之一来完成tokenizer的自定义:
1)。 Lucene.Net.Analysis.CharTokenizer 2)。 Lucene.Net.Analysis.Tokenizer
public class AlphaNumbericTokenizer : Lucene.Net.Analysis.CharTokenizer
{
public AlphaNumbericTokenizer (System.IO.TextReader input) : base(input)
{
}
protected override bool IsTokenChar(char c)
{
//TODO: Logic for identifying token or token separator
return char.IsLetterOrDigit(c);
}
}
答案 1 :(得分:1)
我认为您可以使用WhitespaceTokenizer
,然后插入KeywordMarkerFilter
将某些令牌标记为“不可侵犯”,最后提供自己的过滤器来删除标点字符。也许知道Lucene.Net的人会提出一些建议;例如在Solr WordDelimiterFilter
中可以使用。