3

我在这里做了很长时间的浏览器,但从来没有一个问题没有被问过。所以这里是:

我在使用 SOLR 搜索时遇到了问题,在 SOLR 上的一些搜索(比如 DVD 播放器)往往会在前 50 个结果中返回来自同一制造商的大量搜索结果。

现在假设我想为我的最终用户提供最好的搜索体验,以及我目录中最好的产品种类,我将如何提供一种缺点来减少同一品牌出现在搜索结果中超过 5 次。作为记录,我使用了一个相当标准的 DisMax 搜索处理程序。

这种逻辑只适用于非常广泛的查询,如“DVD 播放器”或“硬盘驱动器”,我自然不会用它来塑造“三星 DVD 播放器”的搜索结果。

我不知道 SOLR 是否有一个漂亮的功能可以自动执行此操作,或者我是否必须开始修改搜索处理程序逻辑。

4

3 回答 3

0

我没有使用过这个,但我相信字段折叠/分组将是你想要的。

http://wiki.apache.org/solr/FieldCollapsing

如果我正确理解此功能,它将通过对类似新闻故事进行分组来对类似的结果进行分组,就像http://news.google.com/所做的那样。

于 2012-06-14T17:30:52.600 回答
0

这里有一些想法,虽然我自己没有尝试过。

您可以使用 Solr 的 Carrot 插件对制造商的搜索结果进行聚类,然后将其提供给自定义 RequestHandler 以重新排序(从每个制造商集群中挑选樱桃)结果以实现多样性。

但是,该方法有一个缺点,您可能需要获取比必要更大的数据,其次搜索结果将是合成的。

于 2012-06-15T09:07:19.980 回答
-1

实现这一目标是一个漫长而复杂的过程,但值得一试。假设您要搜索的主要字段是一个名为标题的字段,首先您需要确保其中包含“dvd player”的所有文档具有相同的分数。您可以通过忽略 solr 评分参数来做到这一点,例如字段规范(设置 omitNorms=true)和术语频率(编写一个 solr 插件以忽略它)代码附加..

实施细节:

1) 编译如下类并放入Solr WEB-INF/classes


package my.package; 
import org.apache.lucene.search.DefaultSimilarity;

public class CustomSimilarity extends DefaultSimilarity {

public float tf(float freq) {
    return freq > 0 ? 1.0f : 0.0f;
}

}

  1. 在 solrconfig.xml 中使用这个新的相似类添加

相似度类="my.package.CustomSimilarity"

所有这些都将帮助您为标题中带有“dvd 播放器”的所有文档打分。之后,您可以定义一个随机类型的字段。然后,当您查询 solr 时,您可以先按分数排列,然后按随机字段排列。由于包含 DVD 播放器的所有文档的分数相同,结果将按随机字段排列,为客户提供目录中更好的产品种类。

于 2012-06-15T10:07:44.447 回答