Elasticsearch php: объединения документов с интервалом дат - PullRequest
0 голосов
/ 13 ноября 2018

Я пытаюсь построить граненый поиск, используя Elasticsearch-php 6.0, но мне трудно понять, как использовать агрегацию диапазона дат. Вот что я пытаюсь сделать:

Образец картирования:

"mappings": {
  "_doc": {
    "properties": {
      ...
      "timeframe": {
        "properties": {
          "gte": {
            "type": "date",
            "format": "yyyy"
          },
          "lte": {
            "type": "date",
            "format": "yyyy"
          }
        }
      }
      ...

В моем документе у меня есть это свойство:

"timeframe":[{"gte":"1701","lte":"1800"}]

Я хочу иметь возможность отображать фасет с помощью ползунка диапазона дат, где пользователь может ввести диапазон (минимальное значение - максимальное значение). В идеале эти значения min-max должны возвращаться агрегацией Elasticsearch автоматически с учетом текущего запроса.

Вот агрегация, которую я пытаюсь написать в «псевдокоде», чтобы дать вам идею:

"aggs": {
  "date_range": {
      "field": "timeframe",
      "format": "yyyy",
      "ranges": [{
          "from": min(timeframe.gte),
          "to": max(timeframe.lte)
      }]
  }
}

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

Имейте в виду, что я могу изменить отображение и / или структуру документа, если это не правильный способ достижения этого.

Спасибо!

1 Ответ

0 голосов
/ 07 марта 2019

Что касается меня с официальным пакетом «эластичный поиск / эластичный поиск» самой ЭС, я смог найти ряд необходимых мне документов с этим документом.Вам нужно прочитать документацию, так как вам понадобится формат.

$from_date = '2018-03-08T17:58:03Z';
$to_date = '2018-04-08T17:58:03Z';
$params = [
        'index' => 'your_index',
        'type'  => 'your_type',
        'body'  => [
            'query' => [
                'range' => [
                    'my_date_field' => [
                        //gte = great than or equal, lte = less than or equal
                        'gte'    => $from_date,
                        // 'lte'     => $to_date,
                        'format' => "yyyy-MM-dd||yyyy-MM-dd'T'HH:mm:ss'Z'",
                        'boost'  => 2.0
                    ]
                ]
            ],
        ]
    ];
    $search = $client->search($params);
...