【问题标题】:SOLR Query parameters to avoid flooding with the same manufacturerSOLR查询参数,避免同厂家泛滥
【发布时间】:2012-06-17 16:52:56
【问题描述】:

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

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

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

这种逻辑只适用于“DVD Players”或“Hard Drives”等极其广泛的查询,我自然不会使用它来塑造“Samsung DVD Players”的搜索结果。

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

【问题讨论】:

  • 你找到解决办法了吗?

标签: search solr


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的提示!不幸的是,我研究了分组,它看起来涉及弄乱产品的顺序(我已经有一个我想保留的评分系统)。我宁愿不返回按制造商分组的结果,而且看起来没有一种方法可以对结果进行排序而不管组是什么(有点违背组功能的目的:)我当前的产品列表页面是产品网格,我正在根据类别寻找丰富的制造商选择。
【解决方案2】:

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

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

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

【讨论】:

  • 因为我没有特定的制造商列表或我想从该制造商那里提取的特定数量的结果,所以我觉得这将是一种非常严格的实施方式。我确实喜欢 Carrot 的想法,但我可能正在从事另一个项目。感谢您的提示!
【解决方案3】:

实现这一目标是一个漫长而复杂的过程,但值得一试。假设您要搜索的主要字段是一个名为标题的字段,首先您需要确保其中包含“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 中使用这个新的相似类添加

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

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

【讨论】:

  • 嗨 Suryansh 这可能是我必须采用的方法。我会开始处理这个问题,再次感谢您的帮助 - Dave
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多