如何使MYSQL搜索至少3个关键字匹配?

时间:2012-02-04 16:55:56

标签: mysql search

嗨,我有一个MYSQL搜索的大问题。 我的数据库TABLE如下所示:

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

在关键字处,每个条目都有许多关键字与逗号分隔。 (关键字1,关键字2 ...)。

在PHP数组中列出了一些关键字(5-10)。 我的搜索必须从这些关键字获得所有至少3个数据库条目。 它不需要得到所有这些词!但它只能用一个就行不了。

有人可以帮我查询一下吗?我不知道如何制作它。

2 个答案:

答案 0 :(得分:2)

这是一个挑战。强力方法是在带有计数的子查询中使用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的单独表格,每行一个关键字/ ID组合。这将消除通配符搜索并使查询更有效。

下一步是去ElasticSearch这样的东西并过滤结果的分数。

答案 1 :(得分:0)

如果您有此设置:

表格文件:

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

表关键字:

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

表格文件关键字:

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

您可以找到包含关键字loremipsumdolor的文件,如下所示:

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