在Lucene.NET中正确标记电子邮件,并且仍然可以将其全文搜索

时间:2019-07-09 19:16:24

标签: c# lucene.net

我已经摆弄和摆弄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错误的东西。

0 个答案:

没有答案