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 返回了两个独立的方面。我想要的是获得“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
  }
},

]

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

4

2 回答 2

1

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

在 Solr 4 中,它被称为 Facet Pivoting——最后我检查了它在集群配置中不起作用。

我相信它是 Lucene4 规范的一部分,ES 刚刚转向 0.9。

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

然而,枢轴刻面往往非常缓慢。

对于您的用例,您还可以添加一个字段,该字段是将两个术语与一个字符(竖线|)连接在一起,然后在该字段上添加分面——然后在您的前端解析层次结构并显示给用户。

但是,您正在做的是大幅增加独特整体的数量,这会损害性能。

于 2013-06-04T21:49:26.390 回答
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 出现时,将以这种方式对嵌套方面提供某种更通用的内置支持,而不仅限于顶层的日期直方图(他们将概念重命名为“聚合”)。

于 2013-08-28T07:14:01.593 回答