Подтвердить что ты не робот

Несколько фильтров и совокупность результатов поиска elastics

Как я могу использовать фильтр в связи с агрегатом в elasticsearch?

Официальная документация дает только тривиальные примеры для filter и для aggregations и никаких формальных описание запроса dsl - сравните его, например с документацией postgres.

Через опрос я нашел следующий запрос, который принят elasticsearch (без ошибок синтаксического анализа), но игнорирует данные фильтры:

{
  "filter": {
    "and": [
      {
        "term": {
          "_type": "logs"
        }
      },
      {
        "term": {
          "dc": "eu-west-12"
        }
      },
      {
        "term": {
          "status": "204"
        }
      },
      {
        "range": {
          "@timestamp": {
            "from": 1398169707,
            "to": 1400761707
          }
        }
      }
    ]
  },
  "size": 0,
  "aggs": {
    "time_histo": {
      "date_histogram": {
        "field": "@timestamp",
        "interval": "1h"
      },
      "aggs": {
        "name": {
          "percentiles": {
            "field": "upstream_response_time",
            "percents": [
              98.0
            ]
          }
        }
      }
    }
  }
}

Некоторые люди предлагают использовать query вместо filter. Но официальная документация обычно рекомендует напротив для фильтрации точных значений. Другая проблема с query: в то время как фильтры предлагают and, query нет.

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

4b9b3361

Ответ 1

Я закончил использование агрегация фильтров - не отфильтрованный запрос. Итак, теперь у меня есть 3 вложенных элемента aggs.

Я также использую bool фильтр вместо and как рекомендуемый @alex-brasetvik из-за http://www.elasticsearch.org/blog/all-about-elasticsearch-filter-bitsets/

Моя окончательная реализация:

{
  "aggs": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "term": {
                "_type": "logs"
              }
            },
            {
              "term": {
                "dc": "eu-west-12"
              }
            },
            {
              "term": {
                "status": "204"
              }
            },
            {
              "range": {
                "@timestamp": {
                  "from": 1398176502000,
                  "to": 1400768502000
                }
              }
            }
          ]
        }
      },
      "aggs": {
        "time_histo": {
          "date_histogram": {
            "field": "@timestamp",
            "interval": "1h"
          },
          "aggs": {
            "name": {
              "percentiles": {
                "field": "upstream_response_time",
                "percents": [
                  98.0
                ]
              }
            }
          }
        }
      }
    }
  },
  "size": 0
}

Ответ 2

Поместите свой фильтр в filtered -query.

Верхний уровень filter предназначен для фильтрации только поисковых запросов, а не граней/агрегатов. Это было переименовано в post_filter в 1.0 из-за этой довольно распространенной путаницы.

Кроме того, вы можете посмотреть в этом сообщении о том, почему вы часто хотите использовать bool, а не and/or: http://www.elasticsearch.org/blog/all-about-elasticsearch-filter-bitsets/

Ответ 3

more on @geekQ answer: чтобы поддерживать строку фильтра с пробелом char, для поиска в многостраничном поиске используйте ниже:

{   "aggs": {
    "aggresults": {
      "filter": {
        "bool": {
          "must": [
            {
              "match_phrase": {
                "term_1": "some text with space 1"
              }
            },
            {
              "match_phrase": {
                "term_2": "some text with also space 2"
              }
            }
          ]
        }
      },
      "aggs" : {
            "all_term_3s" : {
                "terms" : {
                    "field":"term_3.keyword",
                    "size" : 10000,
                    "order" : {
                        "_term" : "asc" 
                    }
                }
           }
        }
    }   },   "size": 0 }