我们正在使用Solr的全文搜索功能,假设我们正在索引各种新闻文章的文本。
搜索所有文章就像简单一样简单;但是,用户可以“喜欢”他们感兴趣的文章。
我正在尝试实现一个功能,每个用户都可以搜索他们的“历史记录”。
我已经提出了几种可行的方法,但我不知道如何实际实现它们,如果它们甚至可以实现,并且完全不知道哪种方法在性能和效率方面最好。
1)我提出的第一个方法是使用一个单独的MySQL数据库,其中每一行都包含用户的id和用户喜欢的文章。
可以对MySQL表进行查询以返回任何用户喜欢的文章ID,但是如何将Solr的搜索结果缩小到只返回带有从MySQL数据库检索的ID的文章?
2)我唯一能想到的另一种方法是在另一个Solr核心中创建一个重复的文档,每次用户喜欢一篇文章时都会添加一个user_id字段;但是,如果100,000个左右的用户都喜欢100-1,000篇文章,那么这会占用不必要的存储空间。
第二种方法的另一个问题是,如果原始文章的文本被更改,则为每个喜欢该文章的用户更新每个相关文档将成为另一个必须处理的麻烦问题。
3)与第二种方法相同的想法,除了不创建重复文档之外,文档包含指向包含“喜欢”文章的文档索引的“喜欢”信息链接。
第二种方法是我知道可以完成并且知道如何实现的3种方法中的唯一方法,但是任何时候需要更新文章时都会出现存储方式和性能方面的浪费,这种情况经常发生。 / p>
按照我的逻辑,第三种和第一种方法似乎是优越的方式,按顺序,如果y可以实现,但我肯定是错的。如果它们可以实现和/是/最好的方法,你能解释如何实现它们,如果没有,你认为使用方法2中描述的第二个Solr核心是否值得所需的额外存储空间和当文章的文字发生变化时需要进行大量的重新索引?
有没有更好的选择做这种性质的事情?我不仅限于使用Solr,我只是认为使用关系数据库会更好,因为它用于全文索引。
非常感谢你能解决我的问题。
更新: 在aitchnyu问题的答案中找到的Solr的ExternalFileField似乎很有希望。如果他们有一个索引外部文件的字段,那么有一种方法可以将一个文档的索引链接到另一个文档。
答案 0 :(得分:0)
我会选择第一个选项。运行SQL查询,然后运行Solr查询 - 但将过滤器查询(fq)参数设置为从数据库中检索的ID列表。过滤查询用于提取返回的搜索结果的子集 - 在您的情况下,您只需要在特定用户中出现的那些文档,例如历史记录。