2013-08-14 5 views
0

У меня есть таблица с заголовками и ключевыми словами, которые я бы хотел найти. Я хочу добавить возможность использовать многопользовательский поиск, но тогда он должен определенно отсортировать результаты по релевантности. FullTextSearch не является вариантом, потому что я использую MySQL5.5 и innoDB.поиск нескольких значений, сортировка по релевантности (php + MySQL, полнотекстовый поиск)

Мой текущий подход заключается в следующем:

  1. Я поиск для каждого члена в отдельности и соответствующие идентификаторы магазина в массиве PHP.
  2. Как только я искал все термины, я подсчитываю идентификаторы и сортирую их соответственно.

Что мне сейчас интересно, если есть более эффективный способ сделать это, поскольку я в первую очередь использую php для этого. Должен ли я выполнять часть этой обработки в базе данных? Должен ли я сильно изменить свой подход?

Таблица относительно небольшая (менее 10 тыс. Записей), и я не ожидаю, что она станет намного больше в ближайшем будущем.

Любые предложения? Благодарю.

+1

Возможно, вам поможет получить код, если вы его показали, и предоставили дополнительную информацию о схеме и запросах таблиц. – DevlshOne

+0

@DevlshOne: Я использую Joomla, поэтому мое взаимодействие с базой данных похоже на pdo, и я использую REGEX (по одному термину за раз), но я могу легко изменить его на инструкции LIKE. Я просто не хотел, чтобы какой-то конкретный синтаксис мешал мне, меня интересует, есть ли способ переместить некоторые из этих функций в базу данных, чтобы он работал быстрее или был другой, радикально отличный подход, который я следует рассмотреть. Однако, спасибо. – mattosmat

+0

Смотрите, может быть, это может помочь: http://stackoverflow.com/a/35512410/1673161 –

ответ

1

Вы можете сделать счет в SQL. Ниже приведен пример:

select ((col like 'term1') + 
     (col like 'term2') + 
     . . . 
     (col like 'termN') 
     ) as NumMatches 
from t 
having NumMatches > 0 
order by NumMatches desc; 

MySQL обрабатывает булевы, как 0 (для ложно) и 1 (для истинно). Вы можете добавить их вместе, чтобы получить общее количество совпадений.

+0

O.k., это отлично работает, но у меня все еще есть один вопрос: как я могу его выбрать, только строки, которые соответствуют? Прямо сейчас он дает мне все строки, хотя правильно отсортирован по релевантности! :) – mattosmat

+0

Вы можете добавить 'наличие NumMatches> 0' после' from t'. –

+0

Это работает как шарм. Я бы добавил «иметь NumMatches> 0» к вашему первоначальному ответу. Благодаря! – mattosmat

Смежные вопросы