2015-05-10 53 views
1

我存儲歌曲的歌詞並且還允許通過將它們放在方括號(例如:[Dm7])之間來添加和絃。這裏是歌詞存儲在我的數據庫中的一個例子:MySQL:搜索可能具有干擾字符的詞

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搜索。

是否可以從查詢中排除[Dm7]之類的文本進行搜索(REGEX?)?如果是這樣如何?請注意,方括號之間的和絃可能會有所不同。

+1

您可以將它拆分爲單詞並在它們之間添加通配符。從[開始]開始的替換將是更好的解決方案。 http://stackoverflow.com/questions/21917673/sql-query-bracket-replacing-all-text-with-a-single-character這個問題可能會幫助 –

+0

是懶惰的。存儲歌詞的兩個副本 - 一個與和絃,一個沒有 –

+0

@pala_我試圖避免懶惰,但我已經考慮過,如果沒有簡單的方法。 –

回答

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

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

+0

似乎很好地工作!你可以添加一個litle explenation? –

+0

@pala_嗯唯一的問題我在這裏面對的是它不是一個文字匹配。因爲它是完整文本,它似乎會選擇其他歌詞,但不是所有這些詞......不知道是否有辦法使其成爲文字或如果我必須使用我的其他代碼。 –

+0

@BenSinclair正確 - 它很模糊,但它也有模糊排名。我認爲這將適用於歌詞搜索,考慮一個或兩個單詞被誤讀或拼寫錯誤的頻率。我實際上剛剛完成添加有關如何使用它的信息 –

1

感謝@SvenB和他的建議this post,這是我的答案。

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

這有點凌亂,但工程!我認爲從長遠來看,全文搜索是基於其他評論的方式。

+0

此方法似乎需要事先知道文本中有多少和絃? –

+0

@pala_從我的測試中,不知道和絃的數量似乎工作。我將提供全文選項並比較性能。我認爲FULL TEXT將會更好,因爲它是內置的。感謝您的回答! –

+0

嘗試尋找'在路邊恐懼'而不是 - 它不會工作。這隻能擺脫第一個和絃 - 不是所有的和絃 –