鉴于此模型:
+-----------+-------------+---------------------------+
| item_id | item_name | desc |
+-----------+-------------+---------------------------+
| 1 | Product 1 | lorem ipsum dolor... |
| 2 | Product 2 | lorem mauris eu... |
| 3 | Product 3 | scelerisque sagittis... |
| 4 | Product 4 | lorem dolor ipsum... |
| 5 | Product 5 | ipsum dolor lorem... |
+-----------+-------------+---------------------------+
我想搜索在 item_name
或 desc
中包含单词 lorem ipsum
的所有产品。此外,任何单词都可以出现在 lorem
和 ipsum
之间,并且 lorem
和 ipsum
可以以任何顺序出现。基本上,此搜索将返回项目 1
、4
和 5
现在,我知道我可以通过以下方式完成此任务:
SELECT * FROM items
WHERE (item_name LIKE 'lorem%ipsum'
OR desc LIKE 'lorem%ipsum')
OR (item_name LIKE 'ipsum%lorem'
OR desc LIKE 'ipsum%lorem')
但是,如果我的搜索词较长(即 lorem ipsum dolor sat amet、consectetur adipiscing elit),我觉得添加到查询中的 OR
数量可能会变得有点荒谬。有没有更简单/更有效的方法来处理这个问题?
最佳答案
这种搜索要求听起来很适合 full text search .
全文搜索更像是(或者至少可以是)类似“搜索引擎”的搜索,而不是传统的 SQL 类似搜索。通过全文搜索,搜索单词的顺序并不重要,并且根据 RDBM,某些全文搜索功能允许同义词查找以及干扰词过滤。
在(我相信)大多数情况下,全文搜索比 like
搜索要快得多。 Here是一篇关于 mysql 全文搜索入门的文章。
mySql 全文搜索语法示例:
select *
from items
where match(item_name) against ('+lorem +ipsum' in boolean mode)
全文搜索确实有一定的要求(在文章的链接中有详细介绍)。我个人没有使用过 mysql 的全文搜索,否则我会列出步骤。如果您想朝这个方向发展,应该足以让您开始。
关于mysql - SQL 以任意顺序搜索单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57817335/