基于优先级标记搜索相关故事

时间:2016-06-28 11:21:41

标签: java solr lucene related-content

我需要根据故事的标签搜索相关的故事..

说我有一个带有4个标签的故事,所以我的相关故事逻辑将是

  • 第1步:搜索故事下的所有4个标签>>展示故事

  • 第2步:搜索3个标签,创建不同的排列&与标签相关的组合>>展示故事

  • 第3步:搜索2个标签,创建不同的排列&与标签相关的组合>>展示故事
  • 第4步:一个接一个地搜索标签,如果找到则在“更像这个”字段中显示相同的内容。

我怎样才能做到这一点。我是索尔的新人请指导我......

1 个答案:

答案 0 :(得分:0)

托马斯在评论中提出的建议是一个好主意,但可能会给你错误的结果 - 例如,如果你有两个非常常见的标签,那么两个标签对于这两个故事来说是独一无二的。即:

  • 故事1(foo,bar,the,is)
  • 故事2(foo,bar,ask,barf)
  • 故事3(baz,bar,the,is)
  • ..用“the”和“is”作为标签重复数以千计的其他故事

如果在显示第一个条目时搜索tag:(foo OR bar OR the OR is),则可能获取故事2 - 因为它具有最“有价值”的标记(并且Solr的默认计算使用术语在文档中出现的次数除以它出现的文档总数。

最佳结果可能(这将取决于您的用例)仍然是故事2,但如果您确实想要获取与三个标签匹配的文档,你必须以不同的方式去做。

如果您需要第二个选项,可以使用函数查询来解决此问题:termfreq返回术语在文档中的次数(如果您的标记在文档中是不同的,那么这将是1)。 sum允许您对每个函数的值求和,如下所示:

sum(termfreq(tag, 'foo'), termfreq(tag, 'bar'), termfreq(tag, 'the'), termfreq('is')) 

..会为您用于排序的每个文档提供明确的标记计数。

您还可以选择使用自定义的相似度类,它会为每个术语返回相同的相似度得分(根据您使用的Solr版本,可以为每个字段设置相似度(而不仅仅是核心))。我不认为有一个,but there's plenty of examples available