Lucene.NET ile E-Posta Adresi Alanlarını Arama Yöntemleri

Lucene.NET kullanarak e-posta adreslerini aramak, arama sisteminin dizeleri yorumlama biçimi nedeniyle biraz zorlu olabilir. Belirli bir e-posta alanını (örneğin @gmail.com) aramaya çalıştıysanız ve hatalar veya sonuçsuz kaldıysanız, hiç merak etmeyin; yalnız değilsiniz. Bu blog yazısı, e-posta adreslerini etkili bir şekilde sorgulamanıza yardımcı olan özel bir arama çözümü oluşturma sürecini anlatacaktır.

Sorun

Lucene.NET üzerinde e-posta adreslerini aramaya çalışırken aşağıdaki sorunlarla karşılaşabilirsiniz:

  • Yıldız İşareti Hatası: *@gmail.com gibi bir joker karakter sorgusu kullanmak hata verir; çünkü yıldız işaretleri bir sorguya başlayamaz.
  • Tam Kelime Arama Sınırlamaları: @gmail.com ile doğrudan bir arama sorgusu çalıştırmak, foo@gmail.com gibi e-posta adreslerine sonuç döndürmez, çünkü sözel aramalar genellikle bunu tam bir kelime olarak ele alır.

Bu sınırlamalar, özellikle alan adlarıyla özel olarak arama yapmak istediğinizde sinir bozucu olabilir.

Çözüm

Bu sorunu çözmek için Lucene‘in e-posta adreslerini analiz etme ve tokenlama yöntemini özelleştirebiliriz. Bu, iki bileşen oluşturmaya dahildir:

  1. Tokenlayıcı: Metni kriterlere dayalı olarak tokenlara ayıran özel bir davranış.
  2. Analizör: Tokenlayıcıyı kullanarak indeksleme için bir token akışı oluşturma.

Adım 1: Özel Tokenlayıcı Oluşturma

WhitespaceAndAtSymbolTokenizer adlı özel bir tokenlayıcı oluşturarak başlayacağız. Bu tokenlayıcı, hem boşlukları hem de @ simgesini yeni kelimelerin göstericisi olarak kabul edecek, bu da bize e-posta adreslerini daha etkili bir şekilde ayırma olanağı tanıyacak.

İşte özel tokenlayıcınız için kaynak kodu:

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

    protected override bool IsTokenChar(char c)
    {
        // Boşluk karakterlerini ve @ simgesini yeni kelimelerin göstergeleri olarak kabul et.
        return !(char.IsWhiteSpace(c) || c == '@');
    }
}

Adım 2: Özel Analizör Oluşturma

Sonraki adımda, özel tokenlayıcımızı kullanan WhitespaceAndAtSymbolAnalyzer‘ı uygulayacağız:

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

Adım 3: İndeksi Yeniden Oluşturma

Özel tokenlayıcı ve analizörü kurduktan sonra, yeni analizörü kullanarak indeksinizi yeniden oluşturmanız gerekecek. Bunu nasıl yapabileceğinizi aşağıda bulabilirsiniz:

IndexWriter index = new IndexWriter(indexDirectory, new WhitespaceAndAtSymbolAnalyzer());
index.AddDocument(myDocument);

Adım 4: Arama Gerçekleştirme

Arama yaparken, özel analizörü de kullandığınızdan emin olun. Analizörü kullanarak sorgulama yapmanın basit bir kod örneği aşağıda verilmiştir:

IndexSearcher searcher = new IndexSearcher(indexDirectory);
Query query = new QueryParser("TheFieldNameToSearch", new WhitespaceAndAtSymbolAnalyzer()).Parse("@gmail.com");
Hits hits = query.Search(query);

Sonuç

WhitespaceAndAtSymbolTokenizer ve WhitespaceAndAtSymbolAnalyzer‘ı kullanarak, Lucene.NET içinde e-posta adresi alanlarını etkili bir şekilde arayabilirsiniz. Bu çözüm, yalnızca @gmail.com için arama yapma sorununu çözmekle kalmaz; aynı zamanda gelecekte e-posta alanı aramalarınızı ölçeklendirmek için sağlam bir temel oluşturur.


Özel tokenizasyonu etkili arama stratejileriyle birleştirmek, uygulamalarınızda önemli bir fark yaratabilir. Eğer Lucene.NET uygulamanız ile ilgili herhangi bir sorunuz varsa ya da yardıma ihtiyacınız olursa, lütfen aşağıdaki yorumlarda bize ulaşmaktan çekinmeyin!