例如我们有以下字符串。 “甲壳虫乐队 - 想象” 此外,我们在 PostgreSQL 中有大量艺术家姓名列表。
鉴于该字符串,我想使用我的数据库来识别艺术家。
我正在寻找最优化、最快速的算法/技术来执行此操作。因此遍历数据库中的所有记录并查找子字符串是不适用的。
字符串可以是“Imagine - The beatles”、“Imagine, The Beatles”。就像 Youtube 视频中的歌曲名称一样。
Solr、ElasticSearch 或其他技术在这里会有帮助吗? 会喜欢一些极客的建议。
最佳答案
这个问题有两个部分。困难的部分是识别艺术家和标题。你有各种各样的变化:
- 甲壳虫乐队 - 想象一下
- 甲壳虫乐队 - 想象
- 想象 - 甲壳虫乐队
- 甲壳虫乐队,想象一下
- 想象一下,甲壳虫乐队
- 想象一下 - 甲壳虫乐队
其他也会包含相册:
- 想象 - 想象 - 甲壳虫乐队
如果您将这些随机混合在一起,那么您将很难处理它 - 将这些数据规范化为字段将需要一个包含“轨道名称”和“艺术家姓名”的数据库来尝试匹配有很多猜测。
我会做的是忽略整个困惑并将其扔给全文搜索引擎。
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
与 ||
等的连接
关于算法:通过数据库从字符串中提取关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21199457/