количество записей, которые соответствуют условиям внутри запроса bool - PullRequest
0 голосов
/ 04 июня 2018

У меня есть запрос ES по строкам (условие1 или условие2 или условие3 ....) и другие условия.

Каждое условие в скобках является предложением 'must', которое ищет все документы, которые соответствуютимя, местоположение и продукт.

GET index/type/_count
{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "term": {
                  "NAME": {
                    "value": "name1"
                  }
                }
              },
              {
                "term": {
                  "PRODUCT": {
                    "value": "product1"
                  }
                }
              },
              {
                "term": {
                  "LOCATION": {
                    "value": "location1"
                  }
                }
              }
            ]
          }
        },
        {
          "bool": {
            "must": [
              {
                "term": {
                  "NAME": {
                    "value": "name2"
                  }
                }
              },
              {
                "term": {
                  "PRODUCT": {
                    "value": "product2"
                  }
                }
              },
              {
                "term": {
                  "LOCATION": {
                    "value": "location2"
                  }
                }
              }
            ]
          }
        }
      ],
      "must_not": [
        {
          "exists": {
            "field": "some other condition"
          }
        }
      ],
      "must": [
        {
          "term": {
            "somefield": "value"
          }
        },
        {
          "range": {
            "time": {
              "gte": "now-6M"
            }
          }
        }
      ]
    }
  }
}

Можно ли получить количество записей, которое соответствует каждому условию 'must' в предложении 'must', вместо общего количества, используя один запрос?

1 Ответ

0 голосов
/ 05 июня 2018

Да, вы можете сделать это с помощью агрегации, в частности filter агрегации.Запрос может выглядеть следующим образом:

POST index/type/_search
{
  "query": {
    "bool": {
      "should": [
        "<clause1>",
        "<clause2>"
      ],
      "must_not": [
        "<mustNotClause3>"
      ],
      "must": [
        "<mustClause4>"
      ]
    }
  },
  "aggs": {
    "clause1": {
      "filter": "<clause1>"
    },
    "clause2": {
      "filter": "<clause2>"
    }
  }
}

Обратите внимание, что мы используем _search API здесь.Если вам не нужны результаты поиска, вы можете установить size: 0, это вернет вам только общее количество и агрегации.

В вашем случае запрос будет буквально таким:

POST index/type/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "term": {
                  "NAME": {
                    "value": "name1"
                  }
                }
              },
              {
                "term": {
                  "PRODUCT": {
                    "value": "product1"
                  }
                }
              },
              {
                "term": {
                  "LOCATION": {
                    "value": "location1"
                  }
                }
              }
            ]
          }
        },
        {
          "bool": {
            "must": [
              {
                "term": {
                  "NAME": {
                    "value": "name2"
                  }
                }
              },
              {
                "term": {
                  "PRODUCT": {
                    "value": "product2"
                  }
                }
              },
              {
                "term": {
                  "LOCATION": {
                    "value": "location2"
                  }
                }
              }
            ]
          }
        }
      ],
      "must_not": [
        {
          "exists": {
            "field": "some other condition"
          }
        }
      ],
      "must": [
        {
          "term": {
            "somefield": "value"
          }
        },
        {
          "range": {
            "time": {
              "gte": "now-6M"
            }
          }
        }
      ]
    }
  },
  "aggs": {
    "clause1": {
      "filter": {
        "bool": {
          "must": [
            {
              "term": {
                "NAME": {
                  "value": "name1"
                }
              }
            },
            {
              "term": {
                "PRODUCT": {
                  "value": "product1"
                }
              }
            },
            {
              "term": {
                "LOCATION": {
                  "value": "location1"
                }
              }
            }
          ]
        }
      }
    },
    "clause2": {
      "filter": {
        "bool": {
          "must": [
            {
              "term": {
                "NAME": {
                  "value": "name2"
                }
              }
            },
            {
              "term": {
                "PRODUCT": {
                  "value": "product2"
                }
              }
            },
            {
              "term": {
                "LOCATION": {
                  "value": "location2"
                }
              }
            }
          ]
        }
      }
    }
  }
}

Обратите внимание, что сумма подсчетов агрегаций clause1 и clause2 может быть больше, чем общее количество.

Надеюсь, это поможет!

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