2009-12-16 19 views
5

Küçük bir PHP/MySQL uygulaması için bulanık arama uygulamak arıyorum. Spesifik olarak, yaklaşık 2400 kayıt içeren bir veritabanım var (kayıtlar yılda yaklaşık 600 oranında eklendi, bu yüzden küçük veritabanı). İlgilenilen üç alan sokak adresi, soyadı ve tarihi. Bu alanlardan biriyle arama yapabilmek ve aslında yazım/karakter hataları için hoşgörülü olmak istiyorum. yani, "123 Ana Cadde" nin bir adresi de "123 Main St", "123 Main St", "123 Mian St", "123 Man St", "132 Main St" vb. ve tarih.PHP/MySQL küçük ölçekli bulanık arama

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

  • Her olası yanlış yazım için eş anlamlılarını tanımlamak imkansız, tarihlerini ve adları için bunu yaparken unutmak.
  • Lucene, vb. Sınırlı bir arama verisi seti için çok ağır gözüküyor (bunu en fazla 5,000 kayıt, kayıt başına 3 alan olarak adlandırın).
  • Sadece joker karakterlerle ilgili bir şey yapmak, olası tüm yazım hatalarıyla mantıklı görünmemektedir.

Herhangi bir öneriniz var mı? MySQL ile yerel olarak yapmanın mümkün olmayacağını biliyorum, ancak veri seti o kadar sınırlı olduğundan, göreceli olarak basit bir şekilde tutmak istiyorum ... belki de kayıtlardan oluşan bir PHP sınıfı DB, bir çeşit karşılaştırma algoritması kullanır ve benzer kayıtların kimliklerini döndürür?

sayesinde Jason

cevap

7

Razzie'nin cevabı (veya Damerau–Levenshtein kullanarak), adayların listesini, arama anahtarına yakınlıklarına göre sıralar. (Kendinize iyi bakın: eğer anahtar "12 Main St" ise "13 Main St" ise "12 Moin St" ile aynı yazma mesafesine sahiptir ancak 11 ve 22 Main St gibi düşük veya hatta hariç tutmak isteyebilirsiniz. etc.)

Ancak, sıralanacak yönetilebilir bir boyuttaki adayların listesini nasıl seçersiniz?

Tek yapmanız gereken, arama yapacağınız dizelerdeki her sözcük için metafon değerini (veya çift metafonu kullanarak değerleri) hesaplamaktır. Bu meta telefonların her birini, orijinal dizeyi içeren satırın kimliğiyle başka bir tabloya kaydedin. Daha sonra bu meta telefon değerlerini LIKE 'tuş%' ile hızlı bir şekilde arayabilirsiniz, burada anahtar sözcük metninden bir sözcüğün metafonudur.

this thread için önerilen yanıtı gözden geçirin. Oldukça temiz ve çok büyük olmayan DB'ler için güzel çalışmalıdır.

3

çok küçük bir veritabanı ise, olabilir yük kez ve aramanız için Jaro-Winkler gibi bir algoritma kullanmak tüm verileri. PHP'de here'u bulabileceğiniz bir uygulama vardır.

Gerçekten iyi çalışıyor. Örnek bir uygulamaya here bir göz atın. Bu aramanın aynı algoritmayı kullandığını biliyorum ve 'Nintedno' çok iyi bulabilir. Ayrıca, sonucun, sorgunuzla en iyi eşleşen sonuca göre de sıralar.