Browse Source

Update 'removal of types' docs to reflect the new plan. (#38003)

Julie Tibshirani 6 năm trước cách đây
mục cha
commit
91b79ebed4

+ 152 - 46
docs/reference/mapping/removal_of_types.asciidoc

@@ -4,7 +4,8 @@
 IMPORTANT: Indices created in Elasticsearch 6.0.0 or later may only contain a
 IMPORTANT: Indices created in Elasticsearch 6.0.0 or later may only contain a
 single <<mapping-type,mapping type>>.  Indices created in 5.x with multiple
 single <<mapping-type,mapping type>>.  Indices created in 5.x with multiple
 mapping types will continue to function as before in Elasticsearch 6.x.
 mapping types will continue to function as before in Elasticsearch 6.x.
-Mapping types will be completely removed in Elasticsearch 7.0.0.
+Types will be deprecated in APIs in Elasticsearch 7.0.0, and completely
+removed in 8.0.0.
 
 
 [float]
 [float]
 === What are mapping types?
 === What are mapping types?
@@ -161,12 +162,12 @@ You can achieve the same thing by adding a custom `type` field as follows:
 
 
 [source,js]
 [source,js]
 ----
 ----
-PUT twitter?include_type_name=true <1>
+PUT twitter
 {
 {
   "mappings": {
   "mappings": {
     "_doc": {
     "_doc": {
       "properties": {
       "properties": {
-        "type": { "type": "keyword" }, <2>
+        "type": { "type": "keyword" }, <1>
         "name": { "type": "text" },
         "name": { "type": "text" },
         "user_name": { "type": "keyword" },
         "user_name": { "type": "keyword" },
         "email": { "type": "keyword" },
         "email": { "type": "keyword" },
@@ -204,7 +205,7 @@ GET twitter/_search
       },
       },
       "filter": {
       "filter": {
         "match": {
         "match": {
-          "type": "tweet" <2>
+          "type": "tweet" <1>
         }
         }
       }
       }
     }
     }
@@ -212,9 +213,7 @@ GET twitter/_search
 }
 }
 ----
 ----
 // NOTCONSOLE
 // NOTCONSOLE
-<1> Use `include_type_name=true` in case need to use the "old" syntax including the "_doc" object like
-in this example 
-<2> The explicit `type` field takes the place of the implicit `_type` field.
+<1> The explicit `type` field takes the place of the implicit `_type` field.
 
 
 [float]
 [float]
 ==== Parent/Child without mapping types
 ==== Parent/Child without mapping types
@@ -258,30 +257,28 @@ Elasticsearch 6.x::
 
 
 * The `_default_` mapping type is deprecated.
 * The `_default_` mapping type is deprecated.
 
 
+* In 6.7, the index creation, index template, and mapping APIs support a query
+  string parameter (`include_type_name`) which indicates whether requests and
+  responses should include a type name. It defaults to `true`, and not setting
+  `include_type_name=false` will result in a deprecation warning. Indices which
+  don't have an explicit type will use the dummy type name `_doc`.
+
 Elasticsearch 7.x::
 Elasticsearch 7.x::
 
 
-* The `type` parameter in URLs are deprecated.  For instance, indexing
-  a document no longer requires a document `type`.  The new index APIs
+* Specifying types in requests is deprecated. For instance, indexing a
+  document no longer requires a document `type`.  The new index APIs
   are `PUT {index}/_doc/{id}` in case of explicit ids and `POST {index}/_doc`
   are `PUT {index}/_doc/{id}` in case of explicit ids and `POST {index}/_doc`
   for auto-generated ids.
   for auto-generated ids.
 
 
-* The index creation, `GET|PUT _mapping` and document APIs support a query
-  string parameter (`include_type_name`) which indicates whether requests and
-  responses should include a type name. It defaults to `true`.
-  7.x indices which don't have an explicit type will use the dummy type name
-  `_doc`. Not setting `include_type_name=false` will result in a deprecation
-  warning.
+* The `include_type_name` parameter in the index creation, index template,
+  and mapping APIs will default to `false`. Setting the parameter will result
+  in a deprecation warning.
 
 
 * The `_default_` mapping type is removed.
 * The `_default_` mapping type is removed.
 
 
 Elasticsearch 8.x::
 Elasticsearch 8.x::
 
 
-* The `type` parameter is no longer supported in URLs.
-
-* The `include_type_name` parameter is deprecated, default to `false` and fails
-  the request when set to `true`.
-
-Elasticsearch 9.x::
+* Specifying types in requests is no longer supported.
 
 
 * The `include_type_name` parameter is removed.
 * The `include_type_name` parameter is removed.
 
 
@@ -427,17 +424,26 @@ POST _reindex
 // NOTCONSOLE
 // NOTCONSOLE
 
 
 [float]
 [float]
-=== Use `include_type_name=false` to prepare for upgrade to 8.0
+=== Typeless APIs in 7.0
 
 
-Index creation and mapping APIs support a new `include_type_name` url parameter 
-starting with version 6.7. It will default to `true` in version 6.7, default to
-`false` in version 7.0 and will be removed in version 8.0. When set to `true`, 
-this parameter enables the pre-7.0 behavior of using type names in the API.
+In Elasticsearch 7.0, each API will support typeless requests,
+and specifying a type will produce a deprecation warning.
 
 
-See some examples of interactions with Elasticsearch with this option turned off:
+NOTE: Typeless APIs work even if the target index contains a custom type.
+For example, if an index has the the custom type name `my_type`, we can add
+documents to it using typeless `index` calls, and load documents with typeless
+`get` calls.
 
 
 [float]
 [float]
-==== Index creation
+==== Indices APIs
+
+Index creation, index template, and mapping APIs support a new `include_type_name`
+url parameter that specifies whether mapping definitions in requests and responses
+should contain the type name. The parameter defaults to `true` in version 6.7 to
+match the pre-7.0 behavior of using type names in mappings. It defaults to `false`
+in version 7.0 and will be removed in version 8.0.
+
+See some examples of interactions with Elasticsearch with this option provided:
 
 
 [source,js]
 [source,js]
 --------------------------------------------------
 --------------------------------------------------
@@ -455,27 +461,27 @@ PUT index?include_type_name=false
 // CONSOLE
 // CONSOLE
 <1> Mappings are included directly under the `mappings` key, without a type name.
 <1> Mappings are included directly under the `mappings` key, without a type name.
 
 
-[float]
-==== PUT and GET mappings
-
 [source,js]
 [source,js]
 --------------------------------------------------
 --------------------------------------------------
-PUT index
-
 PUT index/_mappings?include_type_name=false
 PUT index/_mappings?include_type_name=false
 {
 {
   "properties": { <1>
   "properties": { <1>
-    "foo": {
-      "type": "keyword"
+    "bar": {
+      "type": "text"
     }
     }
   }
   }
 }
 }
-
-GET index/_mappings?include_type_name=false
 --------------------------------------------------
 --------------------------------------------------
 // CONSOLE
 // CONSOLE
+// TEST[continued]
 <1> Mappings are included directly under the `mappings` key, without a type name.
 <1> Mappings are included directly under the `mappings` key, without a type name.
 
 
+[source,js]
+--------------------------------------------------
+GET index/_mappings?include_type_name=false
+--------------------------------------------------
+// CONSOLE
+// TEST[continued]
 
 
 The above call returns
 The above call returns
 
 
@@ -487,6 +493,9 @@ The above call returns
       "properties": { <1>
       "properties": { <1>
         "foo": {
         "foo": {
           "type": "keyword"
           "type": "keyword"
+        },
+        "bar": {
+          "type": "text"
         }
         }
       }
       }
     }
     }
@@ -499,14 +508,14 @@ The above call returns
 [float]
 [float]
 ==== Document APIs
 ==== Document APIs
 
 
-Index APIs must be called with the `{index}/_doc` path for automatic generation of
-the `_id` and `{index}/_doc/{id}` with explicit ids.
+In 7.0, index APIs must be called with the `{index}/_doc` path for automatic
+generation of the `_id` and `{index}/_doc/{id}` with explicit ids.
 
 
 [source,js]
 [source,js]
 --------------------------------------------------
 --------------------------------------------------
 PUT index/_doc/1
 PUT index/_doc/1
 {
 {
-  "foo": "bar"
+  "foo": "baz"
 }
 }
 --------------------------------------------------
 --------------------------------------------------
 // CONSOLE
 // CONSOLE
@@ -514,7 +523,7 @@ PUT index/_doc/1
 [source,js]
 [source,js]
 --------------------------------------------------
 --------------------------------------------------
 {
 {
-  "_index": "index", <1>
+  "_index": "index",
   "_id": "1",
   "_id": "1",
   "_type": "_doc",
   "_type": "_doc",
   "_version": 1,
   "_version": 1,
@@ -529,14 +538,98 @@ PUT index/_doc/1
 }
 }
 --------------------------------------------------
 --------------------------------------------------
 // TESTRESPONSE
 // TESTRESPONSE
-<1> The response does not include a `_type`.
 
 
-The <<docs-index_,GET>>, <<docs-delete,`DELETE`>>, <<docs-update,`_update`>> and <<search,`_search`>> APIs
-will continue to return a `_type` key in the response in 7.0, but it is considered deprecated and will be
-removed in 8.0.
+Similarly, the `get` and `delete` APIs use the path `{index}/_doc/{id}`:
+
+[source,js]
+--------------------------------------------------
+GET index/_doc/1
+--------------------------------------------------
+// CONSOLE
+// TEST[continued]
+
+For API paths that contain both a type and endpoint name like `_update`,
+in 7.0 the endpoint will immediately follow the index name:
+
+[source,js]
+--------------------------------------------------
+POST index/_update/1
+{
+    "doc" : {
+        "foo" : "qux"
+    }
+}
+
+GET /index/_source/1
+--------------------------------------------------
+// CONSOLE
+// TEST[continued]
+
+Types should also no longer appear in the body of requests. The following
+example of bulk indexing omits the type both in the URL, and in the individual
+bulk commands:
+
+[source,js]
+--------------------------------------------------
+POST _bulk
+{ "index" : { "_index" : "index", "_id" : "3" } }
+{ "foo" : "baz" }
+{ "index" : { "_index" : "index", "_id" : "4" } }
+{ "foo" : "qux" }
+--------------------------------------------------
+// CONSOLE
+
+[float]
+==== Search APIs
+
+When calling a search API such `_search`, `_msearch`, or `_explain`, types
+should not be included in the URL. Additionally, the `_type` field should not
+be used in queries, aggregations, or scripts.
+
+[float]
+==== Types in responses
+
+The document and search APIs will continue to return a `_type` key in
+responses, to avoid breaks to response parsing. However, the key is
+considered deprecated and should no longer be referenced. Types will
+be completely removed from responses in 8.0.
+
+Note that when a deprecated typed API is used, the index's mapping type will be
+returned as normal, but that typeless APIs will return the dummy type `_doc`
+in the response. For example, the following typeless `get` call will always
+return `_doc` as the type, even if the mapping has a custom type name like
+`my_type`:
+
+[source,js]
+--------------------------------------------------
+PUT index/my_type/1
+{
+  "foo": "baz"
+}
+
+GET index/_doc/1
+--------------------------------------------------
+// CONSOLE
+
+[source,js]
+--------------------------------------------------
+{
+    "_index" : "index",
+    "_type" : "_doc",
+    "_id" : "1",
+    "_version" : 1,
+    "_seq_no" : 0,
+    "_primary_term" : 1,
+    "found": true,
+    "_source" : {
+        "foo" : "baz"
+    }
+}
+--------------------------------------------------
+// TESTRESPONSE
 
 
 [float]
 [float]
-=== Index templates
+==== Index templates
 
 
 It is recommended to make index templates typeless before upgrading to 7.0 by
 It is recommended to make index templates typeless before upgrading to 7.0 by
 re-adding them with `include_type_name` set to `false`.
 re-adding them with `include_type_name` set to `false`.
@@ -608,3 +701,16 @@ In case of implicit index creation, because of documents that get indexed in
 an index that doesn't exist yet, the template is always honored. This is
 an index that doesn't exist yet, the template is always honored. This is
 usually not a problem due to the fact that typeless index calls work on typed
 usually not a problem due to the fact that typeless index calls work on typed
 indices.
 indices.
+
+[float]
+==== Mixed-version clusters
+
+In a cluster composed of both 6.7 and 7.0 nodes, the parameter
+`include_type_name` should be specified in indices APIs like index
+creation. This is because the parameter has a different default between
+6.7 and 7.0, so the same mapping definition will not be valid for both
+node versions.
+
+Typeless document APIs such as `bulk` and `update` are only available as of
+7.0, and will not work with 6.7 nodes. This also holds true for the typeless
+versions of queries that perform document lookups, such as `terms`.