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