2016-12-08 2 views
0

Привет, Все, что я использую elasticsearch-template.json, чтобы установить тип данных всех моих полей в строку. Ниже приведен фрагмент шаблона:Отображение elasticsearch для выбора всех полей с помощью шаблонов для изменения их типа данных Elasticsearch

{ 
    "template": "logstash-*", 
    "settings": { 
     "index.refresh_interval": "5s", 
     "number_of_shards": 1, 
     "number_of_replicas": 0 
    }, 
    "mappings": { 
     "logs": { 
      "_all": { 
       "enabled": true 
      }, 
      "properties": { 
       "level1": { 
        "properties": { 
         "level2": { 
         "properties": { 
          "_all": {"type": "string"} 
         } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Здесь под level2 я получил много полей, создаваемых в я хочу, чтобы установить их все строки, как я могу установить его. Я попробовал символ «*», а также символ «%», чтобы выбрать все поля. но, к сожалению, он добавляется только как новое поле для отображения. Как указать в шаблоне выбрать все поля под определенным уровнем?

ответ

1

Я считаю, что вы ищете dynamic_templates и используя path_match вместо match. Это свидетельствует о том, как это может работать:

curl -DELETE localhost:9200/test-* 
curl -XDELETE http://localhost:9200/_template/test 
curl -XPOST http://localhost:9200/_template/test -d ' 
{ 
    "template": "test-*", 
    "mappings": { 
     "_default_": { 
      "dynamic_templates": [ 
      { 
       "level1_level2_all": { 
        "path_match": "level1.level2.*", 
        "match_mapping_type": "*", 
        "mapping": { 
         "index": "not_analyzed", 
         "type": "string" 
        } 
       } 
      } 
      ] 
     } 
    } 
} 
' 

curl -XPOST http://localhost:9200/test-1/a -d ' 
{ 
    "level1": { 
     "level2": { 
      "x":1 
     } 
    } 
}' 
curl -XPOST http://localhost:9200/test-1/a -d ' 
{ 
    "level1": { 
     "level2": { 
      "y":1 
     } 
    } 
}' 

curl http://localhost:9200/test-1/_mapping?pretty 

Выход из которых:

"test-1" : { 
    "mappings" : { 
     "_default_" : { 
     "dynamic_templates" : [ { 
      "level1_level2_all" : { 
      "mapping" : { 
       "index" : "not_analyzed", 
       "type" : "string" 
      }, 
      "match_mapping_type" : "*", 
      "path_match" : "level1.level2.*" 
      } 
     } ], 
     "properties" : { } 
     }, 
     "a" : { 
     "dynamic_templates" : [ { 
      "level1_level2_all" : { 
      "mapping" : { 
       "index" : "not_analyzed", 
       "type" : "string" 
      }, 
      "match_mapping_type" : "*", 
      "path_match" : "level1.level2.*" 
      } 
     } ], 
     "properties" : { 
      "level1" : { 
      "properties" : { 
       "level2" : { 
       "properties" : { 
        "x" : { 
        "type" : "string", 
        "index" : "not_analyzed" 
        }, 
        "y" : { 
        "type" : "string", 
        "index" : "not_analyzed" 
        } 
       } 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 
+0

Я попытался выше подход первого. Но так получилось, что для первого документа, который он получает, он устанавливает тип в строку, но для полей, которые пусты или не имеют значения, он устанавливает его объекту, а затем следующий документ, который имеет значения для этих пустых полей, создает ошибку. –

+0

Вам нужно удалить индекс и перезагрузить данные, чтобы заставить его принять шаблон – Alcanzar

+0

Да, это то, что я сделал, и он принимает шаблон, но для случая, как я упомянул выше, он сначала устанавливает пустые поля как тип данных объекта а затем, когда следующий документ прибывает со значением поля в виде строки/числового, он не может его индексировать –