仅限年份的 Elasticsearch 范围过滤器

Elasticsearch Range filter with year only

我只需要使用弹性搜索来过滤年份数据。我正在使用 PHP 来获取和显示结果。这是我的JSON格式数据

 {    loc_cityname: "New York",
    location_countryname: "US",
    location_primary: "North America"
    admitted_date  : "1994-12-10"
 },
     {    loc_cityname: "New York",
    location_countryname: "US",
    location_primary: "North America"
    admitted_date  : "1995-12-10"
 },

我使用以下代码按年份过滤值。

$options='{
    "query": {
        "range" : {
            "admitted_date" : {
                "gte" : 1994,
                "lte" : 2000
            }
        }
    }, 
    "aggs" : {
    "citycount" : {
        "cardinality" : {
            "field" : "loc_cityname",
            "precision_threshold": 100
    }
   }
  }
}';

我如何过滤仅包含年份的结果。请有人帮我解决这个问题。

提前致谢,

您只需将 format parameter 添加到您的 range 查询中,如下所示:

$options='{
    "query": {
        "range" : {
            "admitted_date" : {
                "gte" : 1994,
                "lte" : 2000,
                "format": "yyyy"         <--- add this line
            }
        }
    }, 
    "aggs" : {
    "citycount" : {
        "cardinality" : {
            "field" : "loc_cityname",
            "precision_threshold": 100
    }
   }
  }
}';

更新 请注意,上述解决方案仅适用于 ES 1.5 及更高版本。对于以前版本的 ES,您可以改用 script 过滤器:

$options='{
  "query": {
    "filtered": {
      "filter": {
        "script": {
          "script": "(min..max).contains(doc.admitted_date.date.year)",
          "params": {
            "min": 1994,
            "max": 2000
          }
        }
      }
    }
  },
  "aggs": {
    "citycount": {
      "cardinality": {
        "field": "loc_cityname",
        "precision_threshold": 100
      }
    }
  }
}';

为了能够 运行 此 script 过滤器,您需要确保已在 elasticsearch.yml:

中启用脚本
script.disable_dynamic: false