我存储歌曲的歌词,并允许通过将它们放在方括号(例如:[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]
等文字?如果是这样的话?请注意,方括号之间的和弦可能会有所不同。
答案 0 :(得分:2)
您可能想要考虑fulltext
索引,然后在where子句中使用match() against()
。例如:
create fulltext index ftx on songs(lyrics);
select *
from songs
where match(lyrics) against('fear by the side');
匹配有点模糊,你不能使用布尔模式匹配,因为和弦的两边都没有空格,但正常模式应该足够了。
'模糊'这场比赛可以用来提供比赛排名 - 最适合英语,这似乎是。例如:
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
的所有行。
如果您愿意,您的全文索引也可以是多列。
答案 1 :(得分:1)
感谢@SvenB和他对this post的建议,这是我的回答。
REPLACE(col, SUBSTRING(col, (LOCATE('[', col)), LOCATE(']', col) - (LOCATE('[', col)) + 1), '') LIKE '%fear by the side%'
它有点乱,但有效!我认为从长远来看,FULL TEXT搜索是基于其他评论的方式。