我试图理解提升,如果提升是我问题的答案。 我有一个索引,它有不同类型的数据。 EG:指数动物。其中一个领域是动物类型。这个值可以是肉食性,食草性等。 现在当我们在搜索中查询时,我想在顶部显示食肉型的结果,然后是食草类型。 还有可能只显示一个类型的前3个结果,然后保留其他类型吗?
假设我们有一种名为蔬菜的食草类型。这将仅适用于食草动物类型。 现在,是否可以按如下方式指定提升规则: 提升等级: animaltype:肉食 然后是动物类型:草食性和蔬菜类:菠菜 然后动物类型:草食性和蔬菜田:胡萝卜
等。基本上提升各个领域的各个领域。我是这个概念的新手。获得一些输入/指导真的很有帮助。
谢谢, Kasturi Chavan
答案 0 :(得分:1)
你的例子更接近于排序而不是提升,因为你有一个优先级列表来确定每个文档的重要性 - 而提升(在Solr中)通常应用得更加流畅,这意味着没有硬类型为X的文档与Y类型之间的行。
但是 - 使用适当大的值进行提升实际上会给你相同的结果,将文档放入不同的分数“区域”,然后将为您提供您正在寻找的排序顺序。您可以通过在查询中附加debugQuery=true
来查看每个字词所贡献的分数。 Boosting说'具有此值的文档比具有不同值的文档重要z倍',但是如果文档仅包含来自搜索的低得分标记(通常是非常常见的单词),而其他文档包含高得分标记(不经常使用的词),后一文件可能仍然被认为更重要。
示例:搜索“city paris”,其中大多数文档包含单词“city”,但只有少数文档包含单词'paris'(但不包含city)。即使您提升分配到“德国”国家/地区的所有文件,city
贡献的分数可能仍然较低 - 即使提升因素比“巴黎”单独贡献的那样。这可能不会发生在现实生活中,但你应该知道增强实际上会发生什么变化。
使用edismax处理程序,您可以通过两种不同的方式应用提升 - 一种是使用boost=
,这是可乘法的,或使用bq=
或bf=
,这是添加剂。不同之处在于提升对最终得分的贡献。
对于您的示例,获取类似于您所要求的内容的最简单方法是使用bq
(提升查询):
bq=animaltype:Carnivorous^1000&
bq=animaltype:Herbivorous^10
这些提升可能足够大,可以将匹配这些查询的所有文档移动到自己的存储桶中,而无需在组之间移动。要像您的示例所示创建“不同级别”,您需要调整这些值(并且请记住,如果某些东西既食草又吃菠菜,则可以将多个提升应用于同一文档。)
另一种方法是使用query
,if
和类似函数创建函数查询,以生成可用作排序值的单个整数值。在索引文档时,如果它是静态的(您的示例是),也可以计算此值,然后按该字段排序。如果排序值发生变化,它将要求您重新索引文档,但这可能是一种简单有效的解决方案。
要实现“类型的前3个结果”,您可能希望查看Result grouping support - 这样就可以在单个字段中为每个值获取“x文档”。据我所知,除了进行多次查询(并排除已经从第二个查询中检索到的三个查询)之外,没有办法说“我希望其中三个位于顶部,其余来自其他值” )。通常,发出多个查询的效果就好(或更好)。