Мне нужно отфильтровать данные по году только с помощью упругого поиска. Я использую 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
Других решений пока нет …