开发者社区 问答 正文

如何构建数据以提高可搜索性

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

不同播放列表的流派和文件格式不同,有时在播放列表中也有所不同。还有一个“同义词”标签的概念(例如Urban可以覆盖嘻哈和R&B,但不能同时覆盖)。

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

福音:应返回至少包含一首福音歌曲的所有播放列表。带有所有福音歌曲的播放列表将首先显示。城市:应归还所有R&B和嘻哈音乐。所有城市轨道的播放列表都将排在第一位。hiphop:应该返回所有hiphop,但不能返回r&b。flac:应返回所有包含flac文件的播放列表。从纯粹的flac开始。hiphop flac:应该首先返回hiphop flac,然后再返回其他hiphop音频hiphop AND flac:应该仅返回hiphop flacs hiphop音频:应该返回hiphop flac,hiphop mp3等

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

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

表:播放列表(pk(id),desc)表:标记(pk(id),desc)表:playlist_has_tag(pk(link_id,tag_id))

解决市区==嘻哈|| 恩,我可能会添加一个tag_synonyms表:

表格:tag_synonyms(pk(tag_id,synonym_tag_id))

然后,我将有两条记录来指示Urban包含hiphop和rnb:urban的标签ID,hiphop的标签id urban的标签id,rnb的标签id

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

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

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

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

并且还包含持续时间等内容

问题来源于stack overflow

展开
收起
保持可爱mmm 2019-11-29 20:01:20 509 分享 版权
阿里云 AI 助理回答

针对您的音乐播放列表搜索应用程序的需求,确实需要一个灵活且高效的索引和查询方案。Lucene(以及基于它的Elasticsearch)是一个非常强大的全文搜索引擎,非常适合处理这种复杂查询场景。它支持多字段搜索、同义词管理、过滤器、排序等多种功能,能够满足您提到的大部分需求。

使用Elasticsearch的优势:

  1. 多字段搜索:您可以为每首歌曲或播放列表创建多个字段(如genre, format, tags等),并轻松实现对这些字段的组合查询。
  2. 同义词管理:Elasticsearch内置了同义词典功能,可以直接映射“Urban”到“Hip Hop”和“R&B”,无需额外的表来维护同义词关系。
  3. 复杂查询表达:使用Elasticsearch的Query DSL(Domain Specific Language),可以轻松构建像(hiphop OR house) AND file_type:mp3 AND artwork:no这样的复杂查询。
  4. 排序与评分:根据需求自定义结果排序逻辑,比如优先显示包含所有查询关键词的播放列表。
  5. 文件格式支持:虽然Elasticsearch本身不直接处理音频文件的格式问题,但它可以存储关于文件类型的信息,并据此进行筛选。

数据模型建议:

  • 播放列表文档:每个播放列表作为一条文档,包含其描述、标签列表、歌曲列表(含歌曲的流派、格式等信息)。
  • 标签字段:使用多值字段存储每个播放列表关联的所有标签。
  • 同义词设置:在Elasticsearch中配置同义词典,将“Urban”这类标签与其代表的具体流派建立映射。

与PostgreSQL对比:

虽然PostgreSQL也支持全文搜索和一些高级查询功能,但Elasticsearch在处理大规模数据集、高并发查询和复杂搜索逻辑方面更为高效和灵活。CouchDB则是一种NoSQL数据库,更侧重于文档存储和分布式部署,对于您的应用场景来说,可能不如Elasticsearch直接匹配。

结论:

鉴于您的需求,我强烈推荐考虑使用Elasticsearch。它不仅能够简化您的索引设计,还能有效支持未来扩展到更复杂的搜索需求。同时,Elasticsearch与多种后端技术(包括但不限于Java、Python、Node.js等)都有良好的集成支持,便于开发和维护。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: