2016-11-28 5 views
1

Я пытаюсь объединить имена полей в ES 5, как описано в Elasticsearch aggregation on distinct keys Но описанное там решение больше не работает.Агрегация над _field_names в elasticsearch 5

Моя цель - получить ключи от всех документов. Отображение по умолчанию - по умолчанию.

данных:

PUT products/product/1 
{ 
    "param": { 
     "field1": "data", 
     "field2": "data2" 
    } 
} 

Запрос:

GET _search 
{ 
    "aggs": { 
     "params": { 
      "terms": { 
       "field": "_field_names", 
       "include" : "param.*", 
       "size": 0 
      } 

     } 
    } 
} 

Я получаю следующее сообщение об ошибке: Fielddata is not supported on field [_field_names] of type [_field_names]

ответ

0

Это, вероятно, потому, что setting size: 0 is not allowed anymore в ES 5. Вы должны установить конкретный размер в настоящее время.

POST _search 
{ 
    "aggs": { 
     "params": { 
      "terms": { 
       "field": "_field_names", 
       "include" : "param.*", 
       "size": 100    <--- change this 
      } 

     } 
    } 
} 
+0

Отличный пункт! К сожалению, это не решило проблему. –

+0

У вас есть ошибка или результаты просто не найдены? – Val

+0

Ах, извините. Ошибка: 'Fielddata не поддерживается в поле [_field_names] типа [_field_names]' –

0

Посмотрев вокруг него, кажется, единственный способ в ES> 5.X, чтобы получить уникальные имена полей через отображений конечных точек, а так как не может агрегатный на _field_names вам, возможно, придется немного изменить свой формат данных, так как конечная точка отображения вернет каждое поле независимо от вложенности.

Моя личная проблема заключалась в получении уникальных ключей для различных дочерних/родительских документов.

Я обнаружил, что если вы префиксные имена полей в формате prefix.field при попадании на конечную точку сопоставления, он автоматически откроет для вас информацию.

PUT products/product/1 
{ 
    "param.field1": "data", 
    "param.field2": "data2", 
    "other.field3": "data3" 
} 

GET products/product/_mapping 
{ 
    "products": { 
     "mappings": { 
      "product": { 
       "properties": { 
        "other": { 
         "properties": { 
          "field3": { 
           "type": "text", 
           "fields": { 
            "keyword": { 
             "type": "keyword", 
             "ignore_above": 256 
            } 
           } 
          } 
         } 
        }, 
        "param": { 
         "properties": { 
          "field1": { 
           "type": "text", 
           "fields": { 
            "keyword": { 
             "type": "keyword", 
             "ignore_above": 256 
            } 
           } 
          }, 
          "field2": { 
           "type": "text", 
           "fields": { 
            "keyword": { 
             "type": "keyword", 
             "ignore_above": 256 
            } 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Тогда вы можете получить уникальные поля на основе префикса.