.net - 使用 Lucene 搜索电子邮件地址

标签 .net search lucene

我想使用 Lucene(特别是 Lucene.NET)来搜索电子邮件地址域。

例如。我想搜索“@gmail.com”以查找发送到 Gmail 地址的所有电子邮件。

对“*@gmail.com”运行 Lucene 查询会导致错误,星号不能位于查询的开头。运行对“@gmail.com”的查询不会返回任何匹配项,因为“foo@gmail.com”被视为一个完整的词,您不能只搜索词的一部分。

我怎样才能做到这一点?

最佳答案

没有人给出满意的答案,所以我们开始浏览 Lucene 文档并发现我们可以使用自定义分析器和标记器来实现这一点。

答案是这样的:创建一个 WhitespaceAndAtSymbolTokenizer 和一个 WhitespaceAndAtSymbolAnalyzer,然后使用这个分析器重新创建你的索引。执行此操作后,搜索“@gmail.com”将返回所有 gmail 地址,因为由于我们刚刚创建的 Tokenizer,它被视为一个单独的词。

这是源代码,它实际上很简单:

class WhitespaceAndAtSymbolTokenizer : CharTokenizer
{
    public WhitespaceAndAtSymbolTokenizer(TextReader input)
        : base(input)
    {
    }

    protected override bool IsTokenChar(char c)
    {
        // Make whitespace characters and the @ symbol be indicators of new words.
        return !(char.IsWhiteSpace(c) || c == '@');
    }
}


internal class WhitespaceAndAtSymbolAnalyzer : Analyzer
{
    public override TokenStream TokenStream(string fieldName, TextReader reader)
    {
        return new WhitespaceAndAtSymbolTokenizer(reader);
    }
}

就是这样!现在您只需要重建索引并使用这个新的分析器进行所有搜索。例如,要将文档写入索引:
IndexWriter index = new IndexWriter(indexDirectory, new WhitespaceAndAtSymbolAnalyzer());
index.AddDocument(myDocument);

执行搜索也应该使用分析器:
IndexSearcher searcher = new IndexSearcher(indexDirectory);
Query query = new QueryParser("TheFieldNameToSearch", new WhitespaceAndAtSymbolAnalyzer()).Parse("@gmail.com");
Hits hits = query.Search(query);

关于.net - 使用 Lucene 搜索电子邮件地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19014/

相关文章:

c# - dapper:使用 QueryMultiple 同时获取结果和计数

c# - LINQ:基于子列表中的属性分组

.net - 关闭另一个表单后刷新列表框

android - 如何实现带有搜索框的对话框?

php - SQL 左连接 - 右表中的多行

elasticsearch - 如何实现Elasticsearch分片大小的自动控制?

c# - 如何将用作按钮的禁用 PictureBox 变灰?

exception - LdapConnection SearchRequest 抛出对象不存在错误

java - Cloudant 与 Lucene 搜索无法按预期排序

search - 如果在 lucene 搜索中包含单个搜索词字段,如何排除该项目?