Algorithm 算法:通过数据库从字符串中提取关键字
例如,我们有以下字符串。 “披头士-想象一下” 另外,我们在PostgreSQL中有一个巨大的艺术家名单 给定那个字符串,我想使用我的数据库识别艺术家 我正在寻找最优化、最快速的算法/技术来实现这一点。所以迭代数据库中的所有记录并寻找子字符串是不适用的 弦乐可以是“想象-披头士”,“想象,披头士”。就像Youtube视频中的歌曲名称一样 Solr、ElasticSearch或其他技术是否有帮助?Algorithm 算法:通过数据库从字符串中提取关键字,algorithm,postgresql,solr,information-extraction,Algorithm,Postgresql,Solr,Information Extraction,例如,我们有以下字符串。 “披头士-想象一下” 另外,我们在PostgreSQL中有一个巨大的艺术家名单 给定那个字符串,我想使用我的数据库识别艺术家 我正在寻找最优化、最快速的算法/技术来实现这一点。所以迭代数据库中的所有记录并寻找子字符串是不适用的 弦乐可以是“想象-披头士”,“想象,披头士”。就像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
与|
串联等方法对字段进行加权匹配,如果数据库中的任何记录都可能包含搜索字符串,则必须搜索数据库中的所有记录
您可以使用类似的工具同时搜索大量相同长度的搜索字符串:“甲壳虫乐队”,“甲壳虫乐队”。如果你忽略空格和/或标点符号,那么你也许可以减少更多的传球次数:“披头士”,“披头士,the”,“披头士the”。如果你只计算字母,克雷格·林格答案中的所有例子的长度都是相同的;你可以使用拉宾·卡普(Rabin Karp)以及“披头士乐队”.呃。。。s/披头士/约翰·列侬