SQL以任何顺序搜索单词

时间:2015-09-30 18:36:18

标签: 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...     |
+-----------+-------------+---------------------------+

我想在lorem ipsumitem_name中搜索包含desc字样的所有产品。此外,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 sit amet,consectetur adipiscing elit),我觉得在查询中添加OR的数量可能会变得有点荒谬。是否有更简单/更有效的方法来处理这个问题?

3 个答案:

答案 0 :(得分:7)

这种搜索要求听起来很适合full text search

全文搜索是(或至少可以)更多的搜索引擎"喜欢搜索而不是传统的sql like搜索。通过全文搜索,被搜索的单词的顺序无关紧要,并且根据RDBM,一些全文搜索功能允许同义词查找以及噪声词过滤。

在(我相信)大多数情况下,全文搜索明显快于like搜索。 Here是一篇关于在mysql中开始全文搜索的文章。

示例mySql全文搜索语法:

select *
from items
where match(item_name) against ('+lorem +ipsum' in boolean mode)

全文搜索确实有一些要求(在文章的链接中详细介绍)。我没有亲自使用mysql的全文搜索,或者我列出了这些步骤。如果你想走向那个方向,那应该足以让你开始。

答案 1 :(得分:2)

我认为分别查找每个单词更简单:

SELECT *
FROM items
WHERE (item_name like '%lorem%' and item_name like '%ipsum%') or
      (`desc` like '%lorem%' and `desc` like '%ipsum%');

这最容易概括为更多单词和更多列。

如果您愿意,可以将值连接在一起。但是,如果要在同一个字段中同时使用这两个值,则单独的逻辑会更清晰。

此外,如果您真的在寻找单词,那么全文搜索是一个不错的选择,并且会有更好的表现。

答案 2 :(得分:0)

declare @search varchar(255) = 'your search';

select * from [Person] p

WHERE (select COUNT(VALUE) from STRING_SPLIT(@search,' ') where CHARINDEX(VALUE,p.Name)>0) = (select COUNT(VALUE) from STRING_SPLIT(@search,' '));