2017-02-15 4 views
0

Hallo Elasticsearch Gurus da draußen.Elasticsearch Mapping und Feldtyp

der folgende Index und Doctype Gegeben: localhost: 9200/MyIndex/mydoctype

Im Moment habe ich diesen Index Definition:

{ 
    "myindex": { 
    "aliases": {}, 
    "mappings": { 
     "mydoctype": { 
     "properties": { 
      "theNumber": { 
      "type": "integer" 
      }, 
      "theString": { 
      "type": "string" 
      } 
     } 
     } 
    }, 
    "settings": { 
     "index": { 
     "creation_date": "1487158714808", 
     "number_of_shards": "5", 
     "number_of_replicas": "1", 
     "version": { 
      "created": "1070599" 
     }, 
     "uuid": "cm2OtivhTO-RjuZPeHvL1w" 
     } 
    }, 
    "warmers": {} 
    } 
} 

Und ich war in der Lage, dieses Dokument hinzuzufügen:

{ 
    "theNumber" : 0, 
    "theString" : "zero" 
} 

Aber was ich nicht erwartet hatte, ist, dass ich dieses Dokument hinzuzufügen, auch in der Lage:

{ 
    "theNumber" : 3.1418, 
    "theString" : 3, 
    "fiefoe" : "fiefoe" 
} 

... wo die Feldtypen nicht übereinstimmt. Ebenso wird ein neues Feld/Spalte eingeführt. Ich habe dieses Verhalten wegen der Mappings, die ich für meinen Index definiert habe, nicht erwartet.

Hat dies etwas damit zu tun, dass Elasticsearch schemalos ist? Ist es möglich, Elasticsearch so einzustellen, dass nur solche Typen und Felder für jedes Dokument akzeptiert werden, das für diesen Index hinzugefügt wurde? Funktioniert das ElasticSearch Mapping überhaupt? (Vielleicht habe ich weiß nicht, hehehe)

Dank =)

Antwort

2

Elasticsearch verwendet dynamische Zuordnung, so dass, wenn es ein Feld findet, die nicht in der Abbildung nicht vorhanden ist, versucht es zu indizieren sie durch ihre Art zu erraten. Was können Sie tun, um dieses Verhalten zu deaktivieren, indem Sie dynamic: false im Mapping auf dem Root-Objekt verwenden. In diesem Fall ignoriert ElasticSearch das nicht zugeordnete Feld.

{ 
    "myindex": { 
    "aliases": {}, 
    "mappings": { 
     "mydoctype": { 
     "dynamic": false, <----- 

     "properties": { 
      "theNumber": { 
      "type": "integer" 
      }, 
      "theString": { 
      "type": "string" 
      } 
     } 
     } 
    }, 
    "settings": { 
     "index": { 
     "creation_date": "1487158714808", 
     "number_of_shards": "5", 
     "number_of_replicas": "1", 
     "version": { 
      "created": "1070599" 
     }, 
     "uuid": "cm2OtivhTO-RjuZPeHvL1w" 
     } 
    }, 
    "warmers": {} 
    } 
} 

Alternativ können Sie dynamic:strict verwenden, wenn Sie eine Ausnahme ausgelöst werden soll, wenn ein nicht zugeordnete Feld indiziert werden versucht.

Die Dokumentation dazu ist here.

+0

vielen dank @christinabo. Das ist sehr hilfreich. –

+0

@ArtanisZeratul Ich hoffe, dass es so geklappt hat. – christinabo

+0

bitte überprüfen Sie meine Antwort unten, es könnte auch für Sie hilfreich sein. Vielen Dank. –

0

Bitte erlauben Sie mir, meine eigene Frage zu beantworten ...

Diese Einstellung ist für mich in diesem Fall gearbeitet:

API URL anfordern: localhost: 9200/MyIndex/_mapping/mydoctype

HTTP Körper:

{ 
    "mydoctype" : { 
     "dynamic": "strict", 
     "properties" : { 
      "theNumber" : {"type" : "integer"}, 
      "theString" : {"type" : "string"}, 
      "stash": { 
        "type":  "object", 
        "dynamic": false 
       } 
     } 
    } 
} 

Dann habe ich versucht, das Hinzufügen dieses Objekt:

{ 
    "theNumber" : 5.55555, 
    "theString" : 5, 
    "fiefoe" : "fiefoe" 
} 

Ich habe diese Antwort:

{ 
    "error": "StrictDynamicMappingException[mapping set to strict, dynamic introduction of [fiefoe] within [mydoctype] is not allowed]", 
    "status": 400 
} 

Dank =)!

P.S. Referenz: https://www.elastic.co/guide/en/elasticsearch/guide/1.x/dynamic-mapping.html

Verwandte Themen