Fix `_exists_` in query_string on empty indices. (#25993)
It currently fails if there are no mappings yet. Closes #25956
This commit is contained in:
parent
69f8641568
commit
58feb5efa0
|
@ -47,7 +47,6 @@ import org.apache.lucene.util.IOUtils;
|
||||||
import org.elasticsearch.common.lucene.search.Queries;
|
import org.elasticsearch.common.lucene.search.Queries;
|
||||||
import org.elasticsearch.common.regex.Regex;
|
import org.elasticsearch.common.regex.Regex;
|
||||||
import org.elasticsearch.common.unit.Fuzziness;
|
import org.elasticsearch.common.unit.Fuzziness;
|
||||||
import org.elasticsearch.index.analysis.ShingleTokenFilterFactory;
|
|
||||||
import org.elasticsearch.index.mapper.AllFieldMapper;
|
import org.elasticsearch.index.mapper.AllFieldMapper;
|
||||||
import org.elasticsearch.index.mapper.DateFieldMapper;
|
import org.elasticsearch.index.mapper.DateFieldMapper;
|
||||||
import org.elasticsearch.index.mapper.DocumentMapper;
|
import org.elasticsearch.index.mapper.DocumentMapper;
|
||||||
|
@ -683,6 +682,9 @@ public class QueryStringQueryParser extends XQueryParser {
|
||||||
private Query existsQuery(String fieldName) {
|
private Query existsQuery(String fieldName) {
|
||||||
final FieldNamesFieldMapper.FieldNamesFieldType fieldNamesFieldType =
|
final FieldNamesFieldMapper.FieldNamesFieldType fieldNamesFieldType =
|
||||||
(FieldNamesFieldMapper.FieldNamesFieldType) context.getMapperService().fullName(FieldNamesFieldMapper.NAME);
|
(FieldNamesFieldMapper.FieldNamesFieldType) context.getMapperService().fullName(FieldNamesFieldMapper.NAME);
|
||||||
|
if (fieldNamesFieldType == null) {
|
||||||
|
return new MatchNoDocsQuery("No mappings yet");
|
||||||
|
}
|
||||||
if (fieldNamesFieldType.isEnabled() == false) {
|
if (fieldNamesFieldType.isEnabled() == false) {
|
||||||
// The field_names_field is disabled so we switch to a wildcard query that matches all terms
|
// The field_names_field is disabled so we switch to a wildcard query that matches all terms
|
||||||
return new WildcardQuery(new Term(fieldName, "*"));
|
return new WildcardQuery(new Term(fieldName, "*"));
|
||||||
|
|
|
@ -779,12 +779,15 @@ public class QueryStringQueryBuilderTests extends AbstractQueryTestCase<QueryStr
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testExistsFieldQuery() throws Exception {
|
public void testExistsFieldQuery() throws Exception {
|
||||||
assumeTrue("test runs only when at least a type is registered", getCurrentTypes().length > 0);
|
|
||||||
|
|
||||||
QueryShardContext context = createShardContext();
|
QueryShardContext context = createShardContext();
|
||||||
QueryStringQueryBuilder queryBuilder = new QueryStringQueryBuilder("foo:*");
|
QueryStringQueryBuilder queryBuilder = new QueryStringQueryBuilder("foo:*");
|
||||||
Query query = queryBuilder.toQuery(context);
|
Query query = queryBuilder.toQuery(context);
|
||||||
Query expected = new ConstantScoreQuery(new TermQuery(new Term("_field_names", "foo")));
|
Query expected;
|
||||||
|
if (getCurrentTypes().length > 0) {
|
||||||
|
expected = new ConstantScoreQuery(new TermQuery(new Term("_field_names", "foo")));
|
||||||
|
} else {
|
||||||
|
expected = new MatchNoDocsQuery();
|
||||||
|
}
|
||||||
assertThat(query, equalTo(expected));
|
assertThat(query, equalTo(expected));
|
||||||
|
|
||||||
queryBuilder = new QueryStringQueryBuilder("_all:*");
|
queryBuilder = new QueryStringQueryBuilder("_all:*");
|
||||||
|
@ -804,6 +807,7 @@ public class QueryStringQueryBuilderTests extends AbstractQueryTestCase<QueryStr
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testDisabledFieldNamesField() throws Exception {
|
public void testDisabledFieldNamesField() throws Exception {
|
||||||
|
assumeTrue("No types", getCurrentTypes().length > 0);
|
||||||
QueryShardContext context = createShardContext();
|
QueryShardContext context = createShardContext();
|
||||||
context.getMapperService().merge("doc",
|
context.getMapperService().merge("doc",
|
||||||
new CompressedXContent(
|
new CompressedXContent(
|
||||||
|
@ -811,10 +815,13 @@ public class QueryStringQueryBuilderTests extends AbstractQueryTestCase<QueryStr
|
||||||
"foo", "type=text",
|
"foo", "type=text",
|
||||||
"_field_names", "enabled=false").string()),
|
"_field_names", "enabled=false").string()),
|
||||||
MapperService.MergeReason.MAPPING_UPDATE, true);
|
MapperService.MergeReason.MAPPING_UPDATE, true);
|
||||||
|
try {
|
||||||
QueryStringQueryBuilder queryBuilder = new QueryStringQueryBuilder("foo:*");
|
QueryStringQueryBuilder queryBuilder = new QueryStringQueryBuilder("foo:*");
|
||||||
Query query = queryBuilder.toQuery(context);
|
Query query = queryBuilder.toQuery(context);
|
||||||
Query expected = new WildcardQuery(new Term("foo", "*"));
|
Query expected = new WildcardQuery(new Term("foo", "*"));
|
||||||
assertThat(query, equalTo(expected));
|
assertThat(query, equalTo(expected));
|
||||||
|
} finally {
|
||||||
|
// restore mappings as they were before
|
||||||
context.getMapperService().merge("doc",
|
context.getMapperService().merge("doc",
|
||||||
new CompressedXContent(
|
new CompressedXContent(
|
||||||
PutMappingRequest.buildFromSimplifiedDef("doc",
|
PutMappingRequest.buildFromSimplifiedDef("doc",
|
||||||
|
@ -822,6 +829,7 @@ public class QueryStringQueryBuilderTests extends AbstractQueryTestCase<QueryStr
|
||||||
"_field_names", "enabled=true").string()),
|
"_field_names", "enabled=true").string()),
|
||||||
MapperService.MergeReason.MAPPING_UPDATE, true);
|
MapperService.MergeReason.MAPPING_UPDATE, true);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -166,7 +166,7 @@ public abstract class AbstractQueryTestCase<QB extends AbstractQueryBuilder<QB>>
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static String[] getCurrentTypes() {
|
protected static String[] getCurrentTypes() {
|
||||||
return currentTypes == null ? Strings.EMPTY_ARRAY : currentTypes;
|
return currentTypes;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Collection<Class<? extends Plugin>> getPlugins() {
|
protected Collection<Class<? extends Plugin>> getPlugins() {
|
||||||
|
@ -186,7 +186,14 @@ public abstract class AbstractQueryTestCase<QB extends AbstractQueryBuilder<QB>>
|
||||||
index = new Index(randomAlphaOfLengthBetween(1, 10), "_na_");
|
index = new Index(randomAlphaOfLengthBetween(1, 10), "_na_");
|
||||||
|
|
||||||
// Set a single type in the index
|
// Set a single type in the index
|
||||||
|
switch (random().nextInt(3)) {
|
||||||
|
case 0:
|
||||||
|
currentTypes = new String[0]; // no types
|
||||||
|
break;
|
||||||
|
default:
|
||||||
currentTypes = new String[] { "doc" };
|
currentTypes = new String[] { "doc" };
|
||||||
|
break;
|
||||||
|
}
|
||||||
randomTypes = getRandomTypes();
|
randomTypes = getRandomTypes();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue