如何为可搜索性构建数据

时间:2008-10-09 01:28:44

标签: sql mysql search full-text-search search-engine

我正在编写专门针对音乐播放列表的搜索应用程序。

流派和文件格式从播放列表到播放列表不同,有时在播放列表中也存在差异。还有一个“同义”标签的概念(例如,城市将涵盖hiphop和r& b,但不是相反)。

以下是搜索字词列表和我的预期结果。

福音书:应该返回所有至少有一首福音歌曲的播放列表。将首先显示包含所有福音歌曲的播放列表。 都市:应该归还所有的r& b和hiphop。所有城市轨道的播放列表将首先出现。 hiphop:应该归还所有hiphop而不是r& b。 flac:应该返回包含flac文件的所有播放列表。从那些纯粹的flac开始。 hiphop flac:首先应该返回hiphop flacs,然后是其他hiphop音频 hiphop和flac:应该只返回hiphop flacs hiphop audio:应该返回hiphop flacs,hiphop mp3s等

由于我刚刚开始这个项目,我正在考虑将所有这些编入索引的最佳方法。像Lucene这样的全文搜索在这里有用吗?注意我没有任何描述这些播放列表的文字,但我可以生成一些。

我正在考虑将所有这些术语组织为“标签”并将它们存储在多对多数据库中。

table:播放列表(pk(id),desc) table:tag(pk(id),desc) table:playlist_has_tag(pk(link_id,tag_id))

解决城市== hiphop ||事情,我可能会添加一个tag_synonyms表:

table:tag_synonyms(pk(tag_id,synonym_tag_id))

然后我会有两条记录表明城市包含了hiphop和rnb: urban的标签id,hiphop的标签id urban的标签id,rnb的标签id

我觉得使用这种方法可能会使查询变得非常复杂。

CouchDB可以在这里使用吗?我目前正在使用PostgreSQL。是否有一些软件会使这种事情变得容易?

我希望将来能够深入挖掘并支持复杂的搜索术语,如:

(hiphop OR house)AND filetype:mp3 AND artwork:no

还包括持续时间等内容。

4 个答案:

答案 0 :(得分:2)

如果您在如何构建数据进行搜索时过于努力,那么您很可能会错过一个可能在您的应用中真正使用过的重要搜索。

或者(这是经验)你最终会重新发明各种索引技术。

我对lucene有一些经验(有java和.net版本,有一个C端口,但我不确定它现在有多活着) - 它可以用存储在任何结构中的数据做出惊人的事情

我喜欢沙发数据库的外观,只是取决于你想要尝试一些新的和强大的东西,或者去寻找(目前)相当强硬的东西:lucene。

答案 1 :(得分:1)

如果您的用户将成为定义查询的用户,则全文索引将为您提供最佳服务。只需创建一个自定义文本字段,该字段描述您想要搜索的每个属性,例如“urban filetype:pdf gospel”并搜索。

答案 2 :(得分:0)

好的,只是在这里集思广益 -

也许使用八进制或二进制将“格式”类型存储为位掩码?

http://www.nitrogen.za.org/viewtutorial.asp?id=17

RandB:1 街舞:2 福音:4 城市:8

现在,这些东西都是附加的。你知道如果某些东西被标记为Urban,你就不会在旗帜字段中存储“8”,但你将存储11 ... Urban&& HipHop&& RandB。这只是一些“商业智能”,你必须在某处拼写出来。

然后,您可以使用二进制比较来确定您正在寻找哪些标志。

答案 3 :(得分:-1)

我没有看到数据库软件如何在您的解决方案中发挥作用。

如果我是实现这一点的人,我首先要确保以规范化的方式捕获所有相关数据。这包括类别,艺术品,歌词等等。

这样做的主要优点是您对“复杂”搜索的想法实际上变得非常简单。