SumIf in в Elasticsearch агрегации - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь создать запрос, который возвращает документы на основе расчета, который лучше по сравнению с SumIf в Excel.

Очень упрощенная версия моего отображения:

{
  "item": {
    "properties": {
      "name": {
        "type": "text"
      },
      "data": {
        "properties": {
          "inventory": {
            "properties": {
              "locations": {
                "type": "nested",
                "properties": {
                  "state": {
                    "type": "keyword"
                  },
                  "amount": {
                    "type": "double"
                  }
                }
              },
              "total": {
                "type": "double"
              }
            }
          }
        }
      }
    }
  }
}

(Эти данные не имеют большого смысла в реальной системе, но я не могу опубликовать фактическое отображение.)

Два примера документа могут быть:

{
  "name": "guitar",
  "data": {
    "inventory": {
      "locations": [
        {
          "state": "CA",
          "amount": 200
        },
        {
          "state": "AZ",
          "amount": 100
        },
        {
          "state": "NY",
          "amount": 300
        }
      ],
      "total": 600
    }
  }
}
{
  "name": "piano",
  "data": {
    "inventory": {
      "locations": [
        {
          "state": "CA",
          "amount": 200
        },
        {
          "state": "AZ",
          "amount": 100
        },
        {
          "state": "KY",
          "amount": 50
        }
      ],
      "total": 350
    }
  }
}

Я бы хотел иметь возможность вернуть запрос, который возвращает документы, в которых сумма вложенных документов 'NY' и 'CA' превышает 150. В случае данных примера он должен возвращать оба документы, хотя Нью-Йорк не в первом документе, так как СА уже на 200.

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

Я бы хотел получить несколько советов о том, как решить эту проблему.

1 Ответ

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

Не думаю, что вам нужны агрегаты, а настроенный поисковый запрос, который выполняется с помощью Script Query .

К сожалению, благодаря тому, как создаются вложенные документы, этого невозможно достичь с помощью Script Query .

Тем не менее, это не может быть точным решением, но приведенный ниже запрос вернет все документы, которые имеют CA и / или NY, и отсортирует их на основе sum их amount .

Таким образом, документы с более высоким sum of amounts будут появляться в начале результатов, за которыми следуют документы, имеющие меньшую ценность.

Запрос

POST <your_index_name>/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "nested": {
            "path": "data.inventory.locations",
            "query": {
              "match": {
                "data.inventory.locations.state": "CA"
              }
            }
          }
        },
        {
          "nested": {
            "path": "data.inventory.locations",
            "query": {
              "match": {
                "data.inventory.locations.state": "NY"
              }
            }
          }

        }
      ]
    }
  },
  "sort": [
    {
      "data.inventory.locations.amount": {
        "order": "desc",
        "mode": "sum",
        "nested_path": "data.inventory.locations",
        "nested_filter": {
          "terms": {
            "data.inventory.locations.state": ["CA","NY"]
          }
        }
      }
    }
  ]
}

Дайте мне знать, если это поможет!

...