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

如何使MYSQL搜索至少3个关键字匹配?,mysql,search,Mysql,Search,嗨,我有一个关于MYSQL搜索的大问题。 我的数据库表如下所示: +------+----------+------+ | id | keywords | file | +------+----------+------+ 在关键字中,每个条目都有许多关键字,用comas分隔。(关键词1,关键词2…) 在PHP数组中列出了一些关键字(5-10)。 我的搜索必须从这些关键字中获得至少3个的所有DB条目。 它不需要得到所有这些话!但它不能工作,只有一个 有人能帮我回答这个问题吗?我不知道该怎么

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

+------+----------+------+
|  id  | keywords | file |
+------+----------+------+
在关键字中,每个条目都有许多关键字,用comas分隔。(关键词1,关键词2…)

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


有人能帮我回答这个问题吗?我不知道该怎么做。

这是一个挑战。蛮力方法是在子查询中使用带有计数的并集

比如说,

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之类的工具,并对结果的分数进行过滤。

如果您有此设置:

表文件:

+------+-------+
| id   | file  |
+------+-------+
| 1000 | foo   |
| 1001 | bar   |
+------+-------+
表关键字:

+----+-------+
| id | word  |
+----+-------+
|  9 | lorem |
| 10 | ipsum |
+----+-------+
表文件关键字:

+----+-------+
| 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

那么,您正在搜索的其他表结构是什么样的呢。。。或者是这样,你只是用一个字符串来比较。如果是这样,那么关键字上下文的设计就很糟糕。没有其他表。我必须在字段:关键字处搜索。@Svetlio:表结构是您的选择吗?您是如何创建逗号分隔值列的?如果您阅读了在关系表中存储逗号分隔值的相关知识和问题,这将是一件好事:@ypercube-Excellent-link因此,如果您搜索关键字
man
,它还将计算关键字
woman
manound
Mane
many
更多…没有说这是一个很好的解决方案。只是它会起作用。解决这个问题的方法是确保每个关键字都有一个“,”的后缀,因此关键字可能是“woman,man,manhuod,mane”,然后修改查询,每次都在后面加逗号。是的。您还可以使用
FIND_IN_SET()
函数来标识逗号分隔的值。但是,按照您的建议,通过制作多对多表来规范结构是正确的方法。所有其他的都是些小把戏。这个搜索很完美。:)我在搜索单词的一部分或如何搜索单词方面没有问题。@Svetlio:您可以将
关键字(如“%keywordX%”)更改为
在集合中查找(keywordX,keywords)