Sql 如何为可搜索性构建数据结构

Sql 如何为可搜索性构建数据结构,sql,mysql,search,full-text-search,search-engine,Sql,Mysql,Search,Full Text Search,Search Engine,我正在编写一个专门针对音乐播放列表的搜索应用程序 播放列表的类型和文件格式各不相同,有时在播放列表中也存在差异。还有一个“同义”标签的概念(例如,urban将涵盖hiphop和r&b,但不是相反) 下面是搜索词列表和我的预期结果 福音:应返回至少包含一首福音歌曲的所有播放列表。所有福音歌曲的播放列表将首先显示。 市区:应归还所有r&b和hiphop。同样,所有城市曲目的播放列表将排在第一位。 hiphop:应该返回所有hiphop,但不返回r&b。 flac:应返回包含flac文件的所有播放列表

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

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

下面是搜索词列表和我的预期结果

福音:应返回至少包含一首福音歌曲的所有播放列表。所有福音歌曲的播放列表将首先显示。 市区:应归还所有r&b和hiphop。同样,所有城市曲目的播放列表将排在第一位。 hiphop:应该返回所有hiphop,但不返回r&b。 flac:应返回包含flac文件的所有播放列表。从那些纯粹的flac开始。 hiphop flac:应该首先返回hiphop flac,然后返回其他hiphop音频 hiphop和flac:应仅返回hiphop flac hiphop音频:应返回hiphop FLAC、hiphop MP3等

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

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

表:播放列表(主键(id)、描述) 表:标签(主键(id)、描述) 表:播放列表有标签(主键(链接id,标签id))

为了解决urban==hiphop | | rnb问题,我可能会添加一个tag|u同义词表:

表:标记同义词(pk(标记id,同义词标记id))

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

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

CouchDB在这里有用吗?我目前正在使用PostgreSQL。有没有一些软件可以让这类事情变得简单

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

(hiphop或house)和文件类型:mp3和艺术品:否


还包括持续时间等内容。

如果你试图过多地思考如何构建搜索数据,你很可能会错过一个本可以在应用程序中真正使用的重要搜索

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

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


我喜欢couchdb的外观,这取决于你有多想尝试一些新的、强大的东西,或者去尝试一些(目前)已经相当成熟的东西:lucene

我不认为数据库软件会在您的解决方案中发挥什么作用

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


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

好的,在这里进行头脑风暴--

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

RandB:1 嘻哈音乐:2 福音:4 市区:8

现在,这些东西是相加的。你知道如果某个东西被标记为Urban,你不会在flag字段中存储“8”,但是你会存储11…Urban&&HipHop&&RandB。这只是一点“商业智能”,你必须在某个地方解释清楚


然后可以使用二进制比较来确定要查找的标志

如果您的用户将是定义查询的用户,则全文索引将为您提供最佳服务。只需创建一个自定义文本字段,描述您希望搜索的每个属性,例如“urban filetype:pdf Gorshold”,然后进行搜索。

我很好奇为什么每个评论都被删除了——它们似乎都很有说服力。我也很好奇!现在我给他们(大多数人)投了更高的票。终于公平了,5年后:-)