MySQL:搜索中间可能存在干扰字符的单词

时间:2015-05-10 23:47:17

标签: mysql

我存储歌曲的歌词,并允许通过将它们放在方括号(例如:[Dm7])之间来添加和弦。以下是我的数据库中存储的歌词示​​例:

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]等文字?如果是这样的话?请注意,方括号之间的和弦可能会有所不同。

2 个答案:

答案 0 :(得分:2)

您可能想要考虑fulltext索引,然后在where子句中使用match() against()。例如:

create fulltext index ftx on songs(lyrics);

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

demo here

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

'模糊'这场比赛可以用来提供比赛排名 - 最适合英语,这似乎是。例如:

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;

将按最佳匹配对结果进行排序,并返回匹配排名。

updated demo

fulltext索引也有一个布尔模式,正如同样的建议,可以用来强制结果包含或排除某些单词,如下所示:

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

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

答案 1 :(得分:1)

感谢@SvenB和他对this post的建议,这是我的回答。

REPLACE(col, SUBSTRING(col, (LOCATE('[', col)), LOCATE(']', col) - (LOCATE('[',  col)) + 1), '') LIKE '%fear by the side%'

它有点乱,但有效!我认为从长远来看,FULL TEXT搜索是基于其他评论的方式。