Количество уникальных элементов в эластичном поиске уникальных идентификаторов

#elasticsearch

#elasticsearch

Вопрос:

Допустим, мои данные выглядят так:

Документы для проекта 6000:

{«ProjectID»: «6000», «цена»: 500000, «спальни»: 2, «название»: «Доступная роскошь», «площадь»: «A»},

{«ProjectID»: «6000», «цена»: 700000, «спальни»: 4, «название»: «Просторный», «площадь»: «A»}

Документы для проекта 6001:

{«ProjectID»: «6001», «цена»: 550000, «спальни»: 2, «название»: «Потрясающий», «площадь»: «A»}

{«ProjectID»: «6001», «цена»: 650000, «спальни»: 3, «название»: «Отличные виды». «область»: «B»}

Документы для проекта 6002:

{«ProjectID»: «6002», «цена»: 550000, «спальни»: 2, «название»: «Потрясающий», «площадь»: «B»}

{«ProjectID»: «6002», «цена»: 650000, «спальни»: 3, «название»: «Отличные виды». «область»: «C»}

и так далее

Теперь я хочу получить количество областей, чтобы получить наиболее популярные области, в которых существуют проекты, но учитывать только уникальные идентификаторы проектов. У меня есть этот запрос:

     query = {
        "aggs": {
            "most_popular": {
                "terms": {
                    "field": "area",
                    "size": 5,
                    "order": {
                    "_count": "desc"
                    },
                }
             }
          }
  

что приводит к :

сегменты: [{‘key’: ‘A’, doc_count: 3}, {‘key’: ‘B’, doc_count: 2} … и так далее] Но я хочу, чтобы в каждом проекте было только уникальное количество, поэтому doc_count для A должно быть 2 вместо 3, т. Е. Избегать дубликатовв рамках одного проекта.

Как это возможно в elasticsearch?

Комментарии:

1. не могли бы вы поделиться ожидаемым результатом поиска?

Ответ №1:

Вам необходимо использовать агрегацию сортировки по сегментам, которая представляет собой агрегацию родительского конвейера, которая сортирует сегменты родительской агрегации с несколькими сегментами

Добавление рабочего примера с индексными данными, поисковым запросом и результатом поиска

Индексировать данные:

 {"projectId": "6000", "price": 500000, "bedrooms": 2, "title": "Affordable luxury", "area": "A"},

{"projectId": "6000", "price": 700000, "bedrooms": 4, "title": "Spacious", "area": "A"}

{"projectId": "6001", "price": 550000, "bedrooms": 2, "title": "Stunning", "area": "A"}

{"projectId": "6001", "price": 650000, "bedrooms": 3, "title": "Excellent views". "area": "B"}

{"projectId": "6002", "price": 550000, "bedrooms": 2, "title": "Stunning", "area": "B"}

{"projectId": "6002", "price": 650000, "bedrooms": 3, "title": "Excellent views". "area": "C"}

{"projectId": "6002", "price": 500000, "bedrooms": 2, "title": "Affordable luxury", "area": "C"}

{"projectId": "6002", "price": 500000, "bedrooms": 2, "title": "Affordable luxury", "area": "C"}
  

Поисковый запрос:

     {
  "size": 0,
  "aggs": {
    "most_popular": {
      "terms": {
        "field": "area",
        "size": 5
      },
      "aggs": {
        "unique": {
          "cardinality": {
            "field": "projectId"
          }
        },
        "uniqueCount_bucket_sort": {
          "bucket_sort": {
            "sort": [
              {
                "unique": {
                  "order": "asc"
                }
              }
            ]
          }
        }
      }
    }
  }
}
  

Результат поиска:

 "buckets": [
    {
      "key": "C",
      "doc_count": 3,
      "unique": {
        "value": 1
      }
    },
    {
      "key": "B",
      "doc_count": 2,
      "unique": {
        "value": 2
      }
    },
    {
      "key": "A",
      "doc_count": 3,
      "unique": {
        "value": 2
      }
    }
  ]
  

Комментарии:

1. @Srishti Rawal у вас была возможность просмотреть мой ответ, с нетерпением жду обратной связи от вас 🙂

Ответ №2:

Вы можете добавить еще aggregation один в свой запрос и получить количество элементов projectId , подобное этому:

 {
        "aggs": {
            "most_popular": {
                "terms": {
                    "field": "area",
                    "size": 5,
                    "order": {
                    "_count": "desc"
                    }
                },"aggs": {
                  "unique": {
                    "cardinality": {
                      "field": "projectId"
                    }
                  }
                }
             }
          }
}
  

Комментарии:

1. В этом случае предложение order by работает не так, как должно, поскольку мне нужно, чтобы оно упорядочивалось по количеству уникальных значений