【问题标题】:ElasticSearch Return only if Nested Date in range and occurs more than X timesElasticSearch 仅当嵌套日期在范围内并且出现超过 X 次时才返回
【发布时间】:2017-09-01 06:18:21
【问题描述】:

我正在尝试编写一个查询,如果文档在特定数据范围内有 X 次访问,则仅返回文档。即只有在“2017-01-01”和“2017-12-31”之间有2次访问时才返回guid-docA

 **Example Data Documents**
 {
  "_id": "guid-docA"
  "visits": [
        {
          "name": "Sarah",
          "visitDate": "2013-02-27T00:00:00.000Z"
        },
        {
          "name": "John",
          "visitDate": "2017-02-27T00:00:00.000Z"
        },
        {
          "name": "Jim",
          "visitDate": "2017-12-27T00:00:00.000Z"
        }
  ]
 },
 {
  "_id": "guid-docB"
  "visits": [
        {
          "name": "Brian",
          "visitDate": "2013-02-27T00:00:00.000Z"
        },
        {
          "name": "Kerri",
          "visitDate": "2016-02-27T00:00:00.000Z"
        },
        {
          "name": "Julia",
          "visitDate": "2017-12-27T00:00:00.000Z"
        }
  ] 
 }         

我已经尝试过脚本过滤器,如果访问次数大于 2 则可以返回数据,但我还没有弄清楚如果他们在给定年份的访问次数超过 1(或 X)次如何获取它。

"filter": {
    "script": {
      "script": "_source.visits.size() > 1"
    }
  }

不确定如何对指定的计数应用逻辑。

在此先感谢您。

【问题讨论】:

    标签: elasticsearch nested


    【解决方案1】:

    首先你需要确定visits字段是nestedNested datatype

    如果是这样,您可以使用带有must 子句和minimum_shold_mathc 的嵌套布尔查询

    类似的东西

      "query": {
        "nested": {
         "path": "visits",
         "query": {
           "bool": {
             "must": [
             {
              "range": {
                "visits.visitDate": {
                  "gte": "2017-01-01",
                  "lte": "2017-12-31"
                 }
               }
             }
           ],
           "minimum_number_should_match": 2
         }
       }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-05-22
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-14
      • 1970-01-01
      相关资源
      最近更新 更多