2013-03-19 31 views
5

Arama alanında ve alandaki boşlukları göz ardı ederek, bir alan aramanın iyi bir yolu ne olurdu?MySQL - Alanı görmezden geliyor alan yok

Örnek:

SELECT * 
FROM tablename 
WHERE NOSPACES(fieldname) LIKE '%{search term with spaces removed}%' 

Gerçek hayattan örnek:

Müvekkilim uzun blok satış motor bir web sitesi var. Ancak, genellikle "cat 3306 longblock" ("cat 3306 long block" yerine) için kullanıcıların sitelerinde arama yapmasını sağlarlar. "Uzun blok" arandığında ortaya çıkacak "uzun blok" motorlara ihtiyacımız var.

Not: Muhtemelen bu sorunun amaçları açısından önemli değildir, ancak bu site PHP 5.3 ve phpActiverecord kullanılarak oluşturulmuştur.

cevap

2

yani normal bir ifade kullanarak arama terimi dışına boşluk şerit olabilir veya mysql'in tam metni üzerinden yapılan aramalar gibi tam metin için Lucene. Onları kişisel olarak kullanmadım ama her ikisinin de tam metin dizinlerinde yerleşik olarak mysql'den üstün olduğunu duyuyorum.

Tüm bu yöntemlerle dikkat edilmesi gereken bir nokta, daha fazla bakım ve sunucu ek yükü ekleyen güncellemeyi korumak için özel bir dizin gerektirmeleridir.

Sfenks üzerinde

İyi makale : Ürün adı veya sayılar için iyi yapar http://astellar.com/2011/12/replacing-mysql-full-text-search-with-sphinx/

bir bakım çözümü için sadece boşluklarla kullanıcının arama terimleri bölünmüş ve sorgunuzla her biri için LIKE '% vadeli%' eklemektir . Ayrıca, özel bir arama alanı oluşturabilirim: Alfabetik harflerle, ürün adları veya sayıları sırasına göre işaretlenmiş olan ürün adı veya numarasıdır. Ürün adı her değiştiğinde bu alanı güncellemeniz gerekir. Daha sonra bu yeni sıyrılan alana karşı OR numaralı aramaya karşı sorgulamaya ek olarak. Örneğin, 'cat 3306 longblock' gibi bir ürün adınız varsa, bir product_name_search alanı oluşturun ve '3306catlongblock' yerleştirin.

WHERE (other product name search clauses) OR 
    (product_name_search LIKE '%3306%' AND product_name_search LIKE '%longblock%') 

Bu süreç FREETEXT kadar iyi değil ama ürün adları ve numaraları için oldukça iyi yapar: 3306 long-block için bir kullanıcı arar Boşluklar üzerinde sıyırma sembol ve bölerek arama işlemek.

+0

Teşekkürler, Tim. Özel arama alanı işe yarayabilir.En büyük sorun, ürün "Cat 3306 Long Block" olarak adlandırıldığında "3306 longblock" aradığımız. Arama terimindeki boşluk eksikliğine dikkat edin. –

+1

'3306 longblock' aramasını bölmeye ayırmanız gerekir ... '% 3306%' GİBİ 'VE ...' işlenen product_name_search alanına '% longblock%' GİBİ –

+0

Bu işe yaradı, teşekkürler Tim. –

3

Bunu ne kadar basit yapmak istediğinize bağlı olarak birtakım yaklaşımlar öneririm. Ben şahsen burada http://dev.mysql.com/doc/refman/5.0/en/fulltext-natural-language.html

yola prensipleri kullanarak tam metin araması kullanmak istiyorsunuz Ama aynı zamanda da Sphinx düşünebilirsiniz

$str=preg_replace('/\s+/', '', $str); 
+0

Cevabınız için teşekkürler. Boşluklar arama teriminde değil. Aradığımız alandalar. "Longblock" için arama yapıyoruz ve alan "uzun blok" içeriyor. –

+0

Bu durumda tam metin arama size yardımcı olacaktır .... – diagonalbatman

+0

Gotcha. Kontrol edecek ... teşekkürler! –

0

Baskı işlevini kullanmanın bir yolu vardır. Örnek:

SELECT * FROM `products` where REPLACE(PartName, ' ', '') = REPLACE('0 1 3000 70 27', ' ', '') 
İlgili konular