Упругий поиск Группировать по полю - PullRequest
1 голос
/ 07 октября 2019

В моем индексе есть следующие данные.

{
"id":1,
"car_name" : "ABC-101"
},
{
"id":2,
"car_name" : "DEF-102"
},
{
"id":3,
"car_name" : "ABC-103"
}

Отображение моего индекса:

{
  "car": {
    "mappings": {
      "_doc": {
        "properties": {
          "car_name": {
            "type": "text",
            "fielddata": true
          }
        }
      }
    }
  } 
}

Когда я запускаю следующий запрос

 localhost:9200/car/_doc/_search?pretty

Со следующим телом запроса

{
"size" : 0,
"aggs" : {
    "genres" : {
        "terms" : { 
            "field" : "car_name"
        }
    }
}

}

я получаю следующий ответ

"buckets": [
    {
      "key": "ABC",
      "doc_count": 2
    },
    {
      "key": "DEF",
      "doc_count": 1
    },
    {
      "key": "101",
      "doc_count": 1
    },
    {
      "key": "102",
      "doc_count": 1
    },
    {
      "key": "103",
      "doc_count": 1
    }
]

Почему это не приносит фактические ключи, которые ABC-101 и DEF-102 почему ABC и 101 рассматриваются как отдельные ключи.

1 Ответ

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

По умолчанию строковые поля имеют значение analyzed вasticasearch. Это означает, что "ABC-101" индексируется как 2 члена "ABC" и "101" . Ваш запрос также анализируется , и он также преобразуется в 2 термина "ABC" и "101" независимо от того, какие специальные символы находятся между ними.

Именно поэтому они соответствуют всем строкамразделяются - как ABC, 101, DEF, 102 и т. д.

например,

  {
  "car": {
    "car_name": "string",
    "fields": {
      "raw": {
        "type": "string",
        "index": "not_analyzed"
      }
    }
  }  
  }

Если вы хотите найти это поле в точности так, как оно есть, вы должны переиндексировать его как "index":"not_analyzed"

Не уверен в этом, но вы можете попробовать с keyword в поле car_name, чтобы точно соответствовать

{
  "size" : 0,
  "aggs" : {
      "genres" : {
          "terms" : { 
              "field" : "car_name.keyword"
          }
      }
  }
...