2014-02-04 4 views
3

Мой текущий understanding-Elasticsearch отображения по умолчанию

  1. Elasticsearch создает отображение индексов в первый раз, когда он получает JSON наборов данных.
  2. Это сопоставление не может быть изменено, но данные могут быть повторно отображены.

Вопрос-

Забудьте переназначения. Есть ли способ сказать ES вести себя по умолчанию as-

"Consider everything that is not a date to be of string type"?

Кроме того, я буду сильно проигрывать, если я это сделаю?

Обновление-

я добавил file- config/mappings/_default/mapping.json со следующим contents-

{ 
    "dynamic_templates": [ 
     { 
      "template_1": { 
       "match": "*", 
       "match_mapping_type": "int", 
       "mapping": { 
        "type": "string" 
       } 
      }, 
      "template_2": { 
       "match": "*", 
       "match_mapping_type": "long", 
       "mapping": { 
        "type": "string" 
       } 
      } 
     } 
    ] 
} 

я также попытался поместить следующую AT- config/default_mapping.json

{ 
    "_default_" : { 
     "match": "*", 
     "match_mapping_type": "int", 
     "mapping": { 
       "type": "string" 
     } 
    } 
} 

Мой 'мотив' заключается в том, чтобы избавиться от ошибок, которые возникают, если int и long типы изменены на string. Будет ли эта карта всегоint и long значениями как string по всем индексам, которые создаются в будущем? Нужно ли мне вставить этот ключ dynamic_templates в пределах _all?

Update II-

Добавление этого файла сопоставления вызывает elasticsearch кашлять вверх

[2014-02-04 10:48:34,396][DEBUG][action.admin.indices.create] [Her] [logstash-2014.02.04] failed to create 
org.elasticsearch.index.mapper.MapperParsingException: mapping [mapping.json] 
    at org.elasticsearch.cluster.metadata.MetaDataCreateIndexService$2.execute(MetaDataCreateIndexService.java:312) 
    at org.elasticsearch.cluster.service.InternalClusterService$UpdateTask.run(InternalClusterService.java:298) 
    at org.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor$TieBreakingPrioritizedRunnable.run(PrioritizedEsThreadPoolExecutor.java:135) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:701) 
Caused by: java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Map 
    at org.elasticsearch.index.mapper.DocumentMapperParser.extractMapping(DocumentMapperParser.java:268) 
    at org.elasticsearch.index.mapper.DocumentMapperParser.parse(DocumentMapperParser.java:155) 
    at org.elasticsearch.index.mapper.MapperService.parse(MapperService.java:314) 
    at org.elasticsearch.index.mapper.MapperService.merge(MapperService.java:193) 
    at org.elasticsearch.cluster.metadata.MetaDataCreateIndexService$2.execute(MetaDataCreateIndexService.java:309) 
    ... 5 more 
2014-02-04 10:48:34 +0000 [warn]: temporarily failed to flush the buffer. next_retry=2014-02-04 10:48:33 +0000 error_class="Net::HTTPServerException" error="400 \"Bad Request\"" instance=17509700 

ответ

6

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

Есть apis для управления сопоставлениями, что не означает, что вы должны объявлять все свои поля. Вы можете просто указать те, которые вы хотите по-разному отличаться от значений по умолчанию. Вы можете указать сопоставления в то время как creating an index, используя put mapping api, если индекс уже существует или даже включает их в index templates, для индексов, которые еще не созданы.

Изменение сопоставлений возможно, но могут применяться только обратные совместимые изменения. Вы всегда можете добавлять новые поля, но вы не можете изменить тип или анализатор для существующего поля. То, что вы могли бы сделать в этом случае, пытается сделать обратное совместимым с использованием multi-fields, в противном случае вам нужно переопределить обновленные сопоставления.

Что касается вашего последнего вопроса, если вы индексируете все как строку, вы теряете то, что обычно можете делать с цифрами, например. диапазон запросов. Возможно ли это или нет, зависит от ваших данных и того, что вам нужно сделать с этим.

+0

* если вы отправляете поле в своем первом документе как число, и это же поле становится строкой во втором документе, операция индекса для второго документа возвращает ошибку. * Любой способ * решить * это? я не возражаю, если * все * отображается как строки. Нет ли какого-либо флага, который говорит- 'Не отображать, не перечеркивать все. '? :) – erbdex

+1

Уверен, что ваш вопрос был, если это имело смысл, и мой ответ предполагал, что вы знали, что это возможно :) [Динамические шаблоны] (http://www.elasticsearch.org/guide/en/elasticsearch/reference/current /mapping-root-object-type.html#_dynamic_templates) являются ответом, чтобы избежать указания всех полей, а всего лишь шаблона и используемого отображения. – javanna

+0

@ javanna- Так что-то вроде [this] (http://pastebin.com/raw.php?i=9AvvW3Dc) гарантирует, что все мои значения 'int' и' long' будут сопоставлены с 'string', по всем направлениям ? Не могли бы вы подтвердить? – erbdex

Смежные вопросы