我已经摆弄和摆弄Lucene.NET已有一段时间了,我似乎根本无法以自己想要的方式获得过滤器。我需要做的主要事情是,在建立索引时,我希望将单词拆分,同时还要在索引中包含完整的单词(我认为可以使用WordDelimiterFlags.PRESERVE_ORIGINAL
完成此操作,但是我将向您展示一秒钟),然后能够搜索这些单词,特别是我希望能够将电子邮件作为输入的完整电子邮件进行搜索。
我目前有两个使用的自定义分析器:
索引时:
public class MultiStageIndexAnalyzer : Analyzer
{
protected override TokenStreamComponents CreateComponents(string fieldName, TextReader reader)
{
var tokenizer = new WhitespaceTokenizer(LuceneVersion.LUCENE_48, reader);
var lowercaseFilter = new LowerCaseFilter(LuceneVersion.LUCENE_48, tokenizer);
var lowerAndDelimited = new WordDelimiterFilter(LuceneVersion.LUCENE_48, lowercaseFilter, WordDelimiterFlags.PRESERVE_ORIGINAL, null);
return new TokenStreamComponents(tokenizer, lowerAndDelimited);
}
}
搜索电子邮件时:
public class CaseInsensitiveWhitespaceAnalyzer : Analyzer
{
protected override TokenStreamComponents CreateComponents(string fieldName, TextReader reader)
{
var tokenizer = new WhitespaceTokenizer(LuceneVersion.LUCENE_48, reader);
var lowercaseFilter = new LowerCaseFilter(LuceneVersion.LUCENE_48, tokenizer);
return new TokenStreamComponents(tokenizer, lowercaseFilter);
}
}
我尝试了几种不同的WordDelimiterFlags
,但它们似乎都没有达到我想要的效果。如果电子邮件是“ test@email.com”,我发现的设置似乎只会将其拆分为“ test email com”一词,这意味着如果我尝试搜索未找到的完整电子邮件,或者只会保留电子邮件整体为“ test@email.com”,如果我搜索“电子邮件”,则找不到它。
我不确定是否可以显示更多内容,但这是创建索引的地方:
Analyzer analyzer = new MultiStageIndexAnalyzer();
var config = new IndexWriterConfig(Lucene.Net.Util.LuceneVersion.LUCENE_48, analyzer);
_indexWriter = new IndexWriter(dir, config);
这是完成搜索的地方:
var emailAnalyzer = new EmailOnlyAnalyzer();
MultiFieldQueryParser emailParser = new MultiFieldQueryParser(
LuceneVersion.LUCENE_48,
new[] { "EmailTo", "EmailFrom", "EmailCC" }, emailAnalyzer)
{
DefaultOperator = QueryParser.AND_OPERATOR,
AllowLeadingWildcard = true
};
var emailquery = emailParser.Parse(email);
TopFieldCollector emailcollector = TopFieldCollector.Create(Sort.RELEVANCE, 100000, true, true, true, true);
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
IndexSearcher indexEmailSearcher = new IndexSearcher(indexEmailReader);
indexEmailSearcher.Search(emailquery, emailcollector);
让我知道是否可以添加其他内容以使此内容更加清晰。我只是不确定是否遗漏了某些东西,或者是否使用了WordDelimiterFilter
错误的东西。