Группа ElasticSearch по полю документов и подсчету случаев - PullRequest
0 голосов
/ 06 ноября 2019

Мой индекс ElasticSearch 6.5.2 выглядит следующим образом:

      {
    "_index" : "searches",
    "_type" : "searches",
    "_id" : "cCYuHW4BvwH6Y3jL87ul",
    "_score" : 1.0,
    "_source" : {
      "querySearched" : "telecom",
    }
  },
  {
    "_index" : "searches",
    "_type" : "searches",
    "_id" : "cSYuHW4BvwH6Y3jL_Lvt",
    "_score" : 1.0,
    "_source" : {
      "querySearched" : "telecom",
    }
  },
  {
    "_index" : "searches",
    "_type" : "searches",
    "_id" : "eCb6O24BvwH6Y3jLP7tM",
    "_score" : 1.0,
    "_source" : {
      "querySearched" : "industry",
    }

И я хотел бы запрос, который возвращает этот результат:

"result": 
{
"querySearched" : "telecom",
"number" : 2
},
{
"querySearched" : "industry",
"number" : 1
}

Я просто хочу сгруппировать по вхождению и получитьчисло каждого, ограничение до десяти самых больших чисел. Я пытался с агрегатами, но ведро пусто. Спасибо!

Ответы [ 2 ]

2 голосов
/ 06 ноября 2019

Case your mapping

PUT /index
{
  "mappings": {
    "doc": {
      "properties": {
        "querySearched": {
          "type": "text",
          "fielddata": true
        }
      }
    }
  }
}

Ваш запрос должен выглядеть следующим образом:

GET index/_search
{
  "size": 0,
  "aggs": {
    "result": {
      "terms": {
        "field": "querySearched",
        "size": 10
      }
    }
  }
}

Вы должны добавить fielddata:true, чтобы включить агрегирование для поля типа text type больше этого

    "size": 10, => limit to 10

После короткого разговора с @Kamal я чувствую себя обязанным сообщить вам, что если вы решите включить fielddata:true, вы должны знать, что он может потреблять многопространства кучи.

По ссылке, которой я поделился:

Fielddata может занимать много места в куче, особенно при загрузке текстовых полей с большим количеством элементов. После того, как полевые данные были загружены в кучу, они остаются там на время жизни сегмента. Кроме того, загрузка полевых данных является дорогостоящим процессом, из-за которого пользователи могут столкнуться с задержками. Вот почему полевые данные по умолчанию отключены.

Другая альтернатива (более эффективная):

PUT /index
{
  "mappings": {
    "doc": {
      "properties": {
        "querySearched": {
          "type": "text",
          "fields": {
           "keyword": {
             "type": "keyword",
             "ignore_above": 256
           }
         }
        }
      }
    }
  }
}

Тогда ваш запрос агрегирования

GET index/_search
{
  "size": 0,
  "aggs": {
    "result": {
      "terms": {
        "field": "querySearched.keyword",
        "size": 10
      }
    }
  }
}

Обарешения работают, но вы должны принять к рассмотрению .

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

0 голосов
/ 06 ноября 2019

Что вы пробовали?

POST / search / _search

   {
      "size": 0,
      "aggs": {
        "byquerySearched": {
          "terms": {
            "field": "querySearched",
             "size": 10
          }
        }
      }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...