#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 работает не так, как должно, поскольку мне нужно, чтобы оно упорядочивалось по количеству уникальных значений