例如我们有以下字符串。 “披头士乐队 - 想象一下” 另外,我们在PostgreSQL中有很多艺术家名字。
鉴于该字符串我想使用我的数据库识别艺术家。
我正在寻找最佳,快速的算法/技术来做到这一点。因此,迭代数据库中的所有记录并查找子字符串是不适用的。
字符串可以是“想象 - 披头士乐队”,“想象一下,甲壳虫乐队”。就像Youtube视频中的歌曲名称一样。
Solr,ElasticSearch或其他技术会对您有所帮助吗? 会喜欢这方面的一些极客建议。
答案 0 :(得分:2)
这个问题有两个部分。困难的部分是识别艺术家和头衔。你有各种各样的变化:
其他人也将包括专辑:
如果你将这些作为一个随机错误,那么你将很难处理 - 将这些数据规范化为字段将需要一个“轨道名称”和“艺术家名称”的数据库来尝试匹配有很多猜测。
我要做的就是忽略整个混乱并把它扔到全文搜索引擎上。
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
对字段进行加权匹配与||
等串联。
答案 1 :(得分:0)
原则上,如果数据库中的任何记录都包含您的搜索字符串,那么您将不得不搜索数据库中的每条记录。
你可以做的是使用类似Rabin-Karp algorithm的东西同时搜索你的搜索字符串的许多相同长度的版本:“Beatles The”,“The Beatles”。如果你忽略空格和/或标点符号,那么你可以更多地减少传球次数:“甲壳虫乐队”,“甲壳虫乐队”,“披头士乐队”。如果你只计算字母,Craig Ringer的答案中的所有例子都是相同的长度;您可以使用Rabin-Karp
在单个数据库中找到所有匹配项