Как отфильтровать результаты поиска по заданному диапазону? - PullRequest
0 голосов
/ 16 января 2019

Это дополнительный вопрос для Как получить поле из двух полей в индексе Elasticsearch?

Как мне отфильтровать результат hour_bucket.buckets [] по диапазону (например, только от 10 до 12)

Пример, если поля start_date = 9 и end_date = 11 , hour_bucket.bucket [] должны иметь «ключ»: 10 и «ключ»: 11 (без учета 9).

Ожидаемый результат должен быть:

"aggregations" : {
    "room_bucket" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "room_V",
          "doc_count" : 1,
          "hour_bucket" : {
            "doc_count_error_upper_bound" : 0,
            "sum_other_doc_count" : 0,
            "buckets" : [
              {
                "key" : 11,
                "doc_count" : 1
              },
              {
                "key" : 12,
                "doc_count" : 1
              }
            ]
          }
        },
        {
          "key" : "room_Y",
          "doc_count" : 1,
          "hour_bucket" : {
            "doc_count_error_upper_bound" : 0,
            "sum_other_doc_count" : 0,
            "buckets" : [
              {
                "key" : 10,
                "doc_count" : 2
              },
              {
                "key" : 11,
                "doc_count" : 2
              },
              {
                "key" : 12,
                "doc_count" : 1
              }
            ]
          }
        }
      ]
    }
  }

Вот текущий запрос:

curl -XGET "https://localhost:9200/testindex/_search?pretty" -H 'Content-Type: application/json' -d'
{
  "aggs": {
    "room_bucket": {
      "terms": {
        "field": "room_name.keyword"
      },
      "aggs": {
        "hour_bucket": {
          "terms": {
            "script": {
              "inline": """
              return LongStream.rangeClosed(doc.start_date.value, doc.end_date.value).toArray();

""",
              "lang": "painless"
            },
            "order": {
              "_key": "asc"
            },
            "value_type": "long"
          }
        }
      }
    }
  }
}'

1 Ответ

0 голосов
/ 16 января 2019

Опираясь на решение упомянутого потока, мы можем добавить параметры в скрипт в разделе агрегации для дальнейшей фильтрации агрегированных результатов:

curl -XGET "https://localhost:9200/testindex/_search?pretty" -H 'Content-Type: application/json' -d'
{
  "aggs": {
    "room_bucket": {
      "terms": {
        "field": "room_name.keyword"
      },
      "aggs": {
        "hour_bucket": {
          "terms": {
            "script": {
              "inline": """
              def range = LongStream.rangeClosed(doc.start_date.value, doc.end_date.value);
              return range.filter(x -> x >= params.min && x <= params.max).toArray();

""",
              "lang": "painless",
              "params": {
                "min": 10,
                "max": 11
              }
            },
            "order": {
              "_key": "asc"
            },
            "value_type": "long"
          }
        }
      }
    }
  }
}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...