MySQL gibi sorgu

5 Cevap php

Ben bir dize için benim db aramak çalışıyorum. Ama herhangi bir kelime değil, tüm ifade eşleşmesi gerekir.

Varsayalım tablo veri "a b c d e f g" gibi metin vardır. Ben "DCB" için arama ise o zaman sonuçları göstermek gerekir.

field LIKE '%d c b%' böyle çalışmıyor

Birisi de alaka sayaç gösteren olası aramak için daha sağlam bir yol, önerebilirsiniz.

Ben yukarıdaki için de PHP kullanarak sakıncası, ancak DB düzeyde arama yapmak için tercih etmiyorum.

Zaman ayırdığınız için teşekkür ederiz.

5 Cevap

En iyi sonuçlar için, sizin veri FULLTEXT dizin oluşturmak gerekir.

CREATE TABLE mytable (id INT NOT NULL, data TEXT NOT NULL, FULLTEXT KEY fx_mytable_data) ENGINE=MyISAM

SELECT  *
FROM    mytable
WHERE   MATCH(data) AGAINST ('+word1 +word2 +word3' IN BOOLEAN MODE)

(Sizin örnekte olduğu gibi) endeks tek harfli kelimeleri unutmayın, siz ft_min_word_len 1 in MySQL confguration için ayarlamanız gerekir.

Bu sözdizimi (sürece tablo MyISAM olduğu gibi) bir dizin yoksa bile çalışabilir, ancak oldukça yavaş olacaktır.

Ben ne yapmak istediğiniz herhangi bir harf için olduğunu düşünüyorum:

field LIKE '%d%' or field like '%c%' or field like '%b%'

tüm harfleri için

field LIKE '%d%' and field like '%c%' and field like '%b%'

Eğer tablo MyISAM ise, MySQL entegre FULLTEXT arama kullanabilirsiniz: 11.8. Full-Text Search Functions

Bazı kısıtlamalar olacak olsa (Eğer doğru hatırlıyorum mesela, sen X karakterden daha kısa kelime arama yapamazsınız - X genellikle 3 olmak veya 4).


Another solution would be to use some Fulltext engine, like Lucene, Solr, or Sphinx -- those generally do a better job when it comes to fulltext-searching : it is their job (MySQL's job being to store data, not do fulltext-search)

SO çıkanlar hakkında sorular çok olmuştur; Örneğin:


If you are using PHP and cannot install anything else, there is a full-PHP implementation of Lucene : Zend_Search_Lucene

Sonunda, MySQL GİBİ hükümler kelime tabanlı eşleme yapmak için 'güçlü' arama araçları olarak kullanılacak anlamına gelmez. Bu kısmi ifadeler bulmak için basit bir araçtır. Aynı zamanda iyi ölçekleme için bilinen değil, böylece bir high-end verimlilik web sitesinde bu yapıyorsun, muhtemelen başka bir çözüm isteyeceksiniz.

Söyleniyor Yani, sizin için bazı seçenekler ne istiyorsun almak için, orada ARE:

  • , REGEX destek yapmak için MySQL desteği REGEX based searches. Bu kullanma ve karmaşık yeterli regex ile, size aradığınızı bulabilirsiniz.

  • MySQL Gerçek Tam metin dizin. MySQL FULLTEXT indexes oluşturmak için bir yol var. Sen MyISAM veri motorunu kullanarak gerekir, ve tam olarak ne yapabilirsiniz kısıtlamalar vardır, ya da yapamaz. Ama çok daha güçlü bir SQL var işlevsellik 'gibi temel daha bulunuyor. Ben eğer ilgilendi üzerinde okuma tavsiye ederim.

  • 3. parti dizinleyiciler. Bu aslında çoğu kişi gitmek yoludur. Onlar özellikle sadece ne kadar modern web arama motorları iş gibi, çeşitli mantığı ile kelimelerin tam metin arama yapmak için tasarlanmıştır Lucene / Solr, ya da diğer benzer indeksleme teknolojileri kullanacak. Onlar her şeyi kırmak nerede, aslında, kendi veritabanı tutmak ve bu aramaların tam olarak bu tür için en uygun bir şekilde saklayın çünkü son derece verimli.

Umarım bu üç seçenekten birini sizin için çalışacak.

Kullanırken like fıkra %variable% veya variable% değil %variable olduğuna dikkat edin.

İkincisi. Google gibi "+ php öğrenmek": affektif arama Ben bu gibi aramak gerekir "php öğrenmek" eğer arama gibi kelimeleri kırmak için explode işlevi kullanmak için. Bu explode() fonksiyon.