【问题标题】:How to implement Tag search?如何实现标签搜索?
【发布时间】:2014-07-29 04:37:25
【问题描述】:

我设计了一个新闻中心系统,它读取 Rss 链接并将整个新闻存储在数据库中。现在我想实现一个使用标签的搜索系统。每个新闻都有自己的标签。有很多算法可以实现这一点,但我不知道什么是最常见的以获得最佳性能。目前我正在使用弹性搜索数据库,并且我使用多个关键字搜索。其中哪一个是最好的?
1-将标签存储在带有分隔符的列表或字符串中并在其中搜索? 2-像关系系统一样工作,有一个标签表和一个新闻标签表,每个新闻标签都有一条记录。一条新闻的 5 个标签的 5 条记录 3-另一种我不知道的算法

【问题讨论】:

  • 数据的规模是多少?有多少篇文章?有多少标签?
  • 数以百万计的文档。带有数千个哈希标签

标签: algorithm tags elasticsearch hashtag


【解决方案1】:

好像你想要inverted index这样的东西

这是一个索引,对于每个术语(在您的情况下为主题标签)都包含一个包含此主题标签的文档 ID 列表。

例如,如果您有 3 个文档:d1,d2,d3 带有哈希标签:

d1: #tag1, #tag2
d2: #tag3
d3: tag3, #tag2

倒排索引将是:

#tag1: d1
#tag2: d1,d3
#tag3: d2,d3

使用倒排索引查找包含某个术语(在您的情况下为标签)的所有文档是相当容易的,只需查看附加到该术语的列表即可。
这种数据结构对于联合(或查询)和交集(和查询)也非常有效。

这个DS在全文搜索的信息检索中非常流行,也经常用于半结构化搜索。

有关更多信息,您可以阅读有关Information Retrieval 的一般信息。 Mannings Introduction to Information Retrieval 表示the book's first chapter 中的这个数据结构。

【讨论】:

  • 我必须自己实现它还是像 Elastic Search 这样的数据库可以为我处理这个问题?
【解决方案2】:

ElasticSearch 可以很好地处理这个问题,并且您可以通过多种方式来实现该行为。

您想要的是新闻文章(父)与其标签(子)之间的父子关系。

根据您是否需要在索引新闻文章后更新主题标签,您可以将它们存储在新闻文章中或作为指向新闻文章文档的单独文档作为其父文档。 在此处查看更多详细信息:http://www.elasticsearch.org/blog/managing-relations-inside-elasticsearch/

您提到了将标签存储为列表或逗号分隔字符串之间的选择。使用列表,因为它更惯用,并且 ElasticSearch 可以处理 json 对象(您实际上会分析字符串并将其转换为令牌列表)。

【讨论】:

  • 你有完整的系统设计说明来支持这个标签架构吗?
猜你喜欢
  • 2011-01-27
  • 1970-01-01
  • 2013-03-07
  • 2021-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
相关资源
最近更新 更多