如何在一个领域然后在弹性搜索中进行另一个方面?

时间:2013-06-04 01:26:44

标签: elasticsearch

我有一个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
  }
},

]

另外,是否可以为构面指定日期范围?

2 个答案:

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