考虑到这个模型:
+-----------+-------------+---------------------------+
| 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中包含单词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同坐,神圣化,我觉得这可能会变得有点可笑,添加到查询的OR数。有没有一种更容易/更有效的方法来处理这个问题?
发布于 2015-09-30 18:47:21
这种搜索需求听起来是全文搜索的一个很好的候选。
与传统的sql like搜索相比,全文搜索更像“搜索引擎”(或者至少可以是)。对于全文搜索,搜索单词的顺序并不重要,根据RDBMs,一些全文搜索功能允许查找同义词和过滤噪声词。
在大多数情况下,全文搜索要比like搜索快得多。这里是一篇关于在mysql中开始全文搜索的文章。
示例mySql全文搜索语法:
select *
from items
where match(item_name) against ('+lorem +ipsum' in boolean mode)全文搜索确实有一定的要求(本文中的链接将详细介绍这些要求)。我没有亲自处理过mysql的全文搜索,或者我会列出步骤。如果你想朝那个方向走,那就足够让你开始了。
发布于 2015-09-30 19:09:19
我认为单独查找每个单词比较简单:
SELECT *
FROM items
WHERE (item_name like '%lorem%' and item_name like '%ipsum%') or
(`desc` like '%lorem%' and `desc` like '%ipsum%');这很容易推广到更多的词和更多的列。
如果您愿意,可以将这些值连接在一起。但是,如果您希望在同一个字段中同时使用这两个值,那么单独的逻辑就更清晰了。
另外,如果你真的在寻找单词,那么全文搜索是一个很好的选择,并且会有更好的性能。
发布于 2019-06-11 01:56:59
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,' '));https://stackoverflow.com/questions/32873328
复制相似问题