首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL搜索任意顺序的单词。

问SQL搜索任意顺序的单词。
EN

Stack Overflow用户
提问于 2015-09-30 18:36:17
回答 3查看 7.6K关注 0票数 8

考虑到这个模型:

代码语言:javascript
复制
+-----------+-------------+---------------------------+
|  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。

现在,我知道我可以做到这一点:

代码语言:javascript
复制
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数。有没有一种更容易/更有效的方法来处理这个问题?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-09-30 18:47:21

这种搜索需求听起来是全文搜索的一个很好的候选。

与传统的sql like搜索相比,全文搜索更像“搜索引擎”(或者至少可以是)。对于全文搜索,搜索单词的顺序并不重要,根据RDBMs,一些全文搜索功能允许查找同义词和过滤噪声词。

在大多数情况下,全文搜索要比like搜索快得多。这里是一篇关于在mysql中开始全文搜索的文章。

示例mySql全文搜索语法:

代码语言:javascript
复制
select *
from items
where match(item_name) against ('+lorem +ipsum' in boolean mode)

全文搜索确实有一定的要求(本文中的链接将详细介绍这些要求)。我没有亲自处理过mysql的全文搜索,或者我会列出步骤。如果你想朝那个方向走,那就足够让你开始了。

票数 14
EN

Stack Overflow用户

发布于 2015-09-30 19:09:19

我认为单独查找每个单词比较简单:

代码语言:javascript
复制
SELECT *
FROM items
WHERE (item_name like '%lorem%' and item_name like '%ipsum%') or
      (`desc` like '%lorem%' and `desc` like '%ipsum%');

这很容易推广到更多的词和更多的列。

如果您愿意,可以将这些值连接在一起。但是,如果您希望在同一个字段中同时使用这两个值,那么单独的逻辑就更清晰了。

另外,如果你真的在寻找单词,那么全文搜索是一个很好的选择,并且会有更好的性能。

票数 4
EN

Stack Overflow用户

发布于 2019-06-11 01:56:59

代码语言:javascript
复制
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,' '));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32873328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档