我是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匹配的文档的实际计数。
我可以使用一个支点:
q:*:*
&facet=true
&facet.pivot=hostname,time_spent
但是,这将返回每个唯一主机名所花费的所有唯一时间值的计数。我可以手动在我的应用程序中总结这一点,但这似乎很浪费。
我可以使用统计模块:
q:*:*
&stats=true
&stats.field=time_spent
&stats.facet=hostname
然而,这有两个问题。首先,返回的结果包含 all 主机名。这真的有问题,因为我的数据集有超过1米的主机名。此外,返回的结果是未排序的 - 我需要按照花费的总时间减少的顺序渲染主机名。
非常感谢您对此的帮助!
谢谢!
答案 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。