Elasticsearch найти общее количество внуков - PullRequest
0 голосов
/ 29 октября 2019

Я пытаюсь настроить сопоставление, используя JOIN в Elasticsearch для моих данных, которые имеют отношение: компания находится в отношениях один-ко-многим с группой, а группа - в отношениях один-ко-многим с пользователем.

Вот мое отображение:

PUT /company
{
  "settings": {
    "number_of_shards": 1, "number_of_replicas": 0,
    "mapping.single_type": true
  },
  "mappings": {
    "doc": {
      "properties": {
        "company": { "type": "text" },
        "group": { "type": "text" },
        "user": { "type": "text" },
        "company_relations": {
          "type": "join",
          "relations": {
            "company": "group",
            "group": "user"
          }
        }
      }
    }
  }
}

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

Ответы [ 2 ]

1 голос
/ 29 октября 2019

Прежде всего, измените ваше отображение ниже. Причина в том, что вы не можете применять и выполнять запросы агрегирования в поле 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
          }
        }
      ]
    }
  }
}

Надеюсь, это поможет!

1 голос
/ 29 октября 2019
Change your mapping to:

PUT /company
{

  "mappings": {
    "doc": {
      "properties": {
        "company": { "type": "text"},
        "group": { "type": "text" },
        "user": { "type": "text","fielddata": true},
        "company_relations": {
          "type": "join",
          "relations": {
            "company": "group",
            "group": "user"
          }
        }
      }
    }
  }
}

Затем используйте этот запрос:

GET company/_search
{
  "size": 0, 
  "query": {
    "match": {
      "company": "company name"
    }
  },"aggs": {
    "total_users": {
      "value_count": {
         "field": "user"
      }
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...