Merge pull request #12150 from martijnvg/aliases/remove_strict_filter_parsing

Don't require fields in alias filters to exist in the mapping
This commit is contained in:
Martijn van Groningen 2015-07-10 16:50:51 +02:00
commit 9eb11267f5
4 changed files with 31 additions and 38 deletions

View File

@ -145,7 +145,6 @@ public class AliasValidator extends AbstractComponent {
QueryParseContext context = indexQueryParserService.getParseContext(); QueryParseContext context = indexQueryParserService.getParseContext();
try { try {
context.reset(parser); context.reset(parser);
context.setAllowUnmappedFields(false);
context.parseInnerFilter(); context.parseInnerFilter();
} finally { } finally {
context.reset(null); context.reset(null);

View File

@ -29,7 +29,6 @@ import org.elasticsearch.action.admin.indices.alias.get.GetAliasesResponse;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder; import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder;
import org.elasticsearch.action.index.IndexResponse; import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.cluster.ClusterState; import org.elasticsearch.cluster.ClusterState;
import org.elasticsearch.cluster.metadata.AliasAction; import org.elasticsearch.cluster.metadata.AliasAction;
import org.elasticsearch.cluster.metadata.AliasMetaData; import org.elasticsearch.cluster.metadata.AliasMetaData;
@ -39,7 +38,6 @@ import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.QueryParsingException;
import org.elasticsearch.rest.action.admin.indices.alias.delete.AliasesMissingException; import org.elasticsearch.rest.action.admin.indices.alias.delete.AliasesMissingException;
import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits; import org.elasticsearch.search.SearchHits;
@ -909,29 +907,21 @@ public class IndexAliasesTests extends ElasticsearchIntegrationTest {
} }
@Test @Test
// Before 2.0 alias filters were parsed at alias creation time, in order
// for filters to work correctly ES required that fields mentioned in those
// filters exist in the mapping.
// From 2.0 and higher alias filters are parsed at request time and therefor
// fields mentioned in filters don't need to exist in the mapping.
public void testAddAliasWithFilterNoMapping() throws Exception { public void testAddAliasWithFilterNoMapping() throws Exception {
assertAcked(prepareCreate("test")); assertAcked(prepareCreate("test"));
try {
client().admin().indices().prepareAliases()
.addAlias("test", "a", QueryBuilders.termQuery("field1", "term"))
.get();
fail();
} catch (IllegalArgumentException e) {
assertThat(e.getCause(), instanceOf(QueryParsingException.class));
}
try {
client().admin().indices().prepareAliases()
.addAlias("test", "a", QueryBuilders.rangeQuery("field2").from(0).to(1))
.get();
fail();
} catch (IllegalArgumentException e) {
assertThat(e.getCause(), instanceOf(QueryParsingException.class));
}
client().admin().indices().prepareAliases() client().admin().indices().prepareAliases()
.addAlias("test", "a", QueryBuilders.matchAllQuery()) // <-- no fail, b/c no field mentioned .addAlias("test", "a", QueryBuilders.termQuery("field1", "term"))
.get();
client().admin().indices().prepareAliases()
.addAlias("test", "a", QueryBuilders.rangeQuery("field2").from(0).to(1))
.get();
client().admin().indices().prepareAliases()
.addAlias("test", "a", QueryBuilders.matchAllQuery())
.get(); .get();
} }

View File

@ -20,9 +20,7 @@ package org.elasticsearch.indices.template;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import org.elasticsearch.ElasticsearchParseException; import org.elasticsearch.ElasticsearchParseException;
import org.elasticsearch.ExceptionsHelper;
import org.elasticsearch.action.ActionRequestValidationException; import org.elasticsearch.action.ActionRequestValidationException;
import org.elasticsearch.action.admin.indices.alias.Alias; import org.elasticsearch.action.admin.indices.alias.Alias;
import org.elasticsearch.action.admin.indices.alias.get.GetAliasesResponse; import org.elasticsearch.action.admin.indices.alias.get.GetAliasesResponse;
@ -33,7 +31,6 @@ import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.cluster.metadata.AliasMetaData; import org.elasticsearch.cluster.metadata.AliasMetaData;
import org.elasticsearch.common.compress.CompressedXContent;
import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.index.query.QueryBuilders;
@ -44,12 +41,10 @@ import org.elasticsearch.search.SearchHit;
import org.elasticsearch.test.ElasticsearchIntegrationTest; import org.elasticsearch.test.ElasticsearchIntegrationTest;
import org.junit.Test; import org.junit.Test;
import java.io.IOException;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import static org.elasticsearch.index.query.QueryBuilders.termQuery;
import static org.elasticsearch.index.query.QueryBuilders.termQuery; import static org.elasticsearch.index.query.QueryBuilders.termQuery;
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.*; import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.*;
import static org.hamcrest.Matchers.*; import static org.hamcrest.Matchers.*;
@ -659,17 +654,21 @@ public class SimpleIndexTemplateTests extends ElasticsearchIntegrationTest {
assertThat(response.getItems()[0].getId(), equalTo("test")); assertThat(response.getItems()[0].getId(), equalTo("test"));
assertThat(response.getItems()[0].getVersion(), equalTo(1l)); assertThat(response.getItems()[0].getVersion(), equalTo(1l));
try { // Before 2.0 alias filters were parsed at alias creation time, in order
client().prepareIndex("d1", "test", "test").setSource("{}").get(); // for filters to work correctly ES required that fields mentioned in those
fail(); // filters exist in the mapping.
} catch (Exception e) { // From 2.0 and higher alias filters are parsed at request time and therefor
assertThat(ExceptionsHelper.unwrapCause(e), instanceOf(IllegalArgumentException.class)); // fields mentioned in filters don't need to exist in the mapping.
assertThat(e.getMessage(), containsString("failed to parse filter for alias [alias4]")); // So the aliases defined in the index template for this index will not fail
} // even though the fields in the alias fields don't exist yet and indexing into
// an index that doesn't exist yet will succeed
client().prepareIndex("d1", "test", "test").setSource("{}").get();
response = client().prepareBulk().add(new IndexRequest("d2", "test", "test").source("{}")).get(); response = client().prepareBulk().add(new IndexRequest("d2", "test", "test").source("{}")).get();
assertThat(response.hasFailures(), is(true)); assertThat(response.hasFailures(), is(false));
assertThat(response.getItems()[0].isFailed(), equalTo(true)); assertThat(response.getItems()[0].isFailed(), equalTo(false));
assertThat(response.getItems()[0].getFailureMessage(), containsString("failed to parse filter for alias [alias4]")); assertThat(response.getItems()[0].getId(), equalTo("test"));
assertThat(response.getItems()[0].getVersion(), equalTo(1l));
} }
} }

View File

@ -770,3 +770,8 @@ For the record, official plugins which can use this new simplified form are:
* elasticsearch-lang-javascript * elasticsearch-lang-javascript
* elasticsearch-lang-python * elasticsearch-lang-python
=== Aliases
Fields used in alias filters no longer have to exist in the mapping upon alias creation time. Alias filters are now
parsed at request time and then the fields in filters are resolved from the mapping, whereas before alias filters were
parsed at alias creation time and the parsed form was kept around in memory.