Прежде всего, измените ваше отображение ниже. Причина в том, что вы не можете применять и выполнять запросы агрегирования в поле text
. Для этого вам понадобится поле keyword
.
Также я бы не советовал вам включать fielddata: true
, так как это может повлиять на производительность при увеличении размера индекса, плюс это не имеет смысла. Подробнее об этом здесь
{
"settings":{
"number_of_shards":1,
"number_of_replicas":0,
"mapping.single_type":true
},
"mappings":{
"doc":{
"properties":{
"company":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword"
}
}
},
"group":{
"type":"text"
},
"user":{
"type":"text",
"fields":{
"keyword":{
"type":"keyword"
}
}
},
"company_relations":{
"type":"join",
"relations":{
"company":"group",
"group":"user"
}
}
}
}
}
}
Публикация, которая принимает ваш документ, как показано ниже (Ради простоты я только что использовал соответствующие поля и не использовал отношения)
Примеры документов:
POST company/doc/1
{
"company": "daimler",
"group": "abc",
"user": "austin"
}
POST company/doc/2
{
"company": "daimler",
"group": "abc",
"user": "matt"
}
Теперь ваш запрос может быть таким же простым, как показано ниже, где я использовал Термины агрегирования и Кардинальное агрегирование , чтобы получить то, что выищите:
Запрос агрегации:
POST company/_search
{
"size": 0,
"query": {
"bool": {
"must": [
{
"term": {
"company.keyword": "daimler"
}
}
]
}
},
"aggs": {
"my_companies": {
"terms": {
"field": "company.keyword",
"size": 10
},
"aggs": {
"my_users_count": {
"cardinality": {
"field": "user.keyword"
}
}
}
}
}
}
Обратите внимание, что я использовал агрегацию в полях company.keyword
и user.keyword
.
Ниже показано, как выглядит ответ
Ответ:
{
"took" : 7,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"my_companies" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : "daimler",
"doc_count" : 2,
"my_users_count" : {
"value" : 2
}
}
]
}
}
}
Надеюсь, это поможет!