Агрегация ElasticSearch по имени поля - PullRequest
0 голосов
/ 19 ноября 2018

Представьте себе два документа:

[
    {
        "_id": "abc",
        "categories": {
            "category-id-1": 1,
            "category-id-2": 50
        }
    },
    {
        "_id": "def",
        "categories": {
            "category-id-1": 2
        }
    }
]

Как видите, каждый документ можно связать с рядом категорий, установив вложенное поле в поле categories.

Благодаря этому сопоставлению я смогу запросить документы из определенной категории и упорядочить их по значению, установленному в качестве значения для этого поля.

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

{
    "aggregations": {
        "categories" : {
            "buckets": [
                {
                    "key": "category-id-1",
                    "doc_count": 2
                },
                {
                    "key": "category-id-2",
                    "doc_count": 1
                }
            ]
        }
    }
}

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

Возможно ли сделать такое объединение с моим отображением? Я использую ES 6.x

РЕДАКТИРОВАТЬ: Вот отображение для индекса:

{
  "test1234": {
    "mappings": {
      "_doc": {
        "properties": {
          "categories": {
            "properties": {
              "category-id-1": {
                "type": "long"
              },
              "category-id-2": {
                "type": "long"
              }
            }
          }
        }
      }
    }
  }
}

1 Ответ

0 голосов
/ 20 ноября 2018

Самое простое решение - использовать новое поле, содержащее все отдельные категории документа.

Если мы назовем это поле categories_list, здесь может быть решение:

Измените отображение на

{
  "test1234": {
    "mappings": {
      "_doc": {
        "properties": {
          "categories": {
            "properties": {
              "category-id-1": {
                "type": "long"
              },
              "category-id-2": {
                "type": "long"
              }
            }
          },
          "categories_list": {
             "type": "keyword"
          }
        }
      }
    }
  }
}

Затем вам нужно изменить ваши документы следующим образом:

[
    {
        "_id": "abc",
        "categories": {
            "category-id-1": 1,
            "category-id-2": 50
        },
        "categories_list": ["category-id-1", "category-id-2"]
    },
    {
        "_id": "def",
        "categories": {
            "category-id-1": 2
        },
        "categories_list": ["category-id-1"]
    }
]

тогда ваш запрос агрегации должен быть

{
  "aggs": {
    "categories": {
      "terms": {
        "field": "categories_list",
        "size": 10
      }
    }
  }
}

и вернет

"aggregations": {
    "categories": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "category-id-1",
          "doc_count": 2
        },
        {
          "key": "category-id-2",
          "doc_count": 1
        }
      ]
    }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...