Эластичный запрос на сравнение 2 полей (с использованием Java) - PullRequest
0 голосов
/ 04 ноября 2018

У меня есть индекс в моем эластичном поиске, и я хочу запросить сравнение двух полей даты. при условии, что имена полей creationDate и modifiedDate. Я хочу получить все документы, в которых эти две даты совпадают.

Я знаю, что можно было использовать FilteredQuery, который устарел прямо сейчас. что-то вроде следующего кода:

FilteredQueryBuilder query = QueryBuilders.filteredQuery(null,
    FilterBuilders.scriptFilter("doc['creationDate'].value = doc['modifiedDate'].value"));

Также возможно написать сценарии вручную в виде строки, но я сомневаюсь, что это правильное решение. Любая идея создать правильный запрос будет принята с благодарностью.

1 Ответ

0 голосов
/ 05 ноября 2018

Отфильтрованные запросы были заменены bool/filter запросами. Вы можете сделать это так:

BoolQueryBuilder bqb = QueryBuilders.boolQuery()
    filter(QueryBuilders.scriptQuery("doc['creationDate'].value = doc['modifiedDate'].value"));

Однако вместо использования сценариев во время поиска лучше создать новое поле во время индексации, которое будет содержать информацию о том, являются ли creationDate и modifiedDate одинаковыми датами. Затем вы можете просто проверить этот флаг во время запроса, он будет гораздо более оптимальным и быстрым.

Если вы не хотите переиндексировать все свои данные, вы можете обновить их все с этим флагом, просто запустите обновление по запросу, как показано ниже:

POST my-index / _update_by_query

{
  "script": {
    "source": """
    def creationDate = Instant.parse(ctx._source.creationDate);
    def modifiedDate = Instant.parse(ctx._source.modifiedDate);
    ctx._source.modified = ChronoUnit.MICROS.between(creationDate, modifiedDate) > 0;
    """,
    "lang": "painless"
  },
  "query": {
    "match_all": {}
  }
}

И тогда ваш запрос будет просто

BoolQueryBuilder bqb = QueryBuilders.boolQuery()
    filter(QueryBuilders.termQuery("modified", "false");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...