Ранжирование результатов поиска SQL - PullRequest
3 голосов
/ 28 марта 2011

У меня есть объекты вызова таблицы, в которых есть столбцы:

object_id, 
name_english(vchar), 
name_japanese(vchar), 
name_french(vchar), 
object_description 

для каждого объекта.

Когда пользователь выполняет поиск, он может вводить текст на английском, японском или французском языке ... и мой оператор sql выглядит так:

SELECT  
 o.object_id,  
 o.name_english,
 o.name_japanese,  
 o.name_french,  
 o.object_description  
FROM 
 objects AS o
WHERE 
 o.name_english LIKE CONCAT('%',:search,'%') OR 
 o.name_japanese LIKE CONCAT('%',:search,'%') OR 
 o.name_french LIKE CONCAT('%',:search,'%')    
ORDER BY 
 o.name_english, o.name_japanese, o.name_french ASC

И некоторые записи имеют вид:

Tin spoon,  
Tin Foil,  
Doctor Martin Shoes,  
Martini glass,  
Cutting board,  
Ting Soda.   

Итак, когда пользователь ищет слово «Олово», он возвращает все результаты, но вместо этого я просто хочу вернуть результаты, которые включают термин «Олово» или отображать результат, и ранжировать их.по порядку актуальности.Как мне этого добиться?

Спасибо.

Ответы [ 3 ]

4 голосов
/ 28 марта 2011

Вы можете использовать индексы MySQL FULLTEXT для этого.Для этого требуется тип таблицы MyISAM, индекс (name_english, name_japanese, name_french, object_description) или любые поля, по которым вы хотите выполнять поиск, и соответствующее использование оператора MATCH ... AGAINST для именно этого набора столбцов.

См. Руководство на http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html, и примеры на следующей странице http://dev.mysql.com/doc/refman/5.5/en/fulltext-natural-language.html

1 голос
/ 28 марта 2011

После выполнения запроса выше вы получите все виды результатов, включая те, которые вам не интересны, но затем вы можете использовать регулярные выражения для указанных выше результатов (возвращаемых сервером mysql), чтобы отфильтровать то, что вам нужно.

0 голосов
/ 28 марта 2011

Это должно сработать - возможно, вам придется отфильтровать дубликаты, но основная идея очевидна.

    SELECT  
    `object`.`object_id`,  
    `object`.`name_english`,
    `object`.`name_japanese`,  
    `object`.`name_french`,  
    `object`.`object_info`, 1 as ranking   
    FROM `objects` AS `object`
    WHERE `object`.`name_english` LIKE CONCAT(:search,'%') OR `object`.`name_japanese` LIKE CONCAT(:search,'%') OR `object`.`name_french` LIKE CONCAT(:search,'%')
union 
    SELECT  
    `object`.`object_id`,  
    `object`.`name_english`,
    `object`.`name_japanese`,  
    `object`.`name_french`,  
    `object`.`object_info`, 10 as ranking   
    FROM `objects` AS `object`
    WHERE `object`.`name_english` LIKE CONCAT('%',:search,'%') OR `object`.`name_japanese` LIKE CONCAT('%',:search,'%') OR `object`.`name_french` LIKE CONCAT('%',:search,'%') 
ORDER BY ranking, `object`.`name_english`, `object`.`name_japanese`, `object`.`name_french` ASC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...