Вот что я хочу сделать:
Пример: предположим, у меня есть блог. Затем кто-то ищет «php». Результаты будут выглядеть следующим образом:
Я на самом деле сделал это с классом на PHP, но он использует много UNIONS (много!) И растет с размером объекта поиска. Поэтому я беспокоюсь о производительности и проблемах DOS. Кто-нибудь знает об этом?
Вероятно, этот подход для взвешивания поиска / результатов подходит вам:
SELECT *, IF( `name` LIKE "searchterm%", 20, IF(`name` LIKE "%searchterm%", 10, 0) ) + IF(`description` LIKE "%searchterm%", 5, 0) + IF(`url` LIKE "%searchterm%", 1, 0) AS `weight` FROM `myTable` WHERE ( `name` LIKE "%searchterm%" OR `description` LIKE "%searchterm%" OR `url` LIKE "%searchterm%" ) ORDER BY `weight` DESC LIMIT 20
Он использует подзапрос select, чтобы обеспечить вес для заказа результатов. В этом случае три поля были просмотрены, вы можете указать вес для каждого поля. Это, вероятно, менее дорого, чем профсоюзы, и, вероятно, один из самых быстрых способов в простом MySQL.
Если у вас есть больше данных и нужны результаты быстрее, вы можете использовать что-то вроде Sphinx или Lucene.
вы можете добавить несколько значений mysql MATCH () вместе, сначала умножая каждый на свой вес.
упрощенно, конечно …
'(MATCH(column1) AGAINST(\''.$_GET['search_string'].'\') * '.$column1_weight.') + (MATCH(column2) AGAINST(\''.$_GET['search_string'].'\') * '.$column2_weight.') + (MATCH(column3) AGAINST(\''.$_GET['search_string'].'\') * '.$column3_weight.') AS relevance'
тогда
'ORDER BY relevance'
Вы должны использовать выделенный индекс для предварительной выборки всех данных в оптимизированном индексе поиска. Сфинкс и подобные продукты делают это очень хорошо.
У меня был такой же вопрос, и он был полностью удовлетворен одним из форумов MySQL. Вот нить. Вид длинной нити (потому что я немного длинный), но выигрыш – это то, что вы ищете.