Kolay site arama uygulaması uygulamak nedir, o bulanık arama destekler?

4 Cevap php

Ben daha çok film ve TV şovu isimler yaklaşık 20-30k kayıtlar, avlanmaktan gereken bir site var. Site memcache ile php / mysql çalışır.

Im soundex() Şu anda, biraz ... çalışıyor, ancak birçok durumda çok iyi değil ki sahip olduğu arama ile FULLTEXT yerine bakıyor.

Uygulamak için basit orada herhangi bir iyi arama komut vardır, ve (bir tablo 3 sütun) bir iyi arama kabiliyeti sağlayacaktır.

4 Cevap

ewemli cevabı doğru yönde ama aksi takdirde GİBİ sorguları muhtemelen çok yavaş olan, FULLTEXT yerine değil, FULLTEXT ve soundex haritalama birleştirerek edilmelidir.

create table with_soundex (
  id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
  original TEXT,
  soundex TEXT,
  FULLTEXT (soundex)
);

insert into with_soundex (original, soundex) values 

('add some test cases', CONCAT_WS(' ', soundex('add'), soundex('some'), soundex('test'), soundex('cases'))),
('this is some text', CONCAT_WS(' ', soundex('this'), soundex('is'), soundex('some'), soundex('text'))),
('one more test case', CONCAT_WS(' ', soundex('one'), soundex('more'), soundex('test'), soundex('case'))),
('just filling the index', CONCAT_WS(' ', soundex('just'), soundex('filling'), soundex('the'), soundex('index'))),
('need one more example', CONCAT_WS(' ', soundex('need'), soundex('one'), soundex('more'), soundex('example'))),
('seems to need more', CONCAT_WS(' ', soundex('seems'), soundex('to'), soundex('need'), soundex('more')))
('some helpful cases to consider', CONCAT_WS(' ', soundex('some'), soundex('helpful'), soundex('cases'), soundex('to'), soundex('consider')))

select * from with_soundex where match(soundex) against (soundex('test'));
+----+---------------------+---------------------+
| id | original            | soundex             |
+----+---------------------+---------------------+
|  1 | add some test cases | A300 S500 T230 C000 | 
|  2 | this is some text   | T200 I200 S500 T230 | 
|  3 | one more test case  | O500 M600 T230 C000 | 
+----+---------------------+---------------------+

select * from with_soundex where match(soundex) against (CONCAT_WS(' ', soundex('test'), soundex('some')));
+----+--------------------------------+---------------------------+
| id | original                       | soundex                   |
+----+--------------------------------+---------------------------+
|  1 | add some test cases            | A300 S500 T230 C000       | 
|  2 | this is some text              | T200 I200 S500 T230       | 
|  3 | one more test case             | O500 M600 T230 C000       | 
|  7 | some helpful cases to consider | S500 H414 C000 T000 C5236 | 
+----+--------------------------------+---------------------------+

Bir dizinin maksimum avantaj ('% foo' GİBİ herhangi bir sorgu tablodaki her satır tarama vardır) çekerken ki (soundex algo sınırları içinde) oldukça iyi sonuçlar verir.

Tüm ifade üzerine, her bir sözcük soundex çalıştıran önemini unutmayın. Ayrıca oldukça SQL bunu ama bu durumda bunu yapmak emin olan daha her kelimenin üzerinde Soundex kendi sürümünü çalıştırabilir hem zaman saklanması ve algoritmalar arasında farklılıklar vardır durumda almak (örneğin, MySQL algo sınırı yok kendisi standart 4 chars)

Yerine dışında kendi çözüm kontrol oluşturma basit varolan çözüm arıyorsanız

Mysql bir fonksiyon SOUNDEX vardır. Eğer bir film başlığı aramak istiyorsanız:

select * from movie where soundex(title) = soundex( 'the title' );

Tabii ki böyle bir film ya da arsa özet olarak, metin içinde arama çalışmıyor.


Soundex nispeten basit bir algo olduğunu. Ayrıca uygulamalı düzeyde tüm bu işlemek için karar verebilir, daha kolay olabilir:

  • Metin depolandığı zaman, bunu simgelemek ve Tüm kelimeleri soundex uygulamak
  • iki sütunda da orijinal metin ve soundex versiyonunu saklamak
  • arama yaparken, app soundex hesaplamak. düzeyi ve daha sonra db düzeyinde normal bir LIKE kullanın.

Soundex bulanık arama ile başa çıkmak için sınırlamalar vardır. Daha iyi bir fonksiyon UDF kullanarak MySQL entegre edilebilir düzenlemek mesafe vardır. Linux üzerinde MySQL için bir C + + uygulaması için http://flamingo.ics.uci.edu/toolkit/ edin.