mysql - SQL 以任意顺序搜索单词

标签 mysql sql

鉴于此模型:

+-----------+-------------+---------------------------+
|  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_namedesc 中包含单词 lorem ipsum 的所有产品。此外,任何单词都可以出现在 loremipsum 之间,并且 loremipsum 可以以任何顺序出现。基本上,此搜索将返回项目 145

现在,我知道我可以通过以下方式完成此任务:

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/

相关文章:

mysql - Laravel:将结果与 UnionAll 和 where 条件结合起来

mysql全文搜索 "all but"查询

mysql - PhpStorm 可以将 MySQL 数据库转储到 sql 文件中吗?

MYSQL 重复插入

php - CodeIgniter where and like sql 查询语句

java - 删除sql不删除

php - 重定向功能不起作用

mysql - 编写一条 SQL 语句进行速度跟踪

java - jsp中的sql查询放在哪里

c++ - 在 C++ 中读取 SQL 表