Alaka ile MYSQL tam arama sonuçlarını sıralamak için nasıl

4 Cevap php

Ben MYSQL için oldukça yeni ve bir süre için adamcağız beni bir sorunu vardı. Ben tüm cevap için biryere Googling çalıştı, ama henüz olarak kabul edilebilir bir çözüm bulamadı ettik.

Burada belirli bir arama terimi için mümkün olan en iyi eşleşmeyi bulmak için şu anda çalıştırıyorum sorgu:

$query="SELECT * from `vocabulary` WHERE translation = 'word' OR translation LIKE '%word%'";

O döner bu kapsamlı, sonuçları tüm ilgili satırları içerir. Ancak, belirli bir sıraya göre sıralanır, ve ben PHP sonuçlarını yazdırmak zaman tam bir maç ile olanlar ilk görüntülenen istiyorum. Bu gibi:


1 | word <-exact match
2 | crossword <- partial matches sorted alphabetically \/
3 | words
4 | wordsmith


Yardımlarınız için şimdiden çok teşekkür ederim.

-Macspacejunkie

4 Cevap

SELECT * from vocabulary 
WHERE translation like 'word'  
union all
SELECT * from vocabulary 
WHERE translation LIKE '%word%' and translation not like 'word'

İlk tam eşleşmeleri verir

GİBİ değil fulltext search. Tümyazı arama, MATCH(...) AGAINST(...) kabaca alaka olarak yaklaşılır edilebilir bir eşleme puanı verir.

Sen bir tam dizin oluşturma ve ardından arama terimi karşı eşleştirerek iyi bir alaka arama alabilirsiniz.

Yani böyle bir şey çalışması gerekir.

ALTER TABLE `vocabulary` ADD FULLTEXT INDEX `SEARCH`(`translation`);

SELECT *, MATCH(translation) AGAINST ('+word' IN BOOLEAN MODE) AS relevance 
FROM `vocabulary`
WHERE MATCH(translation) AGAINST ('+word' IN BOOLEAN MODE)
ORDER BY relevance DESC

Bu daha fazla bilgi MySQL Reference Manual bulunabilir.

Ben aynı sorun bakıyor ve oldukça henüz benim durum için mükemmel bir cevap bulamadı, ama bu sizin için yararlı olabilir edilmiştir. Ben tam metin arama için oldukça yeni de bu yüzden herhangi uzmanları da bana yardım et.

Ben select iki MATCH () KARŞI () deyimleri yapmak ve toplam alaka oluşturacak her birinden puan birleştirir. Farklı çarpanları atama bana sonuçlarının her set importnace yapılandırmak için izin verir.

My first MATCH() would check against the literal (or exact) search term using double quotes My second MATCH would check normally. I apply a higher multiplier to the first match so it should have a higher relevancy value if found.

Bu gibi bir şey.

SELECT *, ((MATCH(indexes) AGAINST ('"search_terms"' IN BOOLEAN MODE) * 10)  
           + (MATCH(indexes) AGAINST ('search_terms' IN BOOLEAN MODE) * 1.5)) AS relevance  
FROM ...
WHERE ...  
      AND (MATCH (indexes) AGAINST ('"search_terms"' IN BOOLEAN MODE) > 0  
           OR MATCH (indexes) AGAINST ('search_terms' IN BOOLEAN MODE) > 0)  
      ...
ORDER BY relevance DESC

Eğer sorgu nasıl çalıştığını göstermek için EXPLAIN işlevini kullanın çalıştırırsanız () hükümleri KARŞI ekstra KAÇINCI () aslında nedeniyle MySQL çalışır şekilde sorguya herhangi bir yükü dont add olduğunu bulmalısınız.