2015-10-21 4 views
9

Ich versuche, dynamische Mapping-Erstellung für nur bestimmte Indizes zu deaktivieren, nicht für alle. Aus irgendeinem Grund kann ich nicht setzen Standard Zuordnung mit 'dynamisch': 'falsch'. So , hier links zwei Möglichkeiten, wie ich sehen kann:Deaktivieren Sie dynamische Mapping-Erstellung für nur bestimmte Indizes auf elasticsearch?

  1. Eigenschaft angeben 'index.mapper.dynamic' in Datei elasticsearch.yml.
  2. setzen 'index.mapper.dynamic' zum Zeitpunkt der Erstellung Index, als https://www.elastic.co/guide/en/kibana/current/setup.html#kibana-dynamic-mapping

Erste Option hier beschrieben sind, können nur Werte annehmen: true, false und streng. Daher gibt es keine Möglichkeit, eine Teilmenge bestimmter Indizes anzugeben (wie bei einem Muster mit der Eigenschaft 'action.auto_create_index'https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html#index-creation).

Zweite Option funktioniert einfach nicht. Ich habe Index erstellt

POST http://localhost:9200/test_idx/ 
{ 
    "settings" : { 
     "mapper" : { 
      "dynamic" : false 
     } 
    }, 
    "mappings" : { 
     "test_type" : { 
      "properties" : { 
       "field1" : { 
        "type" : "string" 
       } 
      } 
     } 
    } 
} 

Dann überprüft Indexeinstellungen:

GET http://localhost:9200/test_idx/_settings  
{ 
    "test_idx" : { 
     "settings" : { 
      "index" : { 
       "mapper" : { 
        "dynamic" : "false" 
       }, 
       "creation_date" : "1445440252221", 
       "number_of_shards" : "1", 
       "number_of_replicas" : "0", 
       "version" : { 
        "created" : "1050299" 
       }, 
       "uuid" : "5QSYSYoORNqCXtdYn51XfA" 
      } 
     } 
    } 
} 

und Kartierung:

GET http://localhost:9200/test_idx/_mapping 
{ 
    "test_idx" : { 
     "mappings" : { 
      "test_type" : { 
       "properties" : { 
        "field1" : { 
         "type" : "string" 
        } 
       } 
      } 
     } 
    } 
} 

so weit so gut, Index-Dokument mit der nicht angemeldeten Feldes lassen:

POST http://localhost:9200/test_idx/test_type/1 
{ 
    "field1" : "it's ok, field must be in mapping and in source", 
    "somefield" : "but this field must be in source only, not in mapping" 
} 

Dann habe ich geprüft Mapping wieder:

GET http://localhost:9200/test_idx/_mapping 
{ 
    "test_idx" : { 
     "mappings" : { 
      "test_type" : { 
       "properties" : { 
        "field1" : { 
         "type" : "string" 
        }, 
        "somefield" : { 
         "type" : "string" 
        } 
       } 
      } 
     } 
    } 
} 

Wie Sie sehen können, ist Mapping, unabhängig von Index erweitert "dynamic" -Einstellung: false. Ich habe auch versucht Index genau zu erzeugen, wie in doc beschrieben

PUT http://localhost:9200/test_idx 
{ 
    "index.mapper.dynamic": false 
} 

aber das gleiche Verhalten bekam.

Vielleicht habe ich etwas verpasst?

Vielen Dank im Voraus!

+0

Sorry, Version vergessen, ich arbeite mit elastischen 1.5.2. – shaolin

+0

Sehen Sie den vorletzten Kommentar der Antwort, es ist tatsächlich Antwort – shaolin

+0

'" settings.mapper.dynamic ": false deaktiviert automatische Typerstellung – czerasz

Antwort

11

Sie sind fast da: Der Wert muss auf strict eingestellt werden. Und die korrekte Verwendung ist die folgende:

PUT /test_idx 
{ 
    "mappings": { 
    "test_type": { 
     "dynamic":"strict", 
     "properties": { 
     "field1": { 
      "type": "string" 
     } 
     } 
    } 
    } 
} 

Und weiter dieses ein wenig drängen, wenn Sie die Erstellung auch neuer Arten verbieten wollen, nicht nur die Felder in diesem Index, verwenden Sie diese:

PUT /test_idx 
{ 
    "mappings": { 
    "_default_": { 
     "dynamic": "strict" 
    }, 
    "test_type": { 
     "properties": { 
     "field1": { 
      "type": "string" 
     } 
     } 
    } 
    } 
} 

Ohne _default_ Vorlage:

PUT /test_idx 
{ 
    "settings": { 
    "index.mapper.dynamic": false 
    }, 
    "mappings": { 
    "test_type": { 
     "dynamic": "strict", 
     "properties": { 
     "field1": { 
      "type": "string" 
     } 
     } 
    } 
    } 
} 
+0

Vielen Dank für die Antwort. Leider muss ich die dynamische Mapping-Erstellung für den gesamten Index (Index-Level) deaktivieren. In Ihrem Beispiel wurde es nur für den Typ 'test_type' deaktiviert. Und ich kann '_default_' Mapping dafür nicht verwenden (wie ich am Anfang erzählte) – shaolin

+0

Das '_default_'-Mapping muss verwendet werden, um Index-Level-Erstellung von Feldern/Typen zu deaktivieren. –

+0

Leider kann ich '_default_' Mapping nicht setzen. Ich versuche zu verstehen, wie dynamische Mapping-Erstellung zu deaktivieren, ohne irgendwelche Zuordnungen (deaktivieren Sie dynamische Zuordnung, indem andere Zuordnung ist ein bisschen schwierig aus Sicht der API, IMHO) – shaolin

3

Sie müssen wissen, dass über den folgenden Teil nur bedeuten, dass could'nt eine Art dynamisch erstellen ES.

"mapper" : { 
     "dynamic" : false 
    } 

Sie sollen ES wie folgt konfiguriert werden:

PUT http://localhost:9200/test_idx/_mapping/test_type 
{ 
    "dynamic":"strict" 
} 

Dann cant't Sie anderen Feldindex dass ohne mehr abbildet, und einen Fehler wie folgt erhalten:

mapping set to strict, dynamic introduction of [hatae] within [data] is not allowed 

Wenn Sie möchten die Daten speichern, aber das Feld kann nicht indexiert werden, Sie könnten die Einstellung so nehmen:

PUT http://localhost:9200/test_idx/_mapping/test_type 
{ 
    "dynamic":false 
} 

Hope diese können den Menschen mit dem gleichen Problem helfen :).

Verwandte Themen