İhtiyacınız olanın tüm ayrıntılarını bilmeden, muhtemelen aşağıdakilerden birini yapmak istersiniz:
Sfenks kurulum ve konfigürasyonunun neleri içerdiğini tam olarak bilmiyorum; ancak, bir veritabanına işaret edebilir, hangi alanların dizine ekleneceğini, sonuçların nasıl ağırlıklandırılacağını ve size eşleşen kayıtların sıralı bir listesini verecek bir izlenim altındayım.
Kullanıcı açısından veya görev açısından kritik öneme sahip şeyler için mevcut bir arama aracını kullanın.
Sadece akademik hissediyorsanız ... Ngramlarla oynayın:
Bir ngram arama tablosu, ilk olası eşleşmeler kümeniz olarak kullanılabilir ve sonuçları budamak ve sıralamak için Levenshtein mesafelerini kullanabilirsiniz.
Aramak istediğinizi varsayarsak people
, aşağıdakine benzer bir şey yapabilirsiniz:
_ people _________
personId: int
name: varchar
soundex_name: varchar
_ people_ngrams __
personId: int
ngramId: int
_ ngrams _________
ngramId: int
ngram: char(3)
count: int
Ngramlarınızı periyodik olarak yeniden oluşturabilir veya anında oluşturabilirsiniz. Her iki durumda da, basit, naif bir arama algoritması şöyle görünebilir:
search_ngrams = ngrammify(soundex(search_string));
notable_ngrams = select top 10 *
from ngrams
where ngram in (search_ngrams)
order by count asc;
possible_matches = select top 1000 distinct people.*
from people_ngrams, people
where ngramId in (notable_ngrams);
best_matches = top 100 possible_matches
ordered by Levenshtein_distance(match, soundex(search_string));
Buna oldukça benzer bir şey kullanarak (ancak biraz daha fazla "popülerlik" ayarlaması, kara listeler, beyaz listeler vb.), Bu tür bir algoritmanın veri kümeleri arasında kayıtları toplu olarak birleştirdiğini ve özel bulanık aramayı kolaylaştırdığını gördüm yardımcı programlar ve devam eden kayıtların çoğaltılması çabaları.
Şimdi, benim durumumda, milyonlarca kayıtla eşleşmiyordum, her biri yüzbinlerce kayıt sırasına göre iki veri kümesi arasında mümkün olan en iyi birleştirmeyi seçmeye çalışıyordum. Birkaç dakika içinde oldukça hızlı bir şekilde çalışmasını istedik. (Çabuk, 100.000 * 100.000 nedir?) Ve başarılı olduk.
Yani, doğru ayar ile, bu tür şeyler çabuk ve etkili olabilir. Sonuçta, mütevazi, tarihli, çift çekirdekli bir makinede birkaç dakika içinde birleştirilmiş bir set üretebildik, "sorgulanabilir" birleştirmeler manuel inceleme için otomatik olarak işaretlendi. Ancak, ngram popülerliğini / alaka düzeyini tatlı noktayı ve doğru dize mesafe eşiklerini, kara listeleri ve beyaz listeleri bulmak vb. Çok zaman aldı.
DEDİ , gerçekten bu şeyler üzerinde çalışan bir delik içine emilir. Gerçek dünyadaki üretim düzeyindeki her şey için, genellikle bu tür aramalar için zaten yapılmış ve optimize edilmiş iyi yapılandırılmış bir araç kullanmalısınız .
Gibi Sfenks veya Lucene .