2013-06-04 166 views
2

我有一个ES文档,其中包括以下字段“buydatefield”,“itemboughtfield”。如何在弹性搜索的一个领域然后另一个领域?

如何制作ES查询,以便我可以在日期上获得方面,然后购买物品?

{ 
"query":{"match_all":{} 
}, 
"facets": { 
    "buydateFacet": { 
    "terms": { 
     "field": "buydatefield", 
     "all_terms": true 
    } 
    }, 
    "itemboughtFacet": { 
    "terms": { 
     "field": "itemboughtfield", 
     "all_terms": true 
    } 

    } 
} 

} 

上面为buyFacet和itemboughtFacet返回了两个单独的构面。我想要的是在每个日期的“子面”中,对于该日期所有“购买的物品”都有一个嵌套计数。这可能吗?如果是这样,怎么样?

我想一些输出,例如:

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 
    } 
}, 

] 

而且,是有可能指定面的日期范围?

回答

1

关于第一个问题 - 子刻面:

Solr中4,它被称为小关节的枢转 - 最后我检查没有在群集配置中的工作,虽然。

我相信它是Lucene4规范的一部分,ES刚刚推出了0.9。

这是一个经常被要求的功能:例如:http://elasticsearch-users.115913.n3.nabble.com/Pivot-facets-td2981519.html

然而支点刻面往往是相当缓慢。

为了您的使用情况,你可以添加一个字段是一个字符(管道|)连接在一起的两个词之间,然后面在该场 - 然后在前端解析hirerarchy和显示器用户。

然而,你所做的是在财政上增加独特的实体数量,这会损害性能。

1

如果buydatefield被索引为日期字段,您可以使用elasticfacets(揭示:作者是我的前导)的FacetedDateHistogram。它给了你一个“双层”的方面:顶层相当于内置日期直方图,但在每个桶中,你可以放置任何你喜欢的其他方面,它只对那个桶中的值进行操作(在这里你可以定义面对购买的物品)。

这会不会给你在你的例子说明什么挺,而是:

"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")。