Solr facet sum而不是count

时间:2014-08-13 23:29:28

标签: solr lucene

我是Solr的新手,我对实现一个特殊的方面感兴趣。

示例文件:

{ hostname: google.com, time_spent: 100 }
{ hostname: facebook.com, time_spent: 10 }
{ hostname: google.com, time_spent: 30 }
{ hostname: reddit.com, time_spent: 20 }
...

我想返回一个具有以下结构的方面:

{ google.com: 130, reddit.com: 20, facebook.com: 10 }

尽管solr返回值比这更详细,但重要的一点是facet的“计数”是文档的time_spent值的总和,而不是与facet匹配的文档的实际计数。

想法#1:

我可以使用一个支点:

q:*:*
&facet=true
&facet.pivot=hostname,time_spent

但是,这将返回每个唯一主机名所花费的所有唯一时间值的计数。我可以手动在我的应用程序中总结这一点,但这似乎很浪费。

想法#2

我可以使用统计模块:

q:*:*
&stats=true
&stats.field=time_spent
&stats.facet=hostname

然而,这有两个问题。首先,返回的结果包含 all 主机名。这真的有问题,因为我的数据集有超过1米的主机名。此外,返回的结果是未排序的 - 我需要按照花费的总时间减少的顺序渲染主机名。

非常感谢您对此的帮助!

谢谢!

2 个答案:

答案 0 :(得分:6)

使用Solr> = 5.1,这是可能的:

  

分面排序

     

字段或术语构面的默认排序是按桶数计算的   降。我们可以选择按任意升序或降序排序   每个桶中出现的构面功能。例如,如果我们想要的话   按平均价格查找顶部桶,然后我们将添加sort:“x   desc“到上一个方面的要求:

$ curl http://localhost:8983/solr/query -d 'q=*:*&
 json.facet={
   categories:{
     type : terms,
     field : cat,
     sort : "x desc",   // can also use sort:{x:desc}
     facet:{
       x : "avg(price)",
       y : "sum(price)"
     }
   }
 }
'

见Yonik的博客:http://yonik.com/solr-facet-functions/

对于您的用例,这将是:

json.facet={
  hostname_time:{
    type: terms,
    field: hostname,
    sort: "time_total desc",
    facet:{
      time_total: "sum(time_spent)",
    }
  }
}

在嵌套方面调用sum()仅适用于6.3.0。

答案 1 :(得分:0)

我相信你要找的是一个聚合组件,但要注意solr是一个全文搜索引擎,而不是数据库。

所以,回答你的问题是,按照想法#1。否则你应该使用Elastics Search或MongoDB甚至是配备了这种聚合组件的Redis。