首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL:搜索之间可能有干扰字符的单词

MySQL:搜索之间可能有干扰字符的单词
EN

Stack Overflow用户
提问于 2015-05-10 23:47:16
回答 2查看 69关注 0票数 1

我存储歌曲的歌词,还允许通过将和弦放在方括号(例如:[Dm7])中添加和弦。下面是存储在我的数据库中的歌词示例:

代码语言:javascript
复制
Left my fear [Dm7]by the side of the [B]road
Hear You[C] speak won't let[E] go
Fall to my knees
...

我想做的是在歌曲中寻找歌词。例如,我可能想搜索歌词fear by the side。问题是上面的示例中的[Dm7]不允许简单的LIKE搜索。

是否可以进行搜索(REGEX?)将文本(如[Dm7] )排除在查询之外?如果是的话,怎么做?请注意,方括号之间的和弦可能有所不同。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-11 00:07:58

您可能希望考虑一个fulltext索引,然后在where子句中使用match() against()。示例:

代码语言:javascript
复制
create fulltext index ftx on songs(lyrics);

select *
  from songs
    where match(lyrics) against('fear by the side');

这里的演示

匹配有点模糊,您不能使用布尔模式匹配,因为和弦两边没有空格,但是正常模式应该足够了。

比赛的“模糊性”可以用来提供比赛排名--这似乎是英语语言的最佳表现。例如:

代码语言:javascript
复制
select match(lyrics) against('fear by the side') rank, 
       lyrics from songs
  where match(lyrics) against('fear by the side') 
  order by match(lyrics) against('fear by the side') desc;

将结果按最佳匹配排序,并返回匹配级别。

更新演示

fulltext索引还具有布尔模式,该模式同样可以用于强制结果包含或排除如下某些单词:

match(column) against('+word -otherword' in boolean mode)将返回column包含word但没有otherword的所有行。

如果您愿意,您的全文索引也可以是多列。

票数 2
EN

Stack Overflow用户

发布于 2015-05-11 00:08:42

感谢@SvenB和他对这个职位的建议,这是我的答案。

代码语言:javascript
复制
REPLACE(col, SUBSTRING(col, (LOCATE('[', col)), LOCATE(']', col) - (LOCATE('[',  col)) + 1), '') LIKE '%fear by the side%'

有点乱七八糟,但很管用!我认为从长远来看,全文搜索是基于其他评论的方式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30157817

复制
相关文章

相似问题

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