我有一个ES文档,其中包含以下字段“buydatefield”,“itemboughtfield”等。
如何进行ES查询,以便我可以在日期获得一个方面,然后购买项目?
{
"query":{"match_all":{}
},
"facets": {
"buydateFacet": {
"terms": {
"field": "buydatefield",
"all_terms": true
}
},
"itemboughtFacet": {
"terms": {
"field": "itemboughtfield",
"all_terms": true
}
}
}
}
以上为buyFacet和itemboughtFacet返回两个独立的方面。我想要的是获得“subfacets”,对于每个日期,有一个嵌套的计数为该日期的所有“购买的项目”。这可能吗?如果是这样,怎么样?
我想要一些输出,例如:
terms: [{
term: "Bannana",
// total: 11 bannanas
buydates:{
// 5/31/2013 bought 5 bannana
// 6/2/2013 bought 6 bannana
}
},
{
term: "Apple",
// total: 3 apples
buydates:{
// 5/30/2013 bought 2 apple
// 6/1/2013 bought 1 apple
}
},
]
另外,是否可以为构面指定日期范围?
答案 0 :(得分:1)
关于第一个问题 - 分面:
在Solr 4中,它被称为Facet Pivoting - 最后我检查它在群集配置中不起作用。我相信它是Lucene4规范的一部分,ES刚刚转向0.9。
这是一个经常被请求的功能:例如:http://elasticsearch-users.115913.n3.nabble.com/Pivot-facets-td2981519.html
然而,枢轴刻面往往很慢。
对于您的用例,您可以还添加一个字段,该字段是两个术语连接在一起的字符(管道|)之间,然后在该字段上的facet - 然后在您的前端解析subsrarchy并向用户展示。
然而,你所做的是从经济上增加独特的入场数量,这将损害表现。
答案 1 :(得分:1)
如果buydatefield
被编入索引作为日期字段,您可以使用elasticfacets中的FacetedDateHistogram(披露:作者是我以前的领导)。它给你一个“两级”方面:顶级相当于内置日期直方图,但是在每个桶中你可以放置你喜欢的任何其他方面,它只对那个桶中的值进行操作(这里你会说-facet on item buy)。
这不会为您提供您在示例中指定的内容,而是:
"buydatefacet": {
"_type": "faceted_date_histogram",
"entries": [
{
"time": 1356994800000, // buy date 25/01/2013
"facet": {
"_type": "terms",
"terms": [
{ "term": "apple", "count": 3 },
{ "term": "banana", "count": 1 }
],
"missing": 0,
"total": 4,
"other": 0
}
},
{ ... more days here ... }
]
}
当ES 1.0命中时,将以这种方式对嵌套方面提供某种更一般的内置支持,不限于顶层的日期直方图(they're renaming the notion to "Aggregations")。