Solr面和而不是计数

Solr面和而不是计数,solr,lucene,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:

我是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的“计数”如何是文档花费的时间值的总和,而不是与facet匹配的文档的实际计数

想法#1: 我可以用支点:

q:*:*
&facet=true
&facet.pivot=hostname,time_spent
但是,这将返回每个唯一主机名的所有唯一时间值的计数。我可以在我的应用程序中手动总结,但这似乎是浪费

想法2 我可以使用统计模块:

q:*:*
&stats=true
&stats.field=time_spent
&stats.facet=hostname
然而,这有两个问题。首先,返回的结果包含所有主机名。这确实有问题,因为我的数据集有超过一百万个主机名。此外,返回的结果是未排序的-我需要按所花费的总时间降序呈现主机名

非常感谢您的帮助


谢谢

我相信您正在寻找的是一个聚合组件,但请注意,solr是一个全文搜索引擎,而不是数据库


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

如果Solr>=5.1,则可以:

刻面排序

字段或术语方面的默认排序是按桶计数 下降。我们可以选择按任意顺序进行升序或降序排序 每个bucket中出现的facet函数。例如,如果我们想要 要按平均价格查找顶级桶,我们需要添加排序:“x “描述”到上一个方面请求:

$ 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的博客:

对于您的用例,这将是:

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

在嵌套的facet中调用
sum()
仅在6.3.0中有效。

起初,我试图指导您结合其“facet”。但这一个将迭代所有100万个主机名。看看Yonik Seely的heliosearch:不幸的是,heliosearch不是我的选择-我被solr困住了。我现在也处于同样的困境。如果只有stats.facet支持所有facet选项(特别是facet.limit和facet.sort)…那么从Solr 5.1开始就有了对它的支持。我同意你的看法Solr是一个搜索引擎,如果你想聚合,你可以开发它或使用其他引擎。这仍然是一个神话。Solr是搜索优先的nosql。我们当然更多地将其用作nosql