В чем разница между count и total_count в фасете эластичного поиска?

Я делаю поиск, используя фасет диапазона:

{
"query": {
    "match_all": {}
},
"facets": {
    "prices": {
        "range": {
            "field": "product_price",
            "ranges": [
                {"from": 0, "to": 200},
                {"from": 200, "to": 400},
                {"from": 400, "to": 600},
                {"from": 600, "to": 800},
                {"from": 800}
            ]
        }
    }
}
}

И я получил в ответ диапазоны, как и ожидалось:

[
  {
    "from": 0.0,
    "to": 200.0,
    "count": 0,
    "total_count": 0,
    "total": 0.0,
    "mean": 0.0
  },
  {
    "from": 200.0,
    "to": 400.0,
    "count": 1,
    "min": 399.0,
    "max": 399.0,
    "total_count": 1,
    "total": 399.0,
    "mean": 399.0
  },
  {
    "from": 400.0,
    "to": 600.0,
    "count": 5,
    "min": 499.0,
    "max": 599.0,
    "total_count": 5,
    "total": 2886.0,
    "mean": 577.2
  },
  {
    "from": 600.0,
    "to": 800.0,
    "count": 3,
    "min": 690.0,
    "max": 790.0,
    "total_count": 3,
    "total": 2179.0,
    "mean": 726.3333333333334
  },
  {
    "from": 800.0,
    "count": 2,
    "min": 899.0,
    "max": 990.0,
    "total_count": 2,
    "total": 1889.0,
    "mean": 944.5
  }
]

Во всех ответах count а также total_count подобные. Кто-нибудь знает, в чем разница между ними? Какой я должен использовать?

1 ответ

Очень хороший вопрос! Эта часть сложна, так как большую часть времени вы видите одни и те же значения, но... когда вы используете key_field а также value_field Вы можете вычислить диапазоны на основе поля и агрегированных данных (min,max,total_count,total а также mean) на другом поле. Например, вы можете вычислить диапазоны в поле популярности и посмотреть агрегированные данные в поле цены, чтобы увидеть для каждого диапазона популярности, какую цену вы имеете; может людям нравятся дешевые продукты, а может и нет?

Давайте представим, что ваши продукты могут иметь несколько цен, скажем, например, разные цены для каждой страны... это когда у вас есть count это отличается от total_count, Давайте посмотрим на пример.

Давайте индексировать пару документов, которые содержат поле популярности и поле цены, которые могут иметь несколько значений:

{
  "popularity": 50,
  "price": [28,30,32]
}

а также

{
    "popularity": 120,
    "price": [50,54]
}

Давайте теперь запустим следующий поисковый запрос, который строит фасет диапазона, используя поле популярности в качестве ключа и поле цены в качестве значения:

{
    "query": {
        "match_all": {}
    },
    "facets": {
        "popularity_prices": {
            "range": {
                "key_field": "popularity",
                "value_field": "price",
                "ranges": [
                    {"to": 100},
                    {"from": 100}
                ]
            }
        }
    }
}

Вот полученный фасет:

{
    "popularity_prices": {
      "_type": "range",
      "ranges": [
        {
          "to": 100,
          "count": 1,
          "min": 28,
          "max": 32,
          "total_count": 3,
          "total": 90,
          "mean": 30
        },
        {
          "from": 100,
          "count": 1,
          "min": 50,
          "max": 54,
          "total_count": 2,
          "total": 104,
          "mean": 52
        }
      ]
    }
}

Теперь должно быть яснее, что total_count является. Это относится к value_field (цена): 3 разных значения цены попадают в первый диапазон, но они взяты из одного и того же документа. С другой стороны count количество документов, попадающих в диапазон

Теперь, когда мы также поняли count о документах в то время как total_count о значениях полей, мы ожидаем, что такое же поведение с фасетой нормального диапазона, если поле содержит несколько значений... правильно? К сожалению, в настоящее время этого не происходит, фасет диапазона будет учитывать только первое значение для каждого поля. Не уверен, что это ошибка. Следовательно count и total_count всегда одинаковы.

Другие вопросы по тегам