Elasticsearch Range过滤器仅限年份

时间:2015-10-13 07:36:46

标签: php elasticsearch elasticsearch-jdbc-river

我需要使用弹性搜索过滤年份数据。我正在使用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
    }
   }
  }
}';

如何使用年份过滤结果。请有人帮我解决这个问题。

提前致谢,

1 个答案:

答案 0 :(得分:1)

您只需将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