2014-01-18 26 views
0

例如,我們有以下字符串。 「The beatles - Imagine」 另外,我們在PostgreSQL裏有很多藝術家的名字。算法:通過數據庫從字符串中提取關鍵字

鑑於該字符串我想識別使用我的數據庫藝術家。

我正在尋找最優化,快速的算法/技術來做到這一點。因此遍歷數據庫中的所有記錄並查找子串是不適用的。

弦可以是「想象 - 披頭士」,「想象一下,披頭士」。就像Youtube視頻中的歌曲名稱一樣。

會Solr,ElasticSearch或其他技術在這裏有幫助嗎? 會喜歡這個怪胎的建議。

+0

另外,「披頭士,The」。 –

+1

Erm ... s/Beatles/John Lennon – rossum

回答

2

這個問題有兩個部分。困難的部分是確定藝術家和標題。你有變化的種種:

  • 披頭士, - 試想
  • 披頭士 - 想象一下,
  • 想象 - 披頭士
  • 披頭士,試想
  • 想象一下,披頭士
  • 想象一下 - 披頭士,

其他也將包括專輯:

  • 想象 - 想象 - 披頭士

如果您有這些作爲一個任意mismash你將有一個很難對付的是 - 這正常化數據到字段將需要一個「曲目名稱」和「藝術家名字」的數據庫試圖與之匹配,並進行大量猜測。

我會做的是忽略整個混亂,並把它扔到全文搜索引擎。

test=> select to_tsvector('simple', 'Beatles, The - Imagine'); 
      to_tsvector   
--------------------------------- 
'beatles':1 'imagine':3 'the':2 
(1 row) 

test=> select to_tsvector('simple', 'Beatles, The - Imagine') @@ to_tsquery('simple', 'Beatles'); 
?column? 
---------- 
t 
(1 row) 

如果你能夠把它變成現場分離規範化的數據,您的搜索將變得更加強大,因爲你可以使用setweightts_ranktsvector拼接與||

做場比賽加權
0

原則上,如果數據庫中的任何記錄可能包含您的搜索字符串,那麼您將不得不搜索數據庫中的每條記錄。

你可以做的是使用像Rabin-Karp algorithm這樣的東西來同時搜索許多長度相同的搜索字符串:「Beatles The」,「The Beatles」。如果你忽略空格和/或標點符號,那麼你可能會減少更多的通行證:「披頭士樂隊」,「披頭士樂隊」,「披頭士樂隊」。克雷格林格的答案中的所有例子都是相同的長度,如果你只計算字母;你可以通過使用拉賓卡爾普一次通過數據庫找到所有這些匹配