如何实现标签搜索?

时间:2014-07-28 07:51:55

标签: algorithm tags elasticsearch hashtag

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

2 个答案:

答案 0 :(得分:6)

好像你想要像inverted index

这样的东西

这是一个索引,对于每个术语(在您的情况下为hashtag),它包含一个包含此主题标签的文档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中的此数据结构。

答案 1 :(得分:3)

ElasticSearch将很好地处理这个问题,并且您有多种方法可以实现该行为。

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

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

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