Intereting Posts
Можно ли несколько раз вызвать curl_setopt с CURLOPT_HTTPHEADER, чтобы установить несколько заголовков? как я могу совместить строковые значения двух массивов попарно с PHP? Достичь иерархии, Родительского / Детского отношения эффективным и простым способом Существуют ли версии PHP или Java на стороне сервера OAuth 2? Regexp для определения времени вызова по ссылкам в исходном коде PHP Regex удалить все, что не является комментарием html. PHP: возвращает значение из функции и эхо напрямую? html jquery переключает между двумя формами Отправить несколько текстовых полей в массиве в PHP Конвертация PDF в PNG или JPEG очень медленная, используя ImageMagick Лучшая практика: законный межсайтовый скриптинг xpath получает элемент по индексу Ошибка SSL: как перенаправить https://www.domain.com на http://domain.com через .htaccess, чтобы избежать ошибки SSL Обновление Zend_Auth_Storage после редактирования профиля пользователя Слияние массива на многомерном массиве

Лучший способ сделать взвешенный поиск по нескольким полям в mysql?

Вот что я хочу сделать:

  • сопоставить тему поиска с несколькими полями моей таблицы
  • упорядочить результаты по важности поля и релевантности соответствия (в указанном порядке)

Пример: предположим, у меня есть блог. Затем кто-то ищет «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. Вот нить. Вид длинной нити (потому что я немного длинный), но выигрыш – это то, что вы ищете.