如何在ElasticSearch中填充数据范围?

时间:2016-12-15 01:37:22

标签: nest elasticsearch-2.0

我有一个存储库,我的教学可以有0..n灵修,这适用于在我的列表中显示摘要信息。我有一个字段,总结了用于此目的的相关灵修的数量。问题是我想在列表旁边提供一个方面的摘要,以允许我的用户将教学列表限制为只有具有相关灵修的那些。

我发现如果在查询之前列出了我的聚合,那么查询将被完全忽略。这对我来说非常令人惊讶,所以我用JSON修复了我的查询。我不确定如何使用NEST强制执行正确的订单。

我的查询如下:

 {
   "size": 3,
   "sort": [ { "endDate": { "order": "desc" } } ],
   "aggs": {
     "teachers": {
      "terms": { "field": "teachings.teacher.id" }
     },
     "audio": {
       "terms": { "field": "teachings.hasAudio" }
     },
     "transcript": {
       "terms": { "field": "teachings.hasTranscript" }
    },
    "landmark": {
       "terms": { "field": "isLandmark" }
    },
    "devotionals": {
       "terms": { "field": "teachings.numberOfDevotionals" }
    }
  }
}

其余的聚合几乎可以满足我的需求。我可以获得教师列表,以及其他项目的真/假桶。 我不满意的部分是聚合中的"devotionals"子句。由于该字段是计数而不是布尔值,因此我可以使用{ {1}}聚合,我只是想知道教学是否任何灵修。

如何确定教学是否具有奉献精神?我一直在查看文档和直方图,因为我需要的水桶是" 0"和" 1或更多",而不是规则间隔。

1 个答案:

答案 0 :(得分:0)

截至目前,我还没有回答我使用ElasticSearch提出的问题。但是,我确实有以下方法从响应中计算出我想要的结果:

TermsAggregate hasDevotional = searchResponse.Aggs.Terms("devotionals");
int numDevotionals = (int)hasDevotional.Buckets
        .Where(b => float.Parse(b.Key) > 0)
        .Sum(b => b.DocCount);

几点说明:

  • 数字字段的存储分区键名称始终为浮点数(" 0.0"," 1.0")
  • DocCount属性为long

此解决方案并不漂亮,我真的希望能够计算"teachings.numberOfDevotionals"字段大于0的所有文档以及实际搜索结果。