Фильтр Elasticsearch Range только с годом

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

Как я могу отфильтровать результаты только по году. Пожалуйста, кто-нибудь, помогите мне исправить это.

Заранее спасибо,

0

Решение

Вам просто нужно добавить 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
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]