Найти список значений различных строк, хранящихся в поле в ElasticSearch - PullRequest
0 голосов
/ 22 апреля 2019

Я сохранил свои данные вasticsearch, как указано ниже. Он возвращает только отдельные слова в данном поле, а не всю отдельную фразу.

    {
    "_index" : "test01",
    "_type" : "whatever01",
    "_id" : "1234",
    "_score" : 1.0,
    "_source" : {
      "company_name" : "State Bank of India",
      "user" : ""
    }
  },
  {
    "_index" : "test01",
    "_type" : "whatever01",
    "_id" : "5678",
    "_score" : 1.0,
    "_source" : {
      "company_name" : "State Bank of India",
      "user" : ""
    }
  },
  {
    "_index" : "test01",
    "_type" : "whatever01",
    "_id" : "8901",
    "_score" : 1.0,
    "_source" : {
      "company_name" : "Kotak Mahindra Bank",
      "user" : ""
    }
  }

Я пытался использовать функцию агрегирования терминов

    GET /test01/_search/
    {
        "aggs" : {
        "genres":
            {
               "terms" : 
                     { "field": "company_name"} 
             }
          }
    }

Я получаю следующий вывод

    "aggregations" : {
"genres" : {
  "doc_count_error_upper_bound" : 0,
  "sum_other_doc_count" : 10531,
  "buckets" : [
    {
      "key" : "bank",
      "doc_count" : 2818
    },
    {
      "key" : "mahindra",
      "doc_count" : 1641
    },
    {
      "key" : "state",
      "doc_count" : 1504
    }]

}}

Как получить всю строку в поле "company_name" только с различными значениями, как указано ниже?

    "aggregations" : {
"genres" : {
  "doc_count_error_upper_bound" : 0,
  "sum_other_doc_count" : 10531,
  "buckets" : [
    {
      "key" : "Kotak Mahindra Bank",
      "doc_count" : 2818
    },
    {
      "key" : "State Bank of India",
      "doc_count" : 1641
    }
    ]

}}

1 Ответ

1 голос
/ 22 апреля 2019

Похоже, что вы установили "fielddata": "true" для своего поля company_name, которое имеет тип text. Это не хорошо, так как может потребовать много места в куче, как упомянуто в этой ссылке .

Более того, значения поля *1009* типа text разбиваются на токены и сохраняются в инвертированном индексе с использованием процесса, называемого Анализ . Установка fielddata для полей типа text приведет к тому, что агрегация будет работать так, как вы упомянули в своем вопросе.

То, что вам нужно сделать, это создать его родственный эквивалент типа keyword, как упомянуто в этой ссылке , и выполнить агрегирование в этом поле.

В основном измените ваше отображение на company_name, как показано ниже:

Отображение:

PUT <your_index_name>/_search
{
  "mappings": {
    "mydocs": {
      "properties": {
        "company_name": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword"
            }
          }
        }
      }
    }
  }
}

Запустите приведенный ниже запрос агрегации в этом поле company_name.keyword, и вы получите то, что ищете.

Запрос:

POST <your_index_name>/_search
{
  "aggs": {
    "unique_names": {
      "terms": {
        "field": "company_name.keyword",        <----- Run on this field
        "size": 10
      }
    }
  }
}

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

...