仅限年份的 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
我只需要使用弹性搜索来过滤年份数据。我正在使用 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