Skip to content

Commit 28b4d95

Browse files
authored
Uses norms for exists query if enabled (#27237)
* Uses norms for exists query if enabled This change means that for indexes created from 6.1.0, if normas are enabled we will not write the field name to the `_field_names` field and for an exists query we will instead use the NormsFieldExistsQuery which was added in Lucene 7.1.0. If norms are not enabled or if the index was created before 6.1.0 `_field_names` will be used as before. * Fixes tests
1 parent fbf8c3e commit 28b4d95

File tree

4 files changed

+18
-6
lines changed

4 files changed

+18
-6
lines changed

core/src/main/java/org/elasticsearch/index/mapper/TextFieldMapper.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
import org.apache.lucene.index.IndexOptions;
2424
import org.apache.lucene.index.IndexableField;
2525
import org.apache.lucene.index.Term;
26-
import org.apache.lucene.search.DocValuesFieldExistsQuery;
26+
import org.apache.lucene.search.NormsFieldExistsQuery;
2727
import org.apache.lucene.search.Query;
2828
import org.apache.lucene.search.TermQuery;
2929
import org.elasticsearch.common.settings.Settings;
@@ -280,10 +280,10 @@ public String typeName() {
280280

281281
@Override
282282
public Query existsQuery(QueryShardContext context) {
283-
if (hasDocValues()) {
284-
return new DocValuesFieldExistsQuery(name());
285-
} else {
283+
if (omitNorms()) {
286284
return new TermQuery(new Term(FieldNamesFieldMapper.NAME, name()));
285+
} else {
286+
return new NormsFieldExistsQuery(name());
287287
}
288288
}
289289

@@ -345,7 +345,9 @@ protected void parseCreateField(ParseContext context, List<IndexableField> field
345345
if (fieldType().indexOptions() != IndexOptions.NONE || fieldType().stored()) {
346346
Field field = new Field(fieldType().name(), value, fieldType());
347347
fields.add(field);
348-
createFieldNamesField(context, fields);
348+
if (fieldType().omitNorms()) {
349+
createFieldNamesField(context, fields);
350+
}
349351
}
350352
}
351353

core/src/test/java/org/elasticsearch/index/mapper/FieldNamesFieldMapperTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.elasticsearch.test.ESSingleNodeTestCase;
2727

2828
import java.util.Arrays;
29+
import java.util.Collections;
2930
import java.util.Set;
3031
import java.util.SortedSet;
3132
import java.util.TreeSet;
@@ -87,7 +88,7 @@ public void testInjectIntoDocDuringParsing() throws Exception {
8788
.bytes(),
8889
XContentType.JSON));
8990

90-
assertFieldNames(set("a"), doc);
91+
assertFieldNames(Collections.emptySet(), doc);
9192
}
9293

9394
public void testExplicitEnabled() throws Exception {

core/src/test/java/org/elasticsearch/index/query/ExistsQueryBuilderTests.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.apache.lucene.search.ConstantScoreQuery;
2525
import org.apache.lucene.search.DocValuesFieldExistsQuery;
2626
import org.apache.lucene.search.MatchNoDocsQuery;
27+
import org.apache.lucene.search.NormsFieldExistsQuery;
2728
import org.apache.lucene.search.Query;
2829
import org.apache.lucene.search.TermQuery;
2930
import org.elasticsearch.Version;
@@ -113,6 +114,10 @@ protected void doAssertLuceneQuery(ExistsQueryBuilder queryBuilder, Query query,
113114
assertThat(constantScoreQuery.getQuery(), instanceOf(DocValuesFieldExistsQuery.class));
114115
DocValuesFieldExistsQuery dvExistsQuery = (DocValuesFieldExistsQuery) constantScoreQuery.getQuery();
115116
assertEquals(field, dvExistsQuery.getField());
117+
} else if (context.getQueryShardContext().getMapperService().fullName(field).omitNorms() == false) {
118+
assertThat(constantScoreQuery.getQuery(), instanceOf(NormsFieldExistsQuery.class));
119+
NormsFieldExistsQuery normsExistsQuery = (NormsFieldExistsQuery) constantScoreQuery.getQuery();
120+
assertEquals(field, normsExistsQuery.getField());
116121
} else {
117122
assertThat(constantScoreQuery.getQuery(), instanceOf(TermQuery.class));
118123
TermQuery termQuery = (TermQuery) constantScoreQuery.getQuery();

core/src/test/java/org/elasticsearch/index/query/RangeQueryBuilderTests.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.apache.lucene.search.DocValuesFieldExistsQuery;
2727
import org.apache.lucene.search.IndexOrDocValuesQuery;
2828
import org.apache.lucene.search.MatchNoDocsQuery;
29+
import org.apache.lucene.search.NormsFieldExistsQuery;
2930
import org.apache.lucene.search.PointRangeQuery;
3031
import org.apache.lucene.search.Query;
3132
import org.apache.lucene.search.TermQuery;
@@ -129,6 +130,9 @@ protected void doAssertLuceneQuery(RangeQueryBuilder queryBuilder, Query query,
129130
if (context.mapperService().getIndexSettings().getIndexVersionCreated().onOrAfter(Version.V_6_1_0)
130131
&& context.mapperService().fullName(queryBuilder.fieldName()).hasDocValues()) {
131132
expectedQuery = new ConstantScoreQuery(new DocValuesFieldExistsQuery(queryBuilder.fieldName()));
133+
} else if (context.mapperService().getIndexSettings().getIndexVersionCreated().onOrAfter(Version.V_6_1_0)
134+
&& context.mapperService().fullName(queryBuilder.fieldName()).omitNorms() == false) {
135+
expectedQuery = new ConstantScoreQuery(new NormsFieldExistsQuery(queryBuilder.fieldName()));
132136
} else {
133137
expectedQuery = new ConstantScoreQuery(new TermQuery(new Term(FieldNamesFieldMapper.NAME, queryBuilder.fieldName())));
134138
}

0 commit comments

Comments
 (0)