Как агрегировать поле «без ключевых слов» вasticsearch? - PullRequest
0 голосов
/ 29 мая 2019

Я пытаюсь написать запрос с упругим поиском, в котором должны быть перечислены все различные значения, содержащиеся в различных полях документа. Когда поля имеют тип Keyword, термин совокупный запрос работает нормально, и я могу видеть значения с их количеством перечисленных в ведрах. Но я не получаю никакого результата, когда я запрашиваю различные типы цитрусовых, отображение как показано ниже:

{   
    "vegetables":{
      "type": "text",
      "fields": {
         "keyword" : {
            "type" : "keyword",
            "ignore_above": 256
          }
        }
     }, 
    "fruits": {
        "properties": {
            "citrus": {
                "properties": {
                    "orange": {
                        "type": "long"
                    },
                    "lemon": {
                        "type": "long"
                    },
                    "kiwi": {
                        "type": "long"
                    }
                }
            }
        }
    }
}

и ожидаемый результат:

"aggregations": {
  "distinct_citrusy_fruits"{
     "buckets" : [
       {
         "key":"oranges",
         "doc_count": 23
       },
       {
         "key":"lemon",
         "doc_count": 21
       },
       {
         "key":"kiwi",
         "doc_count": 23
       }
      ]
   }
}

когда я делаю агрегацию термина для поля "овощи" (это тип ключевого слова), я могу получить сегменты, как указано выше. Как получить четкие подсчеты в этом случае? Кроме того, у меня нет возможности изменить формат документа.

РЕДАКТИРОВАТЬ - единственный обходной путь, который я нашел до сих пор, - это вызвать API-интерфейс сопоставлений, а затем проанализировать вложенный JSON в моем коде, чтобы получить значения ключей. Если есть какое-либо лучшее решение, пожалуйста, добавьте ответ здесь.

1 Ответ

0 голосов
/ 03 июня 2019

Я думаю, что вы не можете запрашивать или выполнять агрегации по именам полей, только по значениям. Для фруктов я ожидаю следующего картирования:

{
    "fruits": {
        "properties": {
            "citrus": {
                "properties": {
                    "kind": {
                        "type": "keyword"
                    },
                    "count": {
                        "type": "long"
                    }
                }
            }
        }
    }
}

Возможно, вы можете использовать поле _field_names, которое содержит каждое имя поля, которое имеет значение. (https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-field-names-field.html)

...