Gereksinimler: Sitede tam metin arama yaygın kullanılan bir fonksiyondur ve bu fonksiyon buna dayanarak yaygın olarak kullanılırElasticSearch、SolrDağıtım ve geliştirme, şimdi ise iki yeni ürün yayınlandıRedisSearch、MeiliSearchArama motoru ile ilk ikisi daha ağır, son ikisi ise ilk ikisi kadar ağır olmasa da yine de bağımlı hizmetler sunması gerekiyor; bu makale Lucene.Net + Jieba.NET kullanarak hafif bir site içi arama oluşturuyor.
Lucene.Net
Lucene.Net, Lucene'nin .NET portudur ve açık kaynaklı tam metin arama motoru geliştirme kitidir; yani tam metin bir arama motoru değil, tam bir sorgu motoru ve indeksleme motoru sağlayan tam metin bir arama motoru mimarisidir.
Site:Bağlantı girişi görünür. GitHub adresi:Bağlantı girişi görünür.
Jieba.NET
Jieba.NET, Çin jieba dacımlı bir kelimedir. .NET sürümü (C# uygulaması). Çince metni için kelime segmentasyonu, konuşma kısmı açıklaması, anahtar kelime çıkarımı gibi işlevleri yerine getirebilir ve özel sözlükleri destekler.
GitHub adresi:Bağlantı girişi görünür.
Öncelikle, renderlere bir göz atalım:
Analizörü Özelleştirin
Lucene TokenStream'te Analyzer, TokenStream, Tokenizer, TokenFilterTokenStream: Tokenizer işlendikten sonra elde edilen bir akış. Bu akış, TokenStream aracılığıyla etkili şekilde elde edilebilen kelime segmentasyonu hakkında çeşitli bilgileri saklar. Aşağıda, dosya akışını TokenStream'e dönüştürme süreci verilmiştir. Önce kelimeleri segmentlere ayırmak için Tokenizer kullanın, farklı tokenizer'ların farklı tokenzier'ları vardır, tokenzier ayrıldıktan sonra TokenFilter üzerinden kelimelere bölünmüş verileri, örneğin stop kelimelerini filtreleyin. Filtreleme yaptıktan sonra tüm verileri bir TokenStream'te birleştirin.
Referans:
Bağlantı girişi görünür.
Bağlantı girişi görünür.
Bağlantı girişi görünür.
Lucene analizörünü Jieba.NET temelinde özelleştirmek için ilk referans şöyledir:
Lucene.Net.Analysis.Common paketine doğrudan başvurun; çünkü Lucene.Net.Analysis.Common Lucene.Net paketinin otomatik olarak indirilmesine dayanır.
Aşağıdaki kodla yeni bir JiebaTokenizer.cs oluşturun:
Aşağıdaki kodla yeni bir JiebaAnalyzer.cs oluşturun:
Lucene.Net Yeni belgeler ve aramalar oluşturun
Bir web sitesinden Lucene'e düzenli veya tetiklenen veriler eklenir ve Lucene belgeyi analizör aracılığıyla fiziksel bir diskte saklar, ardından arama arayüzünü çağırarak onu bulur.
LuceneHelper yardım sınıfı kodu şu şekildedir:
Depo depolama
Store.YES: Sadece verileri indekslemekle kalmaz, aynı zamanda verileri de kaydeder, böylece arama sonuçları alan bilgilerini geri döndürebilir. Store.NO: Sadece veriler indekslenir, veri kaydedilmez ve arama sonuçları bu alan bilgisini elde edemez.Disk alanı tasarrufu sağlar;
Aşağıda gösterildiği gibi:
Alan alanı tipi
Lucene.Net'daki alan türleri şunlardır: Int32Field, Int64Field, SingleField, DoubleField, BinaryDocValuesField, NumericDocValuesField, SortedDocValuesField, StringField, TextField, StoredField, Lütfen durumunuza göre uygun veri türünü kullanın.
TextField vs. StringField
TextField kesinlikle sözcükleştirilecek, StringField doc'ta depolanan içeriğin sözcek analizini yapmaz, bkâh:Bağlantı girişi görünür.
Bileşik araması
Aşağıdakilerin 6 kombinasyonu vardır:
1. GEREKLİ ve GEREKLİSİ: Ardışık sorgu maddelerinin kesişimini edinin. 2. MUST ve MUST_NOT: MUST_NOT ile ilgili sorgu maddesinin arama sonuçlarının sorgu sonuçlarına dahil edilemeyeceğini gösterir. 3.SHOULD ve MUST_NOT: Sürekli kullanıldığında, fonksiyon MUST ve MUST_NOT ile aynıdır. 4. SHOULD ve MUST birlikte kullanıldığında, sonuç MUST maddesinin arama sonucu olur, ancak SHOULD sıralamayı etkileyebilir. 5. SHOULD ve SHOULD: "ve" arasındaki ilişkiyi gösterir ve nihai arama sonucu tüm arama maddelerinin birleşimidir. 6.MUST_NOT ve MUST_NOT: anlamsız, sonuçsuz geri getirme.
Projeyi yürütmek
Bu noktada, arayüz kodunu eklemek, güncellemek ve aramak için projeye aşağıdaki şekilde başlayabilirsiniz:
Hatalar aşağıdaki şekilde bildirilebilir:
Talep işlenirken yönetilmeyen bir istisna meydana geldi.
DirectoryNotFoundException: Could not find a part of the path 'C:\Users\itsvse_nuc11\source\repos\DiscuzSearch\DiscuzSearch\bin\Debug\net6.0\Resources\prob_trans.json'. Microsoft.Win32.SafeHandles.SafeFileHandle.CreateFile(string fullPath, FileMode mode, FileAccess erişimi, FileShare paylaşımı, FileOptions seçenekleri)
TypeInitializationException: The type initializer for 'JiebaNet.Segmenter.JiebaSegmenter' threw an exception. jieba.net Kurulumdan sonra, packages\jieba.NET dizininde Resources dizinini görebilirsiniz; bu dizin, jieba.NET çalıştırmak için gereken sözlük ve diğer veri dosyalarını içerir; en kolay yapılandırma yöntemi, tüm Resources dizinini assemble'in bulunduğu dizine kopyalamaktır; böylece yerleşik varsayılan yapılandırma değerleri jieba.NET kullanılır.
C:\Users\%USERPROFILE%\.nuget\packages\jieba.net\0.42.2\Resources JiebaNet'in bir yapılandırma klasörü eklemesi gerekiyor, kod şu şekildedir:
Test 500 yeni belge oluşturdu (sadece referans olarak, gerçek durumumla ilgili) ve disk aşağıdaki şekilde gösterildiği gibi 119KB yer kaplıyor:
(Son)
|