Как заставить MYSQL искать минимум 3 совпадения по ключевым словам? - PullRequest
0 голосов
/ 04 февраля 2012

Привет, у меня одна большая проблема с одним поиском в MYSQL.Моя база данных TABLE выглядит следующим образом:

+------+----------+------+
|  id  | keywords | file |
+------+----------+------+

По ключевым словам существует много ключевых слов для каждой записи, разделенной запятыми.(keyword1, keyword2 ...).

В массиве PHP перечислены некоторые ключевые слова (5-10).И мой поиск должен получить все записи БД, которые получили по крайней мере 3 из этих ключевых слов.Это не обязательно, чтобы получить все эти слова!Но это не может работать и только с одним.

Может ли кто-нибудь помочь мне с этим запросом?У меня нет хорошей идеи, как это сделать.

Ответы [ 2 ]

2 голосов
/ 04 февраля 2012

Это вызов.Методом грубой силы было бы использовать UNION в подзапросе с числом.

Например,

select id, file, count(*) from
  (select distinct id, file
     from file_table
       where FIND_IN_SET(keyword1, keywords)
   UNION ALL
   select distinct id, file
     from file_table
       where FIND_IN_SET(keyword2, keywords)
   UNION ALL
   select distinct id, file
     from file_table
       where FIND_IN_SET(keyword3, keywords)
   UNION ALL
   select distinct id, file
     from file_table
       where FIND_IN_SET(keyword4, keywords)
   .... MORE UNION ALL ....) as files
group by id, file
having count(*) >= 3

Более эффективно, вы могли бы иметь отдельную таблицу с ключевыми словами и ID, одинкомбинация ключевых слов / идентификаторов в строке.Это устранит поиск по шаблону и сделает запрос более эффективным.

Следующим шагом будет переход к чему-то похожему на ElasticSearch и фильтрация по результату.

0 голосов
/ 04 февраля 2012

Если у вас была такая настройка:

файлы таблиц:

+------+-------+
| id   | file  |
+------+-------+
| 1000 | foo   |
| 1001 | bar   |
+------+-------+

ключевые слова таблицы:

+----+-------+
| id | word  |
+----+-------+
|  9 | lorem |
| 10 | ipsum |
+----+-------+

ключевые слова файла таблицы:

+----+--------+--------+
| id | fileid | wordid |
+----+--------+--------+
|  1 | 1000   | 9      |
|  2 | 1000   | 10     |
|  3 | 1001   | 10     |
+----+--------+--------+

Вы можете найти файлы с ключевыми словами lorem, ipsum, dolor, например:

SELECT COUNT(DISTINCT(k.word)), f.*
FROM files f
INNER JOIN filekeywords fk
  ON fk.fileid = f.id
INNER JOIN keywords k
  ON k.id = fk.wordid
WHERE k.word in ('lorem', 'ipsum', 'dolor')  
GROUP BY f.id
HAVING COUNT(DISTINCT(k.word)) >= 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...