Объедините два упругих запроса в 1. Как? - PullRequest
0 голосов
/ 06 марта 2019

У меня есть два запроса, которые извлекают результаты при выполнении операции GET. 1-й запрос -

{
  "query": {
    "bool": {
      "must": [
        {
          "query_string": {
            "query": "*",
            "analyze_wildcard": true
          }
        },
        {
          "range": {
            "database-status.meta.current-time": {
              "lte": "now-91d/d"
            }
          }
        }
      ],
      "must_not": []
    }
  },
  "size": 0,
  "_source": {
    "excludes": []
  },
  "aggs": {
    "2": {
      "date_histogram": {
        "field": "database-status.meta.current-time",
        "interval": "1h",
        "time_zone": "CST6CDT",
        "min_doc_count": 1
      },
      "aggs": {
        "3": {
          "terms": {
            "field": "database-status.name.keyword",
            "size": 500,
            "order": {
              "1": "desc"
            }
          },
          "aggs": {
            "1": {
              "sum": {
                "field": "database-status.status-properties.rate-properties.cache-properties.compressed-tree-cache-hit-rate.value",
                "script": "_value/60"
              }
            }
          }
        }
      }
    }
  }
}

и второй запрос -

{
  "query": {
    "bool": {
      "must": [
        {
          "query_string": {
            "query": "*",
            "analyze_wildcard": true
          }
        },
        {
          "range": {
            "database-status.meta.current-time": {
              "lte": "now-91d/d"
            }
          }
        }
      ],
      "must_not": []
    }
  },
  "size": 0,
  "_source": {
    "excludes": []
  },
  "aggs": {
    "2": {
      "date_histogram": {
        "field": "database-status.meta.current-time",
        "interval": "1h",
        "time_zone": "CST6CDT",
        "min_doc_count": 1
      },
      "aggs": {
        "3": {
          "terms": {
            "field": "database-status.name.keyword",
            "size": 500,
            "order": {
              "1": "desc"
            }
          },
          "aggs": {
            "1": {
              "sum": {
                "field": "database-status.status-properties.rate-properties.cache-properties.compressed-tree-cache-miss-rate.value",
                "script": "_value/60"
              }
            }
          }
        }
      }
    }
  }
}

Как мне объединить два запроса в один запрос и получить оба результата в одинаковых наборах результатов? Исходя из этого, я попытаюсь скопировать метод с другими запросами и даже попытаться объединить 3 или более запросов в 1.

Ответы [ 2 ]

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

Я использовал вложенную агрегацию. Вот комбинированный код -

{
  "query": {
    "bool": {
      "must": [
        {
          "query_string": {
            "query": "*",
            "analyze_wildcard": true
          }
        },
        {
          "range": {
            "server-status.meta.current-time": {
              "lte": "now-91d/d"
            }
          }
        }
      ],
      "must_not": []
    }
  },
  "size": 0,
  "_source": {
    "excludes": []
  },
  "aggs": {
    "time-interval": {
      "date_histogram": {
        "field": "server-status.meta.current-time",
        "interval": "1h",
        "time_zone": "CST6CDT",
        "min_doc_count": 1
      },
      "aggs": {
        "http-server": {
          "terms": {
            "field": "server-status.type.keyword",
            "include": "http-server",
            "size": 500,
            "order": {
              "1": "desc"
            }
          },
          "aggs": {
            "1": {
              "sum": {
                "field": "server-status.status-properties.expanded-tree-cache-hit-rate.value",
                "script": "_value/60"
              }
            },
            "2": {
              "sum": {
                "field": "server-status.status-properties.expanded-tree-cache-miss-rate.value",
                "script": "_value/60"
              }
            },
            "3": {
              "terms": {
                "field": "server-status.name.keyword",
                "size": 500,
                "order": {
                  "1": "desc"
                }
              },
              "aggs": {
                "1": {
                  "sum": {
                    "field": "server-status.status-properties.expanded-tree-cache-hit-rate.value",
                    "script": "_value/60"
                  }
                },
                "2": {
                  "sum": {
                    "field": "server-status.status-properties.expanded-tree-cache-miss-rate.value",
                    "script": "_value/60"
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}
0 голосов
/ 06 марта 2019

Для этого есть два варианта:

  1. с использованием multi search (msearch) позволит вам выполнить один запрос к ES, содержащий оба запроса. Ответ msearch будет содержать ответы на оба запроса отдельно, и затем вы сможете выбрать, как объединить ответы.
  2. объединяет запросы в один бул:

Допустим, у вас есть: Q1-> bool-> надо-> внутренн-Q-1 и Q2-> bool-> must-> inner-q-2

тогда вы можете комбинировать их с: Q3-> bool-> should -> [inner-q-1, inner-q-2], с minimal_should_match равно 1 (очень важно!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...