例如,我們有以下字符串。 「The beatles - Imagine」 另外,我們在PostgreSQL裏有很多藝術家的名字。算法:通過數據庫從字符串中提取關鍵字
鑑於該字符串我想識別使用我的數據庫藝術家。
我正在尋找最優化,快速的算法/技術來做到這一點。因此遍歷數據庫中的所有記錄並查找子串是不適用的。
弦可以是「想象 - 披頭士」,「想象一下,披頭士」。就像Youtube視頻中的歌曲名稱一樣。
會Solr,ElasticSearch或其他技術在這裏有幫助嗎? 會喜歡這個怪胎的建議。
例如,我們有以下字符串。 「The beatles - Imagine」 另外,我們在PostgreSQL裏有很多藝術家的名字。算法:通過數據庫從字符串中提取關鍵字
鑑於該字符串我想識別使用我的數據庫藝術家。
我正在尋找最優化,快速的算法/技術來做到這一點。因此遍歷數據庫中的所有記錄並查找子串是不適用的。
弦可以是「想象 - 披頭士」,「想象一下,披頭士」。就像Youtube視頻中的歌曲名稱一樣。
會Solr,ElasticSearch或其他技術在這裏有幫助嗎? 會喜歡這個怪胎的建議。
這個問題有兩個部分。困難的部分是確定藝術家和標題。你有變化的種種:
其他也將包括專輯:
如果您有這些作爲一個任意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)
如果你能夠把它變成現場分離規範化的數據,您的搜索將變得更加強大,因爲你可以使用setweight
,ts_rank
,tsvector
拼接與||
等
原則上,如果數據庫中的任何記錄可能包含您的搜索字符串,那麼您將不得不搜索數據庫中的每條記錄。
你可以做的是使用像Rabin-Karp algorithm這樣的東西來同時搜索許多長度相同的搜索字符串:「Beatles The」,「The Beatles」。如果你忽略空格和/或標點符號,那麼你可能會減少更多的通行證:「披頭士樂隊」,「披頭士樂隊」,「披頭士樂隊」。克雷格林格的答案中的所有例子都是相同的長度,如果你只計算字母;你可以通過使用拉賓卡爾普一次通過數據庫找到所有這些匹配
另外,「披頭士,The」。 –
Erm ... s/Beatles/John Lennon – rossum