ElasticSearch Aggregarion — группировка по количеству без анализа поля

У нас есть категория поля в нашем индексе. Мы хотим получить количество записей для каждой категории, используя запрос агрегации.

GET /_search
{
    "aggs" : {
        "genres" : {
            "terms" : { "field" : "category" } 
        }
    }
}

Мы получаем результаты, но они дают результаты после анализа категории. Что-то вроде этого

           {
                "key": "chil",
                "doc_count": 343503
            },
            {
                "key": "child",
                "doc_count": 343503
            },
            {
                "key": "childr",
                "doc_count": 343503
            },
            {
                "key": "childre",
                "doc_count": 343503
            },

Но мне нужны результаты без анализа, надеюсь, это возможно. Может ли кто-нибудь помочь мне с запросом.

Ожидал

            {
                "key": "children",
                "doc_count": 343503
            },
            {
                "key": "Category1",
                "doc_count": 43503
            },
            {
                "key": "Category2",
                "doc_count": 60000
            }

У нас есть анализатор автозаполнения для поля categoryqu в отображении

        "name": {
          "type": "string",
          "analyzer": "autocomplete",
          "search_analyzer": "standard"
        }

Спасибо


person Ramesh    schedule 28.01.2020    source источник
comment
Вы можете агрегировать по keyword текстовому типу данных   -  person junwen-k    schedule 29.01.2020


Ответы (1)


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

Поэтому настройте отображение следующим образом:

{
  "category":{
    "type":"text",

    "fields":{
      "keyword":{
        "type":"keyword",
        "ignore_above":256
      },

      "name":{
        "analyzer":"autocomplete",
        "search_analyzer":"standard",
        "type":"text"
      }
    }
  }
}

и запустите следующее

GET /_search
{
  "aggs":{
    "genres":{
      "terms":{
        "field":"category.keyword"
      }
    }
  }
}

Примечание. При поиске по category будет использоваться текстовое сопоставление ES по умолчанию. При использовании category.name будет использоваться указанный вами анализатор и анализатор поиска. И поиск/объединение по category.keyword выполнит операцию над ключевым словом с учетом регистра — именно то, что вы ожидаете.

person Joe Sorocin    schedule 29.01.2020
comment
Нужно ли мне добавить еще одно ключевое слово поля в категорию, нужно ли мне передавать это ключевое слово при приеме данных? Что-то вроде категории {ключевое слово: CAT1, имя: категория 1} - person Ramesh; 30.01.2020
comment
Это плохая практика. Если вы хотите иметь 2 разных значения для поля, лучше создайте 2 отдельных поля. Когда вы передадите {"name": "Category 1"}, ES проиндексирует его один раз как text, а второй раз как keyword (при условии, что вы используете сопоставление из моего ответа). В том-то и дело - одно значение, но 2 разных процесса индексации... Если вы хотите принять другой вариант значения, используйте для него отдельное поле и сделайте его type равным keyword. Таким образом, вы сможете выполнять поиск без использования нотации .keyword. stackoverflow.com/a/48875105/8160318, если это все еще неясно. - person Joe Sorocin; 30.01.2020