繁体   English   中英

Elasticsearch Range过滤器仅包含年份

[英]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参数添加到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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM