Docs: Rewrote the migrating-to-2.0 section
This commit is contained in:
parent
0240b581e7
commit
db1e83884f
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,69 @@
|
||||||
|
=== Aggregation changes
|
||||||
|
|
||||||
|
==== Min doc count defaults to zero
|
||||||
|
|
||||||
|
Both the `histogram` and `date_histogram` aggregations now have a default
|
||||||
|
`min_doc_count` of `0` instead of `1`.
|
||||||
|
|
||||||
|
==== Timezone for date field
|
||||||
|
|
||||||
|
Specifying the `time_zone` parameter in queries or aggregations on fields of
|
||||||
|
type `date` must now be either an ISO 8601 UTC offset, or a timezone id. For
|
||||||
|
example, the value `+1:00` must now be written as `+01:00`.
|
||||||
|
|
||||||
|
==== Time zones and offsets
|
||||||
|
|
||||||
|
The `histogram` and the `date_histogram` aggregation now support a simplified
|
||||||
|
`offset` option that replaces the previous `pre_offset` and `post_offset`
|
||||||
|
rounding options. Instead of having to specify two separate offset shifts of
|
||||||
|
the underlying buckets, the `offset` option moves the bucket boundaries in
|
||||||
|
positive or negative direction depending on its argument.
|
||||||
|
|
||||||
|
The `date_histogram` options for `pre_zone` and `post_zone` are replaced by
|
||||||
|
the `time_zone` option. The behavior of `time_zone` is equivalent to the
|
||||||
|
former `pre_zone` option. Setting `time_zone` to a value like "+01:00" now
|
||||||
|
will lead to the bucket calculations being applied in the specified time zone.
|
||||||
|
The `key` is returned as the timestamp in UTC, but the `key_as_string` is
|
||||||
|
returned in the time zone specified.
|
||||||
|
|
||||||
|
In addition to this, the `pre_zone_adjust_large_interval` is removed because
|
||||||
|
we now always return dates and bucket keys in UTC.
|
||||||
|
|
||||||
|
==== Including/excluding terms
|
||||||
|
|
||||||
|
`include`/`exclude` filtering on the `terms` aggregation now uses the same
|
||||||
|
syntax as <<regexp-syntax,regexp queries>> instead of the Java regular
|
||||||
|
expression syntax. While simple regexps should still work, more complex ones
|
||||||
|
might need some rewriting. Also, the `flags` parameter is no longer supported.
|
||||||
|
|
||||||
|
==== Boolean fields
|
||||||
|
|
||||||
|
Aggregations on `boolean` fields will now return `0` and `1` as keys, and
|
||||||
|
`"true"` and `"false"` as string keys. See <<migration-bool-fields>> for more
|
||||||
|
information.
|
||||||
|
|
||||||
|
|
||||||
|
==== Java aggregation classes
|
||||||
|
|
||||||
|
The `date_histogram` aggregation now returns a `Histogram` object in the
|
||||||
|
response, and the `DateHistogram` class has been removed. Similarly the
|
||||||
|
`date_range`, `ipv4_range`, and `geo_distance` aggregations all return a
|
||||||
|
`Range` object in the response, and the `IPV4Range`, `DateRange`, and
|
||||||
|
`GeoDistance` classes have been removed.
|
||||||
|
|
||||||
|
The motivation for this is to have a single response API for the Range and
|
||||||
|
Histogram aggregations regardless of the type of data being queried. To
|
||||||
|
support this some changes were made in the `MultiBucketAggregation` interface
|
||||||
|
which applies to all bucket aggregations:
|
||||||
|
|
||||||
|
* The `getKey()` method now returns `Object` instead of `String`. The actual
|
||||||
|
object type returned depends on the type of aggregation requested (e.g. the
|
||||||
|
`date_histogram` will return a `DateTime` object for this method whereas a
|
||||||
|
`histogram` will return a `Number`).
|
||||||
|
* A `getKeyAsString()` method has been added to return the String
|
||||||
|
representation of the key.
|
||||||
|
* All other `getKeyAsX()` methods have been removed.
|
||||||
|
* The `getBucketAsKey(String)` methods have been removed on all aggregations
|
||||||
|
except the `filters` and `terms` aggregations.
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,129 @@
|
||||||
|
=== CRUD and routing changes
|
||||||
|
|
||||||
|
==== Explicit custom routing
|
||||||
|
|
||||||
|
Custom `routing` values can no longer be extracted from the document body, but
|
||||||
|
must be specified explicitly as part of the query string, or in the metadata
|
||||||
|
line in the <<docs-bulk,`bulk`>> API. See <<migration-meta-fields>> for an
|
||||||
|
example.
|
||||||
|
|
||||||
|
==== Routing hash function
|
||||||
|
|
||||||
|
The default hash function that is used for routing has been changed from
|
||||||
|
`djb2` to `murmur3`. This change should be transparent unless you relied on
|
||||||
|
very specific properties of `djb2`. This will help ensure a better balance of
|
||||||
|
the document counts between shards.
|
||||||
|
|
||||||
|
In addition, the following routing-related node settings have been deprecated:
|
||||||
|
|
||||||
|
`cluster.routing.operation.hash.type`::
|
||||||
|
|
||||||
|
This was an undocumented setting that allowed to configure which hash function
|
||||||
|
to use for routing. `murmur3` is now enforced on new indices.
|
||||||
|
|
||||||
|
`cluster.routing.operation.use_type`::
|
||||||
|
|
||||||
|
This was an undocumented setting that allowed to take the `_type` of the
|
||||||
|
document into account when computing its shard (default: `false`). `false` is
|
||||||
|
now enforced on new indices.
|
||||||
|
|
||||||
|
==== Delete API with custom routing
|
||||||
|
|
||||||
|
The delete API used to be broadcast to all shards in the index which meant
|
||||||
|
that, when using custom routing, the `routing` parameter was optional. Now,
|
||||||
|
the delete request is forwarded only to the document holding the shard. If you
|
||||||
|
are using custom routing then you should specify the `routing` value when
|
||||||
|
deleting a document, just as is already required for the `index`, `create`,
|
||||||
|
and `update` APIs.
|
||||||
|
|
||||||
|
To make sure that you never forget a routing value, make routing required with
|
||||||
|
the following mapping:
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
---------------------------
|
||||||
|
PUT my_index
|
||||||
|
{
|
||||||
|
"mappings": {
|
||||||
|
"my_type": {
|
||||||
|
"_routing": {
|
||||||
|
"required": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
==== All stored meta-fields returned by default
|
||||||
|
|
||||||
|
Previously, meta-fields like `_routing`, `_timestamp`, etc would only be
|
||||||
|
included in a GET request if specifically requested with the `fields`
|
||||||
|
parameter. Now, all meta-fields which have stored values will be returned by
|
||||||
|
default. Additionally, they are now returned at the top level (along with
|
||||||
|
`_index`, `_type`, and `_id`) instead of in the `fields` element.
|
||||||
|
|
||||||
|
For instance, the following request:
|
||||||
|
|
||||||
|
[source,sh]
|
||||||
|
---------------
|
||||||
|
GET /my_index/my_type/1
|
||||||
|
---------------
|
||||||
|
|
||||||
|
might return:
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
---------------
|
||||||
|
{
|
||||||
|
"_index": "my_index",
|
||||||
|
"_type": "my_type",
|
||||||
|
"_id": "1",
|
||||||
|
"_timestamp": 10000000, <1>,
|
||||||
|
"_source": {
|
||||||
|
"foo" : [ "bar" ]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
---------------
|
||||||
|
<1> The `_timestamp` is returned by default, and at the top level.
|
||||||
|
|
||||||
|
|
||||||
|
==== Async replication
|
||||||
|
|
||||||
|
The `replication` parameter has been removed from all CRUD operations
|
||||||
|
(`index`, `create`, `update`, `delete`, `bulk`) as it interfered with the
|
||||||
|
<<indices-synced-flush,synced flush>> feature. These operations are now
|
||||||
|
synchronous only and a request will only return once the changes have been
|
||||||
|
replicated to all active shards in the shard group.
|
||||||
|
|
||||||
|
Instead, use more client processes to send more requests in parallel.
|
||||||
|
|
||||||
|
==== Documents must be specified without a type wrapper
|
||||||
|
|
||||||
|
Previously, the document body could be wrapped in another object with the name
|
||||||
|
of the `type`:
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
--------------------------
|
||||||
|
PUT my_index/my_type/1
|
||||||
|
{
|
||||||
|
"my_type": { <1>
|
||||||
|
"text": "quick brown fox"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
--------------------------
|
||||||
|
<1> This `my_type` wrapper is not part of the document itself, but represents the document type.
|
||||||
|
|
||||||
|
This feature was deprecated before but could be reenabled with the
|
||||||
|
`mapping.allow_type_wrapper` index setting. This setting is no longer
|
||||||
|
supported. The above document should be indexed as follows:
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
--------------------------
|
||||||
|
PUT my_index/my_type/1
|
||||||
|
{
|
||||||
|
"text": "quick brown fox"
|
||||||
|
}
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
==== Term Vectors API
|
||||||
|
|
||||||
|
Usage of `/_termvector` is deprecated in favor of `/_termvectors`.
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
=== Index API changes
|
||||||
|
|
||||||
|
==== Index aliases
|
||||||
|
|
||||||
|
|
||||||
|
Fields used in alias filters no longer have to exist in the mapping at alias
|
||||||
|
creation time. Previously, alias filters were parsed at alias creation time
|
||||||
|
and the parsed form was cached in memory. Now, alias filters are parsed at
|
||||||
|
request time and the fields in filters are resolved from the current mapping.
|
||||||
|
|
||||||
|
This also means that index aliases now support `has_parent` and `has_child`
|
||||||
|
queries.
|
||||||
|
|
||||||
|
The <<alias-retrieving, GET alias api>> will now throw an exception if no
|
||||||
|
matching aliases are found. This change brings the defaults for this API in
|
||||||
|
line with the other Indices APIs. The <<multi-index>> options can be used on a
|
||||||
|
request to change this behavior.
|
||||||
|
|
||||||
|
==== File based index templates
|
||||||
|
|
||||||
|
Index templates can no longer be configured on disk. Use the
|
||||||
|
<<indices-templates,`_template`>> API instead.
|
||||||
|
|
||||||
|
==== Analyze API changes
|
||||||
|
|
||||||
|
|
||||||
|
The Analyze API now returns the the `position` of the first token as `0`
|
||||||
|
instead of `1`.
|
||||||
|
|
||||||
|
The `prefer_local` parameter has been removed. The `_analyze` API is a light
|
||||||
|
operation and the caller shouldn't be concerned about whether it executes on
|
||||||
|
the node that receives the request or another node.
|
||||||
|
|
||||||
|
The `text()` method on `AnalyzeRequest` now returns `String[]` instead of
|
||||||
|
`String`.
|
||||||
|
|
||||||
|
==== Removed `id_cache` from clear cache api
|
||||||
|
|
||||||
|
The <<indices-clearcache,clear cache>> API no longer supports the `id_cache`
|
||||||
|
option. Instead, use the `fielddata` option to clear the cache for the
|
||||||
|
`_parent` field.
|
||||||
|
|
|
@ -0,0 +1,76 @@
|
||||||
|
=== Java API changes
|
||||||
|
|
||||||
|
==== Transport API construction
|
||||||
|
|
||||||
|
The `TransportClient` construction code has changed, it now uses the builder
|
||||||
|
pattern. Instead of:
|
||||||
|
|
||||||
|
[source,java]
|
||||||
|
--------------------------------------------------
|
||||||
|
Settings settings = Settings.settingsBuilder()
|
||||||
|
.put("cluster.name", "myClusterName").build();
|
||||||
|
Client client = new TransportClient(settings);
|
||||||
|
--------------------------------------------------
|
||||||
|
|
||||||
|
Use the following:
|
||||||
|
|
||||||
|
[source,java]
|
||||||
|
--------------------------------------------------
|
||||||
|
Settings settings = Settings.settingsBuilder()
|
||||||
|
.put("cluster.name", "myClusterName").build();
|
||||||
|
Client client = TransportClient.builder().settings(settings).build();
|
||||||
|
--------------------------------------------------
|
||||||
|
|
||||||
|
==== Automatically thread client listeners
|
||||||
|
|
||||||
|
Previously, the user had to set request listener threads to `true` when on the
|
||||||
|
client side in order not to block IO threads on heavy operations. This proved
|
||||||
|
to be very trappy for users, and ended up creating problems that are very hard
|
||||||
|
to debug.
|
||||||
|
|
||||||
|
In 2.0, Elasticsearch automatically threads listeners that are used from the
|
||||||
|
client when the client is a node client or a transport client. Threading can
|
||||||
|
no longer be manually set.
|
||||||
|
|
||||||
|
|
||||||
|
==== Query/filter refactoring
|
||||||
|
|
||||||
|
`org.elasticsearch.index.queries.FilterBuilders` has been removed as part of the merge of
|
||||||
|
queries and filters. These filters are now available in `QueryBuilders` with the same name.
|
||||||
|
All methods that used to accept a `FilterBuilder` now accept a `QueryBuilder` instead.
|
||||||
|
|
||||||
|
In addition some query builders have been removed or renamed:
|
||||||
|
|
||||||
|
* `commonTerms(...)` renamed with `commonTermsQuery(...)`
|
||||||
|
* `queryString(...)` renamed with `queryStringQuery(...)`
|
||||||
|
* `simpleQueryString(...)` renamed with `simpleQueryStringQuery(...)`
|
||||||
|
* `textPhrase(...)` removed
|
||||||
|
* `textPhrasePrefix(...)` removed
|
||||||
|
* `textPhrasePrefixQuery(...)` removed
|
||||||
|
* `filtered(...)` removed. Use `filteredQuery(...)` instead.
|
||||||
|
* `inQuery(...)` removed.
|
||||||
|
|
||||||
|
==== GetIndexRequest
|
||||||
|
|
||||||
|
`GetIndexRequest.features()` now returns an array of Feature Enums instead of an array of String values.
|
||||||
|
|
||||||
|
The following deprecated methods have been removed:
|
||||||
|
|
||||||
|
* `GetIndexRequest.addFeatures(String[])` - Use
|
||||||
|
`GetIndexRequest.addFeatures(Feature[])` instead
|
||||||
|
|
||||||
|
* `GetIndexRequest.features(String[])` - Use
|
||||||
|
`GetIndexRequest.features(Feature[])` instead.
|
||||||
|
|
||||||
|
* `GetIndexRequestBuilder.addFeatures(String[])` - Use
|
||||||
|
`GetIndexRequestBuilder.addFeatures(Feature[])` instead.
|
||||||
|
|
||||||
|
* `GetIndexRequestBuilder.setFeatures(String[])` - Use
|
||||||
|
`GetIndexRequestBuilder.setFeatures(Feature[])` instead.
|
||||||
|
|
||||||
|
|
||||||
|
==== BytesQueryBuilder removed
|
||||||
|
|
||||||
|
The redundant BytesQueryBuilder has been removed in favour of the
|
||||||
|
WrapperQueryBuilder internally.
|
||||||
|
|
|
@ -0,0 +1,390 @@
|
||||||
|
=== Mapping changes
|
||||||
|
|
||||||
|
A number of changes have been made to mappings to remove ambiguity and to
|
||||||
|
ensure that conflicting mappings cannot be created.
|
||||||
|
|
||||||
|
One major change is that dynamically added fields must have their mapping
|
||||||
|
confirmed by the master node before indexing continues. This is to avoid a
|
||||||
|
problem where different shards in the same index dynamically add different
|
||||||
|
mappings for the same field. These conflicting mappings can silently return
|
||||||
|
incorrect results and can lead to index corruption.
|
||||||
|
|
||||||
|
This change can make indexing slower when frequently adding many new fields.
|
||||||
|
We are looking at ways of optimising this process but we chose safety over
|
||||||
|
performance for this extreme use case.
|
||||||
|
|
||||||
|
==== Conflicting field mappings
|
||||||
|
|
||||||
|
Fields with the same name, in the same index, in different types, must have
|
||||||
|
the same mapping, with the exception of the <<copy-to>>, <<dynamic>>,
|
||||||
|
<<enabled>>, <<ignore-above>>, <<include-in-all>>, and <<properties>>
|
||||||
|
parameters, which may have different settings per field.
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
---------------
|
||||||
|
PUT my_index
|
||||||
|
{
|
||||||
|
"mappings": {
|
||||||
|
"type_one": {
|
||||||
|
"properties": {
|
||||||
|
"name": { <1>
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"type_two": {
|
||||||
|
"properties": {
|
||||||
|
"name": { <1>
|
||||||
|
"type": "string",
|
||||||
|
"analyzer": "english"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
---------------
|
||||||
|
<1> The two `name` fields have conflicting mappings and will prevent Elasticsearch
|
||||||
|
from starting.
|
||||||
|
|
||||||
|
Elasticsearch will not start in the presence of conflicting field mappings.
|
||||||
|
These indices must be deleted or reindexed using a new mapping.
|
||||||
|
|
||||||
|
The `ignore_conflicts` option of the put mappings API has been removed.
|
||||||
|
Conflicts can't be ignored anymore.
|
||||||
|
|
||||||
|
==== Fields cannot be referenced by short name
|
||||||
|
|
||||||
|
A field can no longer be referenced using its short name. Instead, the full
|
||||||
|
path to the field is required. For instance:
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
---------------
|
||||||
|
PUT my_index
|
||||||
|
{
|
||||||
|
"mappings": {
|
||||||
|
"my_type": {
|
||||||
|
"properties": {
|
||||||
|
"title": { "type": "string" }, <1>
|
||||||
|
"name": {
|
||||||
|
"properties": {
|
||||||
|
"title": { "type": "string" }, <2>
|
||||||
|
"first": { "type": "string" },
|
||||||
|
"last": { "type": "string" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
---------------
|
||||||
|
<1> This field is referred to as `title`.
|
||||||
|
<2> This field is referred to as `name.title`.
|
||||||
|
|
||||||
|
Previously, the two `title` fields in the example above could have been
|
||||||
|
confused with each other when using the short name `title`.
|
||||||
|
|
||||||
|
==== Type name prefix removed
|
||||||
|
|
||||||
|
Previously, two fields with the same name in two different types could
|
||||||
|
sometimes be disambiguated by prepending the type name. As a side effect, it
|
||||||
|
would add a filter on the type name to the relevant query. This feature was
|
||||||
|
ambiguous -- a type name could be confused with a field name -- and didn't
|
||||||
|
work everywhere e.g. aggregations.
|
||||||
|
|
||||||
|
Instead, fields should be specified with the full path, but without a type
|
||||||
|
name prefix. If you wish to filter by the `_type` field, either specify the
|
||||||
|
type in the URL or add an explicit filter.
|
||||||
|
|
||||||
|
The following example query in 1.x:
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
----------------------------
|
||||||
|
GET my_index/_search
|
||||||
|
{
|
||||||
|
"query": {
|
||||||
|
"match": {
|
||||||
|
"my_type.some_field": "quick brown fox"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
would be rewritten in 2.0 as:
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
----------------------------
|
||||||
|
GET my_index/my_type/_search <1>
|
||||||
|
{
|
||||||
|
"query": {
|
||||||
|
"match": {
|
||||||
|
"some_field": "quick brown fox" <2>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
----------------------------
|
||||||
|
<1> The type name can be specified in the URL to act as a filter.
|
||||||
|
<2> The field name should be specified without the type prefix.
|
||||||
|
|
||||||
|
==== Field names may not contain dots
|
||||||
|
|
||||||
|
In 1.x, it was possible to create fields with dots in their name, for
|
||||||
|
instance:
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
----------------------------
|
||||||
|
PUT my_index
|
||||||
|
{
|
||||||
|
"mappings": {
|
||||||
|
"my_type": {
|
||||||
|
"properties": {
|
||||||
|
"foo.bar": { <1>
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"foo": {
|
||||||
|
"properties": {
|
||||||
|
"bar": { <1>
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
----------------------------
|
||||||
|
<1> These two fields cannot be distinguised as both are referred to as `foo.bar`.
|
||||||
|
|
||||||
|
You can no longer create fields with dots in the name.
|
||||||
|
|
||||||
|
==== Type names may not start with a dot
|
||||||
|
|
||||||
|
In 1.x, Elasticsearch would issue a warning if a type name included a dot,
|
||||||
|
e.g. `my.type`. Now that type names are no longer used to distinguish between
|
||||||
|
fields in differnt types, this warning has been relaxed: type names may now
|
||||||
|
contain dots, but they may not *begin* with a dot. The only exception to this
|
||||||
|
is the special `.percolator` type.
|
||||||
|
|
||||||
|
==== Types may no longer be deleted
|
||||||
|
|
||||||
|
In 1.x it was possible to delete a type mapping, along with all of the
|
||||||
|
documents of that type, using the delete mapping API. This is no longer
|
||||||
|
supported, because remnants of the fields in the type could remain in the
|
||||||
|
index, causing corruption later on.
|
||||||
|
|
||||||
|
Instead, if you need to delete a type mapping, you should reindex to a new
|
||||||
|
index which does not contain the mapping. If you just need to delete the
|
||||||
|
documents that belong to that type, then use the delete-by-query plugin
|
||||||
|
instead.
|
||||||
|
|
||||||
|
[[migration-meta-fields]]
|
||||||
|
==== Type meta-fields
|
||||||
|
|
||||||
|
The <<mapping-fields,meta-fields>> associated with had configuration options
|
||||||
|
removed, to make them more reliable:
|
||||||
|
|
||||||
|
* `_id` configuration can no longer be changed. If you need to sort, use the <<mapping-uid-field,`_uid`>> field instead.
|
||||||
|
* `_type` configuration can no longer be changed.
|
||||||
|
* `_index` configuration can no longer be changed.
|
||||||
|
* `_routing` configuration is limited to marking routing as required.
|
||||||
|
* `_field_names` configuration is limited to disabling the field.
|
||||||
|
* `_size` configuration is limited to enabling the field.
|
||||||
|
* `_timestamp` configuration is limited to enabling the field, setting format and default value.
|
||||||
|
* `_boost` has been removed.
|
||||||
|
* `_analyzer` has been removed.
|
||||||
|
|
||||||
|
Importantly, *meta-fields can no longer be specified as part of the document
|
||||||
|
body.* Instead, they must be specified in the query string parameters. For
|
||||||
|
instance, in 1.x, the `routing` could be specified as follows:
|
||||||
|
|
||||||
|
[source,json]
|
||||||
|
-----------------------------
|
||||||
|
PUT my_index
|
||||||
|
{
|
||||||
|
"mappings": {
|
||||||
|
"my_type": {
|
||||||
|
"_routing": {
|
||||||
|
"path": "group" <1>
|
||||||
|
},
|
||||||
|
"properties": {
|
||||||
|
"group": { <1>
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PUT my_index/my_type/1 <2>
|
||||||
|
{
|
||||||
|
"group": "foo"
|
||||||
|
}
|
||||||
|
-----------------------------
|
||||||
|
<1> This 1.x mapping tells Elasticsearch to extract the `routing` value from the `group` field in the document body.
|
||||||
|
<2> This indexing request uses a `routing` value of `foo`.
|
||||||
|
|
||||||
|
In 2.0, the routing must be specified explicitly:
|
||||||
|
|
||||||
|
[source,json]
|
||||||
|
-----------------------------
|
||||||
|
PUT my_index
|
||||||
|
{
|
||||||
|
"mappings": {
|
||||||
|
"my_type": {
|
||||||
|
"_routing": {
|
||||||
|
"required": true <1>
|
||||||
|
},
|
||||||
|
"properties": {
|
||||||
|
"group": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PUT my_index/my_type/1?routing=bar <2>
|
||||||
|
{
|
||||||
|
"group": "foo"
|
||||||
|
}
|
||||||
|
-----------------------------
|
||||||
|
<1> Routing can be marked as required to ensure it is not forgotten during indexing.
|
||||||
|
<2> This indexing request uses a `routing` value of `bar`.
|
||||||
|
|
||||||
|
==== Analyzer mappings
|
||||||
|
|
||||||
|
Previously, `index_analyzer` and `search_analyzer` could be set separately,
|
||||||
|
while the `analyzer` setting would set both. The `index_analyzer` setting has
|
||||||
|
been removed in favour of just using the `analyzer` setting.
|
||||||
|
|
||||||
|
If just the `analyzer` is set, it will be used at index time and at search time. To use a different analyzer at search time, specify both the `analyzer` and a `search_analyzer`.
|
||||||
|
|
||||||
|
The `index_analyzer`, `search_analyzer`, and `analyzer` type-level settings
|
||||||
|
have also been removed, as is is no longer possible to select fields based on
|
||||||
|
the type name.
|
||||||
|
|
||||||
|
The `_analyzer` meta-field, which allowed setting an analyzer per document has
|
||||||
|
also been removed. It will be ignored on older indices.
|
||||||
|
|
||||||
|
==== Date fields and Unix timestamps
|
||||||
|
|
||||||
|
Previously, `date` fields would first try to parse values as a Unix timestamp
|
||||||
|
-- milliseconds-since-the-epoch -- before trying to use their defined date
|
||||||
|
`format`. This meant that formats like `yyyyMMdd` could never work, as values
|
||||||
|
would be interpreted as timestamps.
|
||||||
|
|
||||||
|
In 2.0, we have added two formats: `epoch_millis` and `epoch_second`. Only
|
||||||
|
date fields that use these formats will be able to parse timestamps.
|
||||||
|
|
||||||
|
These formats cannot be used in dynamic templates, because they are
|
||||||
|
indistinguishable from long values.
|
||||||
|
|
||||||
|
==== Default date format
|
||||||
|
|
||||||
|
The default date format has changed from `date_optional_time` to
|
||||||
|
`strict_date_optional_time`, which expects a 4 digit year, and a 2 digit month
|
||||||
|
and day, (and optionally, 2 digit hour, minute, and second).
|
||||||
|
|
||||||
|
A dynamically added date field, by default, includes the `epoch_millis`
|
||||||
|
format to support timestamp parsing. For instance:
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
-------------------------
|
||||||
|
PUT my_index/my_type/1
|
||||||
|
{
|
||||||
|
"date_one": "2015-01-01" <1>
|
||||||
|
}
|
||||||
|
-------------------------
|
||||||
|
<1> Has `format`: `"strict_date_optional_time||epoch_millis"`.
|
||||||
|
|
||||||
|
[[migration-bool-fields]]
|
||||||
|
==== Boolean fields
|
||||||
|
|
||||||
|
Boolean fields used to have a string fielddata with `F` meaning `false` and `T`
|
||||||
|
meaning `true`. They have been refactored to use numeric fielddata, with `0`
|
||||||
|
for `false` and `1` for `true`. As a consequence, the format of the responses of
|
||||||
|
the following APIs changed when applied to boolean fields: `0`/`1` is returned
|
||||||
|
instead of `F`/`T`:
|
||||||
|
|
||||||
|
* <<search-request-fielddata-fields,fielddata fields>>
|
||||||
|
* <<search-request-sort,sort values>>
|
||||||
|
* <<search-aggregations-bucket-terms-aggregation,terms aggregations>>
|
||||||
|
|
||||||
|
In addition, terms aggregations use a custom formatter for boolean (like for
|
||||||
|
dates and ip addresses, which are also backed by numbers) in order to return
|
||||||
|
the user-friendly representation of boolean fields: `false`/`true`:
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
---------------
|
||||||
|
"buckets": [
|
||||||
|
{
|
||||||
|
"key": 0,
|
||||||
|
"key_as_string": "false",
|
||||||
|
"doc_count": 42
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": 1,
|
||||||
|
"key_as_string": "true",
|
||||||
|
"doc_count": 12
|
||||||
|
}
|
||||||
|
]
|
||||||
|
---------------
|
||||||
|
|
||||||
|
==== `index_name` and `path` removed
|
||||||
|
|
||||||
|
The `index_name` setting was used to change the name of the Lucene field,
|
||||||
|
and the `path` setting was used on `object` fields to determine whether the
|
||||||
|
Lucene field should use the full path (including parent object fields), or
|
||||||
|
just the final `name`.
|
||||||
|
|
||||||
|
These setting have been removed as their purpose is better served with the
|
||||||
|
<<copy-to>> parameter.
|
||||||
|
|
||||||
|
==== Murmur3 Fields
|
||||||
|
|
||||||
|
Fields of type `murmur3` can no longer change `doc_values` or `index` setting.
|
||||||
|
They are always mapped as follows:
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
---------------------
|
||||||
|
{
|
||||||
|
"type": "murmur3",
|
||||||
|
"index": "no",
|
||||||
|
"doc_values": true
|
||||||
|
}
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
==== Mappings in config files not supported
|
||||||
|
|
||||||
|
The ability to specify mappings in configuration files has been removed. To
|
||||||
|
specify default mappings that apply to multiple indexes, use
|
||||||
|
<<indices-templates,index templates>> instead.
|
||||||
|
|
||||||
|
Along with this change, the following settings have ben removed:
|
||||||
|
|
||||||
|
* `index.mapper.default_mapping_location`
|
||||||
|
* `index.mapper.default_percolator_mapping_location`
|
||||||
|
|
||||||
|
==== Posting and doc-values codecs
|
||||||
|
|
||||||
|
It is no longer possible to specify per-field postings and doc values formats
|
||||||
|
in the mappings. This setting will be ignored on indices created before 2.0
|
||||||
|
and will cause mapping parsing to fail on indices created on or after 2.0. For
|
||||||
|
old indices, this means that new segments will be written with the default
|
||||||
|
postings and doc values formats of the current codec.
|
||||||
|
|
||||||
|
It is still possible to change the whole codec by using the `index.codec`
|
||||||
|
setting. Please however note that using a non-default codec is discouraged as
|
||||||
|
it could prevent future versions of Elasticsearch from being able to read the
|
||||||
|
index.
|
||||||
|
|
||||||
|
==== Compress and compress threshold
|
||||||
|
|
||||||
|
The `compress` and `compress_threshold` options have been removed from the
|
||||||
|
`_source` field and fields of type `binary`. These fields are compressed by
|
||||||
|
default. If you would like to increase compression levels, use the new
|
||||||
|
<<index-codec,`index.codec: best_compression`>> setting instead.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,58 @@
|
||||||
|
=== Plugin and packaging changes
|
||||||
|
|
||||||
|
==== Symbolic links and paths
|
||||||
|
|
||||||
|
Elasticsearch 2.0 runs with the Java security manager enabled and is much more
|
||||||
|
restrictive about which paths it is allowed to access. Various paths can be
|
||||||
|
configured, e.g. `path.data`, `path.scripts`, `path.repo`. A configured path
|
||||||
|
may itself be a symbolic link, but no symlinks under that path will be
|
||||||
|
followed (with the exception of `path.scripts`, which does follow symlinks).
|
||||||
|
|
||||||
|
==== Running `/bin/elasticsearch`
|
||||||
|
|
||||||
|
The command line parameter parsing has been rewritten to deal properly with
|
||||||
|
spaces in parameters. All config settings can still be specified on the
|
||||||
|
command line when starting Elasticsearch, but they must appear after the
|
||||||
|
built-in "static parameters", such as `-d` (to daemonize) and `-p` (the PID path).
|
||||||
|
|
||||||
|
For instance:
|
||||||
|
|
||||||
|
[source,sh]
|
||||||
|
-----------
|
||||||
|
/bin/elasticsearch -d -p /tmp/foo.pid --http.cors.enabled=true --http.cors.allow-origin='*'
|
||||||
|
-----------
|
||||||
|
|
||||||
|
For a list of static parameters, run `/bin/elasticsearch -h`
|
||||||
|
|
||||||
|
==== `-f` removed
|
||||||
|
|
||||||
|
The `-f` parameter, which used to indicate that Elasticsearch should be run in
|
||||||
|
the foreground, was deprecated in 1.0 and removed in 2.0.
|
||||||
|
|
||||||
|
==== `V` for version
|
||||||
|
|
||||||
|
The `-v` parameter now means `--verbose` for both `bin/plugin` and
|
||||||
|
`bin/elasticsearch` (although it has no effect on the latter). To output the
|
||||||
|
version, use `-V` or `--version` instead.
|
||||||
|
|
||||||
|
==== Plugin manager should run as root
|
||||||
|
|
||||||
|
The permissions of the `config`, `bin`, and `plugins` directories in the RPM
|
||||||
|
and deb packages have been made more restrictive. The plugin manager should
|
||||||
|
be run as root otherwise it will not be able to install plugins.
|
||||||
|
|
||||||
|
==== Support for official plugins
|
||||||
|
|
||||||
|
Almost all of the official Elasticsearch plugins have been moved to the main
|
||||||
|
`elasticsearch` repository. They will be released at the same time as
|
||||||
|
Elasticsearch and have the same version number as Elasticsearch.
|
||||||
|
|
||||||
|
Official plugins can be installed as follows:
|
||||||
|
|
||||||
|
[source,sh]
|
||||||
|
---------------
|
||||||
|
sudo bin/plugin install analysis-icu
|
||||||
|
---------------
|
||||||
|
|
||||||
|
Community-provided plugins can be installed as before.
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
=== Parent/Child changes
|
||||||
|
|
||||||
|
Parent/child has been rewritten completely to reduce memory usage and to
|
||||||
|
execute `has_child` and `has_parent` queries faster and more efficient. The
|
||||||
|
`_parent` field uses doc values by default. The refactored and improved
|
||||||
|
implementation is only active for indices created on or after version 2.0.
|
||||||
|
|
||||||
|
In order to benefit from all the performance and memory improvements, we
|
||||||
|
recommend reindexing all existing indices that use the `_parent` field.
|
||||||
|
|
||||||
|
==== Parent type cannot pre-exist
|
||||||
|
|
||||||
|
A mapping type is declared as a child of another mapping type by specifying
|
||||||
|
the `_parent` meta field:
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
--------------------------
|
||||||
|
DELETE *
|
||||||
|
|
||||||
|
PUT my_index
|
||||||
|
{
|
||||||
|
"mappings": {
|
||||||
|
"my_parent": {},
|
||||||
|
"my_child": {
|
||||||
|
"_parent": {
|
||||||
|
"type": "my_parent" <1>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
--------------------------
|
||||||
|
<1> The `my_parent` type is the parent of the `my_child` type.
|
||||||
|
|
||||||
|
The mapping for the parent type can be added at the same time as the mapping
|
||||||
|
for the child type, but cannot be added before the child type.
|
||||||
|
|
||||||
|
==== `top_children` query removed
|
||||||
|
|
||||||
|
The `top_children` query has been removed in favour of the `has_child` query.
|
||||||
|
It wasn't always faster than the `has_child` query and the was usually
|
||||||
|
inaccurate. The total hits and any aggregations in the same search request
|
||||||
|
would be incorrect if `top_children` was used.
|
||||||
|
|
|
@ -0,0 +1,186 @@
|
||||||
|
=== Query DSL changes
|
||||||
|
|
||||||
|
==== Queries and filters merged
|
||||||
|
|
||||||
|
Queries and filters have been merged -- all filter clauses are now query
|
||||||
|
clauses. Instead, query clauses can now be used in _query context_ or in
|
||||||
|
_filter context_:
|
||||||
|
|
||||||
|
Query context::
|
||||||
|
|
||||||
|
A query used in query context will caculated relevance scores and will not be
|
||||||
|
cacheable. Query context is used whenever filter context does not apply.
|
||||||
|
|
||||||
|
Filter context::
|
||||||
|
+
|
||||||
|
--
|
||||||
|
|
||||||
|
A query used in filter context will not calculate relevance scores, and will
|
||||||
|
be cacheable. Filter context is introduced by:
|
||||||
|
|
||||||
|
* the `constant_score` query
|
||||||
|
* the `must_not` and (newly added) `filter` parameter in the `bool` query
|
||||||
|
* the `filter` and `filters` parameters in the `function_score` query
|
||||||
|
* any API called `filter`, such as the `post_filter` search parameter, or in
|
||||||
|
aggregations or index aliases
|
||||||
|
--
|
||||||
|
|
||||||
|
As a result of this change, he `execution` option of the `terms` filter is now
|
||||||
|
deprecated and ignored if provided.
|
||||||
|
|
||||||
|
==== `or` and `and` now implemented via `bool`
|
||||||
|
|
||||||
|
The `or` and `and` filters previously had a different execution pattern to the
|
||||||
|
`bool` filter. It used to be important to use `and`/`or` with certain filter
|
||||||
|
clauses, and `bool` with others.
|
||||||
|
|
||||||
|
This distinction has been removed: the `bool` query is now smart enough to
|
||||||
|
handle both cases optimally. As a result of this change, the `or` and `and`
|
||||||
|
filters are now sugar syntax which are executed internally as a `bool` query.
|
||||||
|
These filters may be removed in the future.
|
||||||
|
|
||||||
|
==== `filtered` query and `query` filter deprecated
|
||||||
|
|
||||||
|
The `query` filter is deprecated as is it no longer needed -- all queries can
|
||||||
|
be used in query or filter context.
|
||||||
|
|
||||||
|
The `filtered` query is deprecated in favour of the `bool` query. Instead of
|
||||||
|
the following:
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
-------------------------
|
||||||
|
GET _search
|
||||||
|
{
|
||||||
|
"query": {
|
||||||
|
"filtered": {
|
||||||
|
"query": {
|
||||||
|
"match": {
|
||||||
|
"text": "quick brown fox"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"filter": {
|
||||||
|
"term": {
|
||||||
|
"status": "published"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
move the query and filter to the `must` and `filter` parameters in the `bool`
|
||||||
|
query:
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
-------------------------
|
||||||
|
GET _search
|
||||||
|
{
|
||||||
|
"query": {
|
||||||
|
"bool": {
|
||||||
|
"must": {
|
||||||
|
"match": {
|
||||||
|
"text": "quick brown fox"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"filter": {
|
||||||
|
"term": {
|
||||||
|
"status": "published"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
==== Filter auto-caching
|
||||||
|
|
||||||
|
It used to be possible to control which filters were cached with the `_cache`
|
||||||
|
option and to provide a custom `_cache_key`. These options are deprecated
|
||||||
|
and, if present, will be ignored.
|
||||||
|
|
||||||
|
Query clauses used in filter context are now auto-cached when it makes sense
|
||||||
|
to do so. The algorithm takes into account the frequency of use, the cost of
|
||||||
|
query execution, and the cost of building the filter.
|
||||||
|
|
||||||
|
The `terms` filter lookup mechanism no longer caches the values of the
|
||||||
|
document containing the terms. It relies on the filesystem cache instead. If
|
||||||
|
the lookup index is not too large, it is recommended to replicate it to all
|
||||||
|
nodes by setting `index.auto_expand_replicas: 0-all` in order to remove the
|
||||||
|
network overhead as well.
|
||||||
|
|
||||||
|
==== Numeric queries use IDF for scoring
|
||||||
|
|
||||||
|
Previously, term queries on numeric fields were deliberately prevented from
|
||||||
|
using the usual Lucene scoring logic and this behaviour was undocumented and,
|
||||||
|
to some, unexpected.
|
||||||
|
|
||||||
|
Single `term` queries on numeric fields now score in the same way as string
|
||||||
|
fields, using IDF and norms (if enabled).
|
||||||
|
|
||||||
|
To query numeric fields without scoring, the query clause should be used in
|
||||||
|
filter context, e.g. in the `filter` parameter of the `bool` query, or wrapped
|
||||||
|
in a `constant_score` query:
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
----------------------------
|
||||||
|
GET _search
|
||||||
|
{
|
||||||
|
"query": {
|
||||||
|
"bool": {
|
||||||
|
"must": [
|
||||||
|
{
|
||||||
|
"match": { <1>
|
||||||
|
"numeric_tag": 5
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"filter": [
|
||||||
|
{
|
||||||
|
"match": { <2>
|
||||||
|
"count": 5
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
----------------------------
|
||||||
|
<1> This clause would include IDF in the relevance score calculation.
|
||||||
|
<2> This clause would have no effect on the relevance score.
|
||||||
|
|
||||||
|
==== Fuzziness and fuzzy-like-this
|
||||||
|
|
||||||
|
Fuzzy matching used to calculate the score for each fuzzy alternative, meaning
|
||||||
|
that rare misspellings would have a higher score than the more common correct
|
||||||
|
spellings. Now, fuzzy matching blends the scores of all the fuzzy alternatives
|
||||||
|
to use the IDF of the most frequently occurring alternative.
|
||||||
|
|
||||||
|
Fuzziness can no longer be specified using a percentage, but should instead
|
||||||
|
use the number of allowed edits:
|
||||||
|
|
||||||
|
* `0`, `1`, `2`, or
|
||||||
|
* `AUTO` (which chooses `0`, `1`, or `2` based on the length of the term)
|
||||||
|
|
||||||
|
The `fuzzy_like_this` and `fuzzy_like_this_field` queries used a very
|
||||||
|
expensive approach to fuzzy matching and have been removed.
|
||||||
|
|
||||||
|
==== More Like This
|
||||||
|
|
||||||
|
The More Like This (`mlt`) API and the `more_like_this_field` (`mlt_field`)
|
||||||
|
query have been removed in favor of the
|
||||||
|
<<query-dsl-mlt-query, `more_like_this`>> query.
|
||||||
|
|
||||||
|
The parameter `percent_terms_to_match` has been removed in favor of
|
||||||
|
`minimum_should_match`.
|
||||||
|
|
||||||
|
==== `limit` filter deprecated
|
||||||
|
|
||||||
|
The `limit` filter is deprecated and becomes a no-op. You can achieve similar
|
||||||
|
behaviour using the <<search-request-body,terminate_after>> parameter.
|
||||||
|
|
||||||
|
==== Jave plugins registering custom queries
|
||||||
|
|
||||||
|
Java plugins that register custom queries can do so by using the
|
||||||
|
`IndicesQueriesModule#addQuery(Class<? extends QueryParser>)` method. Other
|
||||||
|
ways to register custom queries are not supported anymore.
|
||||||
|
|
|
@ -0,0 +1,68 @@
|
||||||
|
=== Removed features
|
||||||
|
|
||||||
|
==== Rivers have been removed
|
||||||
|
|
||||||
|
Elasticsearch does not support rivers anymore. While we had first planned to
|
||||||
|
keep them around to ease migration, keeping support for rivers proved to be
|
||||||
|
challenging as it conflicted with other important changes that we wanted to
|
||||||
|
bring to 2.0 like synchronous dynamic mappings updates, so we eventually
|
||||||
|
decided to remove them entirely. See
|
||||||
|
link:/blog/deprecating_rivers[Deprecating Rivers] for more background about
|
||||||
|
why we took this decision.
|
||||||
|
|
||||||
|
==== Facets have been removed
|
||||||
|
|
||||||
|
Facets, deprecated since 1.0, have now been removed. Instead, use the much
|
||||||
|
more powerful and flexible <<search-aggregations,aggregations>> framework.
|
||||||
|
This also means that Kibana 3 will not work with Elasticsearch 2.0.
|
||||||
|
|
||||||
|
==== Delete-by-query is now a plugin
|
||||||
|
|
||||||
|
The old delete-by-query functionality was fast but unsafe. It could lead to
|
||||||
|
document differences between the primary and replica shards, and could even
|
||||||
|
produce out of memory exceptions and cause the cluster to crash.
|
||||||
|
|
||||||
|
This feature has been reimplemented using the <<scroll-scan,scroll/scan>> and
|
||||||
|
the <<docs-bulk,`bulk`>> API, which may be slower for queries which match
|
||||||
|
large numbers of documents, but is safe.
|
||||||
|
|
||||||
|
Currently, a long running delete-by-query job cannot be cancelled, which is
|
||||||
|
one of the reasons that this functionality is only available as a plugin. You
|
||||||
|
can install the plugin with:
|
||||||
|
|
||||||
|
[source,sh]
|
||||||
|
------------------
|
||||||
|
./bin/plugin install delete-by-query
|
||||||
|
------------------
|
||||||
|
|
||||||
|
|
||||||
|
==== `_shutdown` API
|
||||||
|
|
||||||
|
The `_shutdown` API has been removed without a replacement. Nodes should be
|
||||||
|
managed via the operating system and the provided start/stop scripts.
|
||||||
|
|
||||||
|
==== `_size` is now a plugin
|
||||||
|
|
||||||
|
The `_size` meta-data field, which indexes the size in bytes of the original
|
||||||
|
JSON document, has been moved out of core and is available as a plugin. It
|
||||||
|
can be installed as:
|
||||||
|
|
||||||
|
[source,sh]
|
||||||
|
------------------
|
||||||
|
./bin/plugin install mapper-size
|
||||||
|
------------------
|
||||||
|
|
||||||
|
==== Thrift and memcached transport
|
||||||
|
|
||||||
|
The thrift and memcached transport plugins are no longer supported. Instead, use
|
||||||
|
either the HTTP transport (enabled by default) or the node or transport Java client.
|
||||||
|
|
||||||
|
==== Bulk UDP
|
||||||
|
|
||||||
|
The bulk UDP API has been removed. Instead, use the standard
|
||||||
|
<<docs-bulk,`bulk`>> API, or use UDP to send documents to Logstash first.
|
||||||
|
|
||||||
|
==== MergeScheduler pluggability
|
||||||
|
|
||||||
|
The merge scheduler is no longer pluggable.
|
||||||
|
|
|
@ -0,0 +1,102 @@
|
||||||
|
=== Scripting changes
|
||||||
|
|
||||||
|
==== Scripting syntax
|
||||||
|
|
||||||
|
The syntax for scripts has been made consistent across all APIs. The accepted
|
||||||
|
format is as follows:
|
||||||
|
|
||||||
|
Inline/Dynamic scripts::
|
||||||
|
+
|
||||||
|
--
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
---------------
|
||||||
|
"script": {
|
||||||
|
"inline": "doc['foo'].value + val", <1>
|
||||||
|
"lang": "groovy", <2>
|
||||||
|
"params": { "val": 3 } <3>
|
||||||
|
}
|
||||||
|
---------------
|
||||||
|
<1> The inline script to execute.
|
||||||
|
<2> The optional language of the script.
|
||||||
|
<3> Any named parameters.
|
||||||
|
--
|
||||||
|
|
||||||
|
Indexed scripts::
|
||||||
|
+
|
||||||
|
--
|
||||||
|
[source,js]
|
||||||
|
---------------
|
||||||
|
"script": {
|
||||||
|
"id": "my_script_id", <1>
|
||||||
|
"lang": "groovy", <2>
|
||||||
|
"params": { "val": 3 } <3>
|
||||||
|
}
|
||||||
|
---------------
|
||||||
|
<1> The ID of the indexed script.
|
||||||
|
<2> The optional language of the script.
|
||||||
|
<3> Any named parameters.
|
||||||
|
--
|
||||||
|
|
||||||
|
File scripts::
|
||||||
|
+
|
||||||
|
--
|
||||||
|
[source,js]
|
||||||
|
---------------
|
||||||
|
"script": {
|
||||||
|
"file": "my_file", <1>
|
||||||
|
"lang": "groovy", <2>
|
||||||
|
"params": { "val": 3 } <3>
|
||||||
|
}
|
||||||
|
---------------
|
||||||
|
<1> The filename of the script, without the `.lang` suffix.
|
||||||
|
<2> The optional language of the script.
|
||||||
|
<3> Any named parameters.
|
||||||
|
--
|
||||||
|
|
||||||
|
For example, an update request might look like this:
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
---------------
|
||||||
|
POST my_index/my_type/1/_update
|
||||||
|
{
|
||||||
|
"script": {
|
||||||
|
"inline": "ctx._source.count += val",
|
||||||
|
"params": { "val": 3 }
|
||||||
|
},
|
||||||
|
"upsert": {
|
||||||
|
"count": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
---------------
|
||||||
|
|
||||||
|
A short syntax exists for running inline scripts in the default scripting
|
||||||
|
language without any parameters:
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
----------------
|
||||||
|
GET _search
|
||||||
|
{
|
||||||
|
"script_fields": {
|
||||||
|
"concat_fields": {
|
||||||
|
"script": "doc['one'].value + ' ' + doc['two'].value"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
----------------
|
||||||
|
|
||||||
|
==== Scripting settings
|
||||||
|
|
||||||
|
The `script.disable_dynamic` node setting has been replaced by fine-grained
|
||||||
|
script settings described in <<migration-script-settings>>.
|
||||||
|
|
||||||
|
==== Groovy scripts sandbox
|
||||||
|
|
||||||
|
The Groovy sandbox and related settings have been removed. Groovy is now a
|
||||||
|
non-sandboxed scripting language, without any option to turn the sandbox on.
|
||||||
|
|
||||||
|
==== Plugins making use of scripts
|
||||||
|
|
||||||
|
Plugins that make use of scripts must register their own script context
|
||||||
|
through `ScriptModule`. Script contexts can be used as part of fine-grained
|
||||||
|
settings to enable/disable scripts selectively.
|
|
@ -0,0 +1,121 @@
|
||||||
|
=== Search changes
|
||||||
|
|
||||||
|
==== Partial fields
|
||||||
|
|
||||||
|
Partial fields have been removed in favor of <<search-request-source-filtering,source filtering>>.
|
||||||
|
|
||||||
|
==== `search_type=count` deprecated
|
||||||
|
|
||||||
|
The `count` search type has been deprecated. All benefits from this search
|
||||||
|
type can now be achieved by using the (default) `query_then_fetch` search type
|
||||||
|
and setting `size` to `0`.
|
||||||
|
|
||||||
|
==== The count api internally uses the search api
|
||||||
|
|
||||||
|
The count api is now a shortcut to the search api with `size` set to 0. As a
|
||||||
|
result, a total failure will result in an exception being returned rather
|
||||||
|
than a normal response with `count` set to `0` and shard failures.
|
||||||
|
|
||||||
|
==== All stored meta-fields returned by default
|
||||||
|
|
||||||
|
Previously, meta-fields like `_routing`, `_timestamp`, etc would only be
|
||||||
|
included in the search results if specifically requested with the `fields`
|
||||||
|
parameter. Now, all meta-fields which have stored values will be returned by
|
||||||
|
default. Additionally, they are now returned at the top level (along with
|
||||||
|
`_index`, `_type`, and `_id`) instead of in the `fields` element.
|
||||||
|
|
||||||
|
For instance, the following request:
|
||||||
|
|
||||||
|
[source,sh]
|
||||||
|
---------------
|
||||||
|
GET /my_index/_search?fields=foo
|
||||||
|
---------------
|
||||||
|
|
||||||
|
might return:
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
---------------
|
||||||
|
{
|
||||||
|
[...]
|
||||||
|
"hits": {
|
||||||
|
"total": 1,
|
||||||
|
"max_score": 1,
|
||||||
|
"hits": [
|
||||||
|
{
|
||||||
|
"_index": "my_index",
|
||||||
|
"_type": "my_type",
|
||||||
|
"_id": "1",
|
||||||
|
"_score": 1,
|
||||||
|
"_timestamp": 10000000, <1>
|
||||||
|
"fields": {
|
||||||
|
"foo" : [ "bar" ]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
---------------
|
||||||
|
<1> The `_timestamp` is returned by default, and at the top level.
|
||||||
|
|
||||||
|
|
||||||
|
==== Script fields
|
||||||
|
|
||||||
|
Script fields in 1.x were only returned as a single value. Even if the return
|
||||||
|
value of a script was a list, it would be returned as an array containing an
|
||||||
|
array:
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
---------------
|
||||||
|
"fields": {
|
||||||
|
"my_field": [
|
||||||
|
[
|
||||||
|
"v1",
|
||||||
|
"v2"
|
||||||
|
]
|
||||||
|
]
|
||||||
|
}
|
||||||
|
---------------
|
||||||
|
|
||||||
|
In elasticsearch 2.0, scripts that return a list of values are treated as
|
||||||
|
multivalued fields. The same example would return the following response, with
|
||||||
|
values in a single array.
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
---------------
|
||||||
|
"fields": {
|
||||||
|
"my_field": [
|
||||||
|
"v1",
|
||||||
|
"v2"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
---------------
|
||||||
|
|
||||||
|
==== Timezone for date field
|
||||||
|
|
||||||
|
Specifying the `time_zone` parameter in queries or aggregations on fields of
|
||||||
|
type `date` must now be either an ISO 8601 UTC offset, or a timezone id. For
|
||||||
|
example, the value `+1:00` must now be written as `+01:00`.
|
||||||
|
|
||||||
|
==== Only highlight queried fields
|
||||||
|
|
||||||
|
The default value for the `require_field_match` option has changed from
|
||||||
|
`false` to `true`, meaning that the highlighters will, by default, only take
|
||||||
|
the fields that were queried into account.
|
||||||
|
|
||||||
|
This means that, when querying the `_all` field, trying to highlight on any
|
||||||
|
field other than `_all` will produce no highlighted snippets. Querying the
|
||||||
|
same fields that need to be highlighted is the cleaner solution to get
|
||||||
|
highlighted snippets back. Otherwise `require_field_match` option can be set
|
||||||
|
to `false` to ignore field names completely when highlighting.
|
||||||
|
|
||||||
|
The postings highlighter doesn't support the `require_field_match` option
|
||||||
|
anymore, it will only highlight fields that were queried.
|
||||||
|
|
||||||
|
==== Postings highlighter doesn't support `match_phrase_prefix`
|
||||||
|
|
||||||
|
The `match` query with type set to `phrase_prefix` (or the
|
||||||
|
`match_phrase_prefix` query) is not supported by the postings highlighter. No
|
||||||
|
highlighted snippets will be returned.
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,125 @@
|
||||||
|
=== Setting changes
|
||||||
|
|
||||||
|
[[migration-script-settings]]
|
||||||
|
==== Scripting settings
|
||||||
|
|
||||||
|
The `script.disable_dynamic` node setting has been replaced by fine-grained
|
||||||
|
script settings described in the <<enable-dynamic-scripting,scripting docs>>.
|
||||||
|
The following setting previously used to enable dynamic or inline scripts:
|
||||||
|
|
||||||
|
[source,yaml]
|
||||||
|
---------------
|
||||||
|
script.disable_dynamic: false
|
||||||
|
---------------
|
||||||
|
|
||||||
|
It should be replaced with the following two settings in `elasticsearch.yml` that
|
||||||
|
achieve the same result:
|
||||||
|
|
||||||
|
[source,yaml]
|
||||||
|
---------------
|
||||||
|
script.inline: on
|
||||||
|
script.indexed: on
|
||||||
|
---------------
|
||||||
|
|
||||||
|
==== Units required for time and byte-sized settings
|
||||||
|
|
||||||
|
Any settings which accept time or byte values must now be specified with
|
||||||
|
units. For instance, it is too easy to set the `refresh_interval` to 1
|
||||||
|
*millisecond* instead of 1 second:
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
---------------
|
||||||
|
PUT _settings
|
||||||
|
{
|
||||||
|
"index.refresh_interval": 1
|
||||||
|
}
|
||||||
|
---------------
|
||||||
|
|
||||||
|
In 2.0, the above request will throw an exception. Instead the refresh
|
||||||
|
interval should be set to `"1s"` for one second.
|
||||||
|
|
||||||
|
==== Shadow replica settings
|
||||||
|
|
||||||
|
The `node.enable_custom_paths` setting has been removed and replaced by the
|
||||||
|
`path.shared_data` setting to allow shadow replicas with custom paths to work
|
||||||
|
with the security manager. For example, if your previous configuration had:
|
||||||
|
|
||||||
|
[source,yaml]
|
||||||
|
------
|
||||||
|
node.enable_custom_paths: true
|
||||||
|
------
|
||||||
|
|
||||||
|
And you created an index using shadow replicas with `index.data_path` set to
|
||||||
|
`/opt/data/my_index` with the following:
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
--------------------------------------------------
|
||||||
|
PUT /my_index
|
||||||
|
{
|
||||||
|
"index": {
|
||||||
|
"number_of_shards": 1,
|
||||||
|
"number_of_replicas": 4,
|
||||||
|
"data_path": "/opt/data/my_index",
|
||||||
|
"shadow_replicas": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
--------------------------------------------------
|
||||||
|
|
||||||
|
For 2.0, you will need to set `path.shared_data` to a parent directory of the
|
||||||
|
index's data_path, so:
|
||||||
|
|
||||||
|
[source,yaml]
|
||||||
|
-----------
|
||||||
|
path.shared_data: /opt/data
|
||||||
|
-----------
|
||||||
|
|
||||||
|
==== Resource watcher settings renamed
|
||||||
|
|
||||||
|
The setting names for configuring the resource watcher have been renamed
|
||||||
|
to prevent clashes with the watcher plugin
|
||||||
|
|
||||||
|
* `watcher.enabled` is now `resource.reload.enabled`
|
||||||
|
* `watcher.interval` is now `resource.reload.interval`
|
||||||
|
* `watcher.interval.low` is now `resource.reload.interval.low`
|
||||||
|
* `watcher.interval.medium` is now `resource.reload.interval.medium`
|
||||||
|
* `watcher.interval.high` is now `resource.reload.interval.high`
|
||||||
|
|
||||||
|
==== Hunspell dictionary configuration
|
||||||
|
|
||||||
|
The parameter `indices.analysis.hunspell.dictionary.location` has been
|
||||||
|
removed, and `<path.conf>/hunspell` is always used.
|
||||||
|
|
||||||
|
==== CORS allowed origins
|
||||||
|
|
||||||
|
The CORS allowed origins setting, `http.cors.allow-origin`, no longer has a default value. Previously, the default value
|
||||||
|
was `*`, which would allow CORS requests from any origin and is considered insecure. The `http.cors.allow-origin` setting
|
||||||
|
should be specified with only the origins that should be allowed, like so:
|
||||||
|
|
||||||
|
[source,yaml]
|
||||||
|
---------------
|
||||||
|
http.cors.allow-origin: /https?:\/\/localhost(:[0-9]+)?/
|
||||||
|
---------------
|
||||||
|
|
||||||
|
==== JSONP support
|
||||||
|
|
||||||
|
JSONP callback support has now been removed. CORS should be used to access Elasticsearch
|
||||||
|
over AJAX instead:
|
||||||
|
|
||||||
|
[source,yaml]
|
||||||
|
---------------
|
||||||
|
http.cors.enabled: true
|
||||||
|
http.cors.allow-origin: /https?:\/\/localhost(:[0-9]+)?/
|
||||||
|
---------------
|
||||||
|
|
||||||
|
==== In memory indices
|
||||||
|
|
||||||
|
The `memory` / `ram` store (`index.store.type`) option was removed in
|
||||||
|
Elasticsearch. In-memory indices are no longer supported.
|
||||||
|
|
||||||
|
==== Log messages truncated
|
||||||
|
|
||||||
|
Log messages are now truncated at 10,000 characters. This can be changed in
|
||||||
|
the `logging.yml` configuration file with the `file.layout.conversionPattern`
|
||||||
|
setting.
|
||||||
|
|
||||||
|
Remove mapping.date.round_ceil setting for date math parsing #8889 (issues: #8556, #8598)
|
|
@ -0,0 +1,37 @@
|
||||||
|
=== Snapshot and Restore changes
|
||||||
|
|
||||||
|
==== File-system repositories must be whitelisted
|
||||||
|
|
||||||
|
Locations of the shared file system repositories and the URL repositories with
|
||||||
|
`file:` URLs now have to be registered before starting Elasticsearch using the
|
||||||
|
`path.repo` setting. The `path.repo` setting can contain one or more
|
||||||
|
repository locations:
|
||||||
|
|
||||||
|
[source,yaml]
|
||||||
|
---------------
|
||||||
|
path.repo: ["/mnt/daily", "/mnt/weekly"]
|
||||||
|
---------------
|
||||||
|
|
||||||
|
If the repository location is specified as an absolute path it has to start
|
||||||
|
with one of the locations specified in `path.repo`. If the location is
|
||||||
|
specified as a relative path, it will be resolved against the first location
|
||||||
|
specified in the `path.repo` setting.
|
||||||
|
|
||||||
|
==== URL repositories must be whitelisted
|
||||||
|
|
||||||
|
URL repositories with `http:`, `https:`, and `ftp:` URLs have to be
|
||||||
|
whitelisted before starting Elasticsearch with the
|
||||||
|
`repositories.url.allowed_urls` setting. This setting supports wildcards in
|
||||||
|
the place of host, path, query, and fragment. For example:
|
||||||
|
|
||||||
|
[source,yaml]
|
||||||
|
-----------------------------------
|
||||||
|
repositories.url.allowed_urls: ["http://www.example.org/root/*", "https://*.mydomain.com/*?*#*"]
|
||||||
|
-----------------------------------
|
||||||
|
|
||||||
|
==== Wildcard expansion
|
||||||
|
|
||||||
|
The obsolete parameters `expand_wildcards_open` and `expand_wildcards_close`
|
||||||
|
are no longer supported by the snapshot and restore operations. These
|
||||||
|
parameters have been replaced by a single `expand_wildcards` parameter. See
|
||||||
|
<<multi-index,the multi-index docs>> for more.
|
|
@ -0,0 +1,57 @@
|
||||||
|
=== Stats, info, and `cat` changes
|
||||||
|
|
||||||
|
==== Sigar removed
|
||||||
|
|
||||||
|
We no longer ship the Sigar library for operating system dependent statistics,
|
||||||
|
as it no longer seems to be maintained. Instead, we rely on the statistics
|
||||||
|
provided by the JVM. This has resulted in a number of changes to the node
|
||||||
|
info, and node stats responses:
|
||||||
|
|
||||||
|
* `network.*` has been removed from nodes info and nodes stats.
|
||||||
|
* `fs.*.dev` and `fs.*.disk*` have been removed from nodes stats.
|
||||||
|
* `os.*` has been removed from nodes stats, except for `os.timestamp`,
|
||||||
|
`os.load_average`, `os.mem.*`, and `os.swap.*`.
|
||||||
|
* `os.mem.total` and `os.swap.total` have been removed from nodes info.
|
||||||
|
* `process.mem.resident` and `process.mem.share` have been removed from node stats.
|
||||||
|
|
||||||
|
==== Removed `id_cache` from stats apis
|
||||||
|
|
||||||
|
Removed `id_cache` metric from nodes stats, indices stats and cluster stats
|
||||||
|
apis. This metric has also been removed from the shards cat, indices cat and
|
||||||
|
nodes cat apis. Parent/child memory is now reported under fielddata, because
|
||||||
|
it has internally be using fielddata for a while now.
|
||||||
|
|
||||||
|
To just see how much parent/child related field data is taking, the
|
||||||
|
`fielddata_fields` option can be used on the stats apis. Indices stats
|
||||||
|
example:
|
||||||
|
|
||||||
|
[source,js]
|
||||||
|
--------------------------------------------------
|
||||||
|
GET /_stats/fielddata?fielddata_fields=_parent
|
||||||
|
--------------------------------------------------
|
||||||
|
|
||||||
|
==== Percolator stats
|
||||||
|
|
||||||
|
The total time spent running percolator queries is now called `percolate.time`
|
||||||
|
instead of `percolate.get_time`.
|
||||||
|
|
||||||
|
==== Cluster state REST API
|
||||||
|
|
||||||
|
The cluster state API doesn't return the `routing_nodes` section anymore when
|
||||||
|
`routing_table` is requested. The newly introduced `routing_nodes` flag can be
|
||||||
|
used separately to control whether `routing_nodes` should be returned.
|
||||||
|
|
||||||
|
==== Index status API
|
||||||
|
|
||||||
|
The deprecated index status API has been removed.
|
||||||
|
|
||||||
|
==== `cat` APIs verbose by default
|
||||||
|
|
||||||
|
The `cat` APIs now default to being verbose, which means they output column
|
||||||
|
headers by default. Verbosity can be turned off with the `v` parameter:
|
||||||
|
|
||||||
|
[source,sh]
|
||||||
|
-----------------
|
||||||
|
GET _cat/shards?v=0
|
||||||
|
-----------------
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
=== Multiple `data.path` striping
|
||||||
|
|
||||||
|
Previously, if the `data.path` setting listed multiple data paths, then a
|
||||||
|
shard would be ``striped'' across all paths by writing a whole file to each
|
||||||
|
path in turn (in accordance with the `index.store.distributor` setting). The
|
||||||
|
result was that files from a single segment in a shard could be spread across
|
||||||
|
multiple disks, and the failure of any one disk could corrupt multiple shards.
|
||||||
|
|
||||||
|
This striping is no longer supported. Instead, different shards may be
|
||||||
|
allocated to different paths, but all of the files in a single shard will be
|
||||||
|
written to the same path.
|
||||||
|
|
||||||
|
If striping is detected while starting Elasticsearch 2.0.0 or later, *all of
|
||||||
|
the files belonging to the same shard will be migrated to the same path*. If
|
||||||
|
there is not enough disk space to complete this migration, the upgrade will be
|
||||||
|
cancelled and can only be resumed once enough disk space is made available.
|
||||||
|
|
||||||
|
The `index.store.distributor` setting has also been removed.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue