1

我们使用 Solr 的全文搜索功能,假设我们正在索引各种新闻文章的文本。

搜索所有文章非常简单;但是,用户可以“喜欢”他们觉得有趣的文章。

我正在尝试实现一个功能,每个用户都可以搜索他们的“喜欢的历史记录”。

我已经提出了几种可能的方法来做到这一点,但我不知道如何实际实施它们中的任何一种,如果它们甚至可以实施并且完全不知道在性能和效率方面哪个是最好的。

1)我想出的第一种方法是使用一个单独的 MySQL 数据库,其中每一行保存用户的 id 和用户喜欢的文章。

可以对 MySQL 表进行查询以返回任何用户喜欢的文章 ID,但是如何缩小 Solr 的搜索结果以仅返回具有从 MySQL 数据库中检索到的 ID 的文章?

2)我能想到的唯一另一种方法是在每次用户喜欢一篇文章时在另一个 Solr 核心中创建一个重复的文档,并添加一个 user_id 字段;但是,如果 100,000 左右的用户每人喜欢 100-1,000 篇文章,这将消耗不必要的存储空间。

第二种方法的另一个问题是,如果原文章的文本发生变化,那么为每个喜欢该文章的用户更新每个相关文档就成了另一个必须处理的麻烦问题。

3) 与第 2 种方法相同的想法,除了不创建重复文档,而是将包含“喜欢”信息的文档链接到包含“喜欢”文章的文档索引。

第二种方法是我知道可以完成并且知道如何实现的 3 种方法中唯一的一种,但是每当需要更新文章时,它似乎在存储和性能方面都是浪费的,这种情况经常发生。

按照我的逻辑,第三种和第一种方法似乎是更好的方法,按照这个顺序,如果 y 可以实现,但我肯定是错的。如果它们可以实现并且/是/最好的方法,您能否解释如何实现它们,如果没有,您认为使用方法 2 中描述的第二个 Solr 内核是否值得所需的额外存储空间和文章文本更改时需要大规模重新索引?

有没有更好的选择来做这种性质的事情?我不限于使用 Solr,我只是认为使用关系数据库会更好,因为它是用于全文索引的。

感谢您在我的问题上提供的任何信息。

更新:在 aitchnyu 的问题的答案中找到的 Solr 的 ExternalFileField 似乎很有希望。如果他们有一个字段来索引外部文件,那么有一种方法可以将一个文档的索引链接到另一个文档是有意义的。

4

1 回答 1

0

我会选择第一个选项。运行 SQL 查询,然后运行 ​​Solr 查询 - 但将过滤器查询 (fq) 参数设置为从数据库检索到的 ID 列表。过滤器查询用于提取返回的搜索结果的子集 - 在您的情况下,您只需要出现在特定用户的喜欢历史记录中的那些文档。

于 2012-07-17T18:21:28.813 回答