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