Mysql'de 1000000 addan fazla ad depoladığım bir veritabanım var. Şimdi benim uygulamamın görevi biraz tipik. Sadece veritabanındaki isimleri araştırmakla kalmaz, aynı zamanda benzer isimler bulur. adı christian
olarak girilir varsayalım, o zaman uygulama like
maddesini kullanmadan, christine
, chris
vb Bunu yapmanın en uygun yolu nedir gibi önerilen isimler gösterecektir. Öneriler, sadece ismin son kısmındaki değişikliklere ait olacaktır.Büyük bir tablodan benzer değer bulmanın en iyi yolu
cevap
: http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_soundex
Aksi … LIKE 'chri%'
kötü bir fikir değil benim için görünüyor?
LIKE
olmadan sadece ilk karakterleri gerçekten istiyorsanız, SUBSTRING()
'u kullanabilirsiniz.
Keşke bunu iki defa daha fazla yapabilirim. Tabii ki sadece ilk karakterleri karşılaştırmak için SUBSTRING() kullanıyorsanız,% xyz% aynı şeyi yapıyor gibi görünüyor. Ama SOUNDEX() ... bu harika bir öneri ve bana bir çeşit Perua için Lingua :: EN :: SimilarNames, Text :: Soundex ve Lingua :: EN :: NameLookup CPAN modüllerini hatırlatıyor. önce veri kümesinin içe aktarılmasını gerektirir). SUBSTRING() kullanılarak – DavidO
, tam bir tablo taraması gerektirir. Bu durumda daha hızlı olacak. SOUNDEX() iyi bir öneridir, ancak arama hızlı olduğu için ayrı bir dizinlenmiş alan olarak depolanmalıdır. –
Sanırım normal bir genisleme kullanabilirsin. Ben şu anda gitmiyorum ama bir WHERE maddesine koyabileceğiniz REGEXP adlı bir fonksiyon var. Bakın here
'REGEXP' daha karmaşık sorgular için kullanışlıdır, ancak' LIKE'dan çok daha yavaş olacaktır. – glortho
Ben (hiç kullanmadım) sadece "LIKE" dan farklı bir şey teklif etmek olduğunu hayal ettim! –
Like
genellikle iyi bir çözümdür, ancak bunun performansını artırmak için başka bir yol kısmi bir sütun dizini oluşturmak ve sonra öneki ile aynı uzunlukta sorguları göndermek olabilir. col_name(length)
ile ilgili MySQL documentation'a bakın. Eğer (sesiyle) benzer isimler SOUNDEX()
gibi bir şey yardımcı olabilir ayrıca istiyorsanız
SOUNDS LIKE kullanabilirsiniz, bence oldukça hızlı olmalı.
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#operator_sounds-like
kalyoncu, bu muhtemelen iyi bir iş yapacak, ancak SOUNDEX() gibi tam bir tablo taraması gerektirecektir. –
Başka bir alan oluşturabilirseniz, bundan kaçınabilirsiniz. Her ekleme ile soundex'i bu alana eklersiniz ve arama süresinde oldukça hızlı olacaktır. Ayrıca bu alanda bir dizin oluşturabilirsiniz. Hmm Sanırım bu öncekinden daha iyi bir cevap. –
Ayrıca bir soundex dizesini de doğru olarak hatırlarsam C#### biçimindeki bir sayıya dönüştürebilirsiniz. C, 1-26 arasında en fazla 6 basamaklı bir sayıdır. –
sol taraftaki bir tablo taraması gerektirmez sabittir nerede GİBİ kullanma. LIKE kullanmak istememenizin nedeni budur: SELECT * FROM table WHERE name LIKE CONCAT(?, "%")
hızlıdır ve satırları bulmak için bir tablo taraması gerektirmez. CONCAT, hazırlanmış sözdizimini% sözdizimi ile kullanmanızı sağlar. sıralanmış listede komşular bulmak için
SELECT * from table WHERE name < 'christian' LIMIT 20
ve
SELECT * FROM table WHERE name > 'christian' LIMIT 20
Ayrıca böyle bir şey yapabilirdi.
Her isme metafon-kodu oluşturup adlarıyla birlikte bunları saklamak için php'nin metafon() işlevini kullanabilirsiniz.
<?php
print "chris" . "\t" . metaphone("chris") . "\n";
print "christian" . "\t" . metaphone("christian") . "\n";
print "christine" . "\t" . metaphone("christine") . "\n";
# prints:
# chris XRS
# christine XRSTN
# christian XRSXN
sonra bir levenshtein mesafesi algoritma kullanabilir (ya php [http://php.net/manual/en/function.levenshtein.php] veya MySQL [http://www.artfulsoftware.com /infotree/queries.php#552]) meta kodlar arasındaki mesafeyi hesaplamak için. Benim testimde, 2 veya daha az bir mesafe, aradığınız benzerlik düzeyini belirtiyor gibiydi.
<?php
$names = array(
array('mike',metaphone('mike')),
array('chris',metaphone('chris')),
array('chrstian',metaphone('christian')),
array('christine',metaphone('christine')),
array('michelle',metaphone('chris')),
array('mick',metaphone('mick')),
array('john',metaphone('john')),
array('joseph',metaphone('joseph'))
);
foreach ($names as $name) {
_compare($name);
}
function _compare($n) {
global $names;
$name = $n[0];
$meta = $n[1];
foreach ($names as $cname) {
printf("The distance between $name and {$cname[0]} is %d\n",
levenshtein($meta, $cname[1]));
}
}
- 1. Jmeter'da en iyi yolu bulmanın en iyi yolu nedir?
- 2. Büyük önek ağacını saklamanın en iyi yolu
- 3. Bir sınıf özniteliğinin sınıfını bulmanın en iyi yolu
- 4. Kompakt Çerçevede geliştirirken tüm belleğinizi bulmanın en iyi yolu nedir?
- 5. Listede bir öğeyi bulmanın en hızlı yolu?
- 6. TabActivity'deki Sekmelerin sayısını bulmanın en iyi yolu nedir?
- 7. Windows form uygulamasında bellek sızıntılarını bulmanın en iyi yolu nedir?
- 8. 2 Benzer iOS uygulaması - bunları yönetmenin en iyi yolu nedir?
- 9. Nesneyi opencv ile bulmanın en iyi yöntemi
- 10. En içteki istisnayı bulmanın doğru yolu?
- 11. Büyük ağlar ölçeğinde iki düğüm arasındaki olası tüm yolları bulmanın en iyi yolu nedir?
- 12. Sayısal dizide modu bulmanın en verimli yolu
- 13. İki düğüm arasında en kısa yolu bulmanın en iyi yolu Tinkerpop 3.1
- 14. Büyük bir durum makinesini uygulamanın en iyi yolu?
- 15. Python'daki Sözlüklerin Büyük Listesinin üstesinden gelmenin en iyi yolu
- 16. Sıfır değeri olmayan bir sözlükte en büyük anahtarı bulmanın verimli yolu
- 17. Ana iş parçacığını engelleyen bir kod bulmanın en iyi yolu nedir?
- 18. Google App Engine'de göreli yollar bulmanın iyi bir yolu nedir?
- 19. iyi yolu
- 20. en iyi yolu?
- 21. en iyi yolu
- 22. en iyi yolu
- 23. models.py büyük olsun, onu kırmanın en iyi yolu nedir?
- 24. Büyük/küçük harf sorgu dizelerini denetlemenin en iyi yolu
- 25. Sözlükle listeyi değer olarak tersine çevirmenin en iyi yolu?
- 26. C# 'da, bir DateTime dizisindeki boşlukları bulmanın en iyi yolu nedir?
- 27. SQL'de "sonraki ama bir yeni" tarihini bulmanın en iyi yolu nedir?
- 28. İyi bir Vim regexp OR komutu var mı? Başka bir şey yoksa uyumsuzluğu bulmanın en iyi yolu nedir?
- 29. Belirli bir sütundaki iki tablodan en iyi satırı alın
- 30. Spree'yi özelleştirmenin en iyi yolu?
Neden 'like' deyimini kullanmak istemiyorsunuz? – Geoffroy
Postgres'e geçmeyi düşünün. Bunu [metin arama sözlükleri] kullanarak yapmaya izin verir (http://www.postgresql.org/docs/9.0/static/textsearch-dictionaries.html) –
Yeni bir alan ekleyebilir misiniz? eğer öyleyse cevabım altında ek yorumumu kontrol et. –