PHP / MySQL küçük ölçekli bulanık arama

2 Cevap php

Ben küçük bir PHP / MySQL uygulama için bulanık arama uygulamak için arıyorum. Özellikle, ben yaklaşık 2400 kayıtları ile bir veritabanı var (yaklaşık 600 yılda bir oranda katma kayıtları, bu yüzden small veritabanı bulunuyor). Ilgi alanları, üç sokak adresi, soyadı ve tarih vardır. Ben bu alanlardan birine göre arama yapabilmek istiyorum, ve aslında yazım / karakter hataları için hoşgörü var. yani, "123 Main Street" bir adresi de vs "123 Main St", "123 Main St", "123 Mian St", "123 Adam St", "132 Main St", maç ve aynı şekilde adı olmalıdır ve tarih.

Ben diğer benzer soruların cevapları ile sahip ana konular:

  • Bu, mümkün olan her yanlış yazım için eş tanımlamak tarihler ve isimler için bunu yaparken unutmak imkansız.
  • Vb lucene, böyle sınırlı bir arama veri seti (5.000 kayıtları, kayıt başına 3 alanda maksimum diyoruz) için çok ağır görünüyor.
  • Sadece joker ile bir şey yapıyor olası yazım hataları ile tüm mantıklı görünmüyor.

Herhangi bir öneriniz? Ben MySQL ile doğal yapmak mümkün olacak değil biliyorum, ama veri seti öylesine sınırlı olduğundan, ben nispeten basit ... alır belki bir PHP sınıfı all tutmak istiyorum DB kayıtları karşılaştırma algoritması çeşit kullanır, ve benzeri kayıtların kimliklerini verir?

Thanks, Jason

2 Cevap

Razzie cevabı (veya Damerau-Levenshtein kullanarak) arama anahtarı kendi yakınlığı göre maçları aday listesi yer alıyor. (Dikkat: anahtar "12 Main St" ise o zaman "13 Main St" "12 Moin St" olarak aynı yazarak mesafe vardır ama, onu dışlamak hatta düşük ya da rütbe isteyebilirsiniz 11 ve 22 Main St gibi vs)

Ama nasıl rütbe yönetilebilir büyüklükte bir aday listesini seçerim?

Bir yolu aramak için gidiyoruz dizeleri her sözcük için (çift metaphone kullanarak, ya da değerleri) metaphone değerini hesaplamak için. Özgün dize içeren satır kimliği ile başka bir tabloda bu metaphones her kaydedin. Daha sonra anahtar arama metinden bir kelimenin metaphone gibi 'anahtar'% ile hızlı bir şekilde bu metaphone değerleri arayabilirsiniz.

Üzerinde önerilen cevabı kontrol this thread. Oldukça tertipli ve büyük olmadığını veritabanları için güzel çalışması gerekir.

Bu çok küçük bir veritabanı ise, could defada tüm verileri yüklemek ve arama için Jaro-Winkler gibi bir algoritma kullanır. Onlar here bulabileceğiniz PHP bir uygulama var.

Gerçekten iyi çalışıyor imho. Bir örnek uygulama bir göz atın here. Ben, arama aynı algoritmayı kullanır biliyorum, ve çok iyi 'Nintedno' bulabilirsiniz. Ayrıca en iyi sorgusuna neden olan dayalı sizin için sonuçları, sıralar.