質問

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);

他のヒント

あなたの解決策があるようですが、私の場合はこれを回避し、インデックスを作成しているドキュメントに email_domain というフィールドを追加し、そこに電子メール アドレスの解析されたドメインを追加することになります。ばかげているように聞こえるかもしれませんが、これに関連するストレージの量は非常に最小限です。もっと凝ったことをしたい場合は、たとえば、あるドメインに多くのサブドメインがあった場合は、代わりに逆引きされたドメインが入るフィールドを作成して、com.gmail、com.company.Department、または ae.eim を保存して検索できるようにすることもできます。プレフィックス クエリ「ae」を持つアラブ首長国連邦関連のすべてのアドレス。

もあります setAllowLeadingWildcard

でもそうであってください 注意深い. 。これにより、パフォーマンスが非常に高くなる可能性があります (そのため、デフォルトでは無効になっています)。場合によってはこれが簡単な解決策になるかもしれませんが、私は次のようにカスタム Tokenizer を使用することを好みます。 ジュダ・ヒマンゴ, 、 あまりにも。

電子メール アドレスを逆にインデックス化する別のフィールドを作成できます。「moc.liamg@*」のクエリを行うことを可能にする「moc.liamg@oof」としてのindex 'foo@gmail.com'

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top