我正在写一个搜索应用程序专门为音乐播放列表。
不同播放列表的类型和文件格式不同,有时在播放列表中也存在差异。还有一个“同义”标签的概念(例如urban将同时涵盖hiphop和r&b,但不是相反)。
下面是搜索条件和我的预期结果的列表。
福音:应该返回所有播放列表至少一首福音歌曲。所有福音歌曲的播放列表将首先显示。
市区:应返回所有R&B和嘻哈。同样,所有城市曲目的播放列表都会排在第一位。
嘻哈:应该返回所有嘻哈,但不是R&B。
flac:应该返回包含flac文件的所有播放列表。从那些纯flac开始。
hiphop flac:应先返回hiphop flac,然后返回其他hiphop音频
hiphop和flac:应该只返回hiphop flac
嘻哈音频:应返回嘻哈flacs、嘻哈mp3等
当我刚开始这个项目的时候,我在想最好的方法来索引所有这些。像lucene这样的全文搜索在这里有用吗?注意,我没有任何文字描述这些播放列表,但我可以生成一些。
我正在考虑将所有这些术语组织为“标记”,并将它们存储在数据库中。
表:播放列表(pk(id),desc)
表:标记(pk(id),desc)
表:播放列表有标记(pk(链接id,标记id))
为了解决urban==hiphop rnb的问题,我可能会添加一个tag_synonyms表:
表:tag_同义词(pk(tag_id,synonym_tag_id))
那么我有两个记录表明城市包含了嘻哈和RNB:
城市的标签号,嘻哈的标签号
城市标签号,RNB标签号
我觉得使用这种方法可能会使查询变得非常复杂。
这里能用得上吗?我正在使用PostgreSQL。有没有什么软件可以让这种事情变得简单?
我希望将来能够深入研究并支持复杂的搜索词,例如:
(嘻哈或家庭)和文件类型:MP3和艺术作品:否
也包括持续时间等。
最佳答案
如果你试图想太多如何组织你的数据进行搜索,很有可能你会错过一个重要的搜索,你可以在你的应用程序中真正使用。
或者(这是根据经验)你最终会重新发明各种索引技术。
我有一些关于Lucene的经验(有Java和.NET版本,有一个C端口,但我不知道这些日子有多活跃)-它可以用任何结构中存储的数据来做令人惊奇的事情。
我喜欢couch-db的外观,这取决于你有多想尝试一些新的、强大的东西,或者去尝试一些(目前)相当难对付的东西:lucene。