mirror of
https://github.com/honeymoose/OpenSearch.git
synced 2025-03-09 14:34:43 +00:00
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
This commit is contained in:
parent
fbf8c3ee83
commit
28b4d95cf5
@ -23,7 +23,7 @@ import org.apache.lucene.document.Field;
|
|||||||
import org.apache.lucene.index.IndexOptions;
|
import org.apache.lucene.index.IndexOptions;
|
||||||
import org.apache.lucene.index.IndexableField;
|
import org.apache.lucene.index.IndexableField;
|
||||||
import org.apache.lucene.index.Term;
|
import org.apache.lucene.index.Term;
|
||||||
import org.apache.lucene.search.DocValuesFieldExistsQuery;
|
import org.apache.lucene.search.NormsFieldExistsQuery;
|
||||||
import org.apache.lucene.search.Query;
|
import org.apache.lucene.search.Query;
|
||||||
import org.apache.lucene.search.TermQuery;
|
import org.apache.lucene.search.TermQuery;
|
||||||
import org.elasticsearch.common.settings.Settings;
|
import org.elasticsearch.common.settings.Settings;
|
||||||
@ -280,10 +280,10 @@ public class TextFieldMapper extends FieldMapper {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Query existsQuery(QueryShardContext context) {
|
public Query existsQuery(QueryShardContext context) {
|
||||||
if (hasDocValues()) {
|
if (omitNorms()) {
|
||||||
return new DocValuesFieldExistsQuery(name());
|
|
||||||
} else {
|
|
||||||
return new TermQuery(new Term(FieldNamesFieldMapper.NAME, name()));
|
return new TermQuery(new Term(FieldNamesFieldMapper.NAME, name()));
|
||||||
|
} else {
|
||||||
|
return new NormsFieldExistsQuery(name());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -345,7 +345,9 @@ public class TextFieldMapper extends FieldMapper {
|
|||||||
if (fieldType().indexOptions() != IndexOptions.NONE || fieldType().stored()) {
|
if (fieldType().indexOptions() != IndexOptions.NONE || fieldType().stored()) {
|
||||||
Field field = new Field(fieldType().name(), value, fieldType());
|
Field field = new Field(fieldType().name(), value, fieldType());
|
||||||
fields.add(field);
|
fields.add(field);
|
||||||
createFieldNamesField(context, fields);
|
if (fieldType().omitNorms()) {
|
||||||
|
createFieldNamesField(context, fields);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,6 +26,7 @@ import org.elasticsearch.common.xcontent.XContentType;
|
|||||||
import org.elasticsearch.test.ESSingleNodeTestCase;
|
import org.elasticsearch.test.ESSingleNodeTestCase;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.SortedSet;
|
import java.util.SortedSet;
|
||||||
import java.util.TreeSet;
|
import java.util.TreeSet;
|
||||||
@ -87,7 +88,7 @@ public class FieldNamesFieldMapperTests extends ESSingleNodeTestCase {
|
|||||||
.bytes(),
|
.bytes(),
|
||||||
XContentType.JSON));
|
XContentType.JSON));
|
||||||
|
|
||||||
assertFieldNames(set("a"), doc);
|
assertFieldNames(Collections.emptySet(), doc);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testExplicitEnabled() throws Exception {
|
public void testExplicitEnabled() throws Exception {
|
||||||
|
@ -24,6 +24,7 @@ import org.apache.lucene.search.BooleanQuery;
|
|||||||
import org.apache.lucene.search.ConstantScoreQuery;
|
import org.apache.lucene.search.ConstantScoreQuery;
|
||||||
import org.apache.lucene.search.DocValuesFieldExistsQuery;
|
import org.apache.lucene.search.DocValuesFieldExistsQuery;
|
||||||
import org.apache.lucene.search.MatchNoDocsQuery;
|
import org.apache.lucene.search.MatchNoDocsQuery;
|
||||||
|
import org.apache.lucene.search.NormsFieldExistsQuery;
|
||||||
import org.apache.lucene.search.Query;
|
import org.apache.lucene.search.Query;
|
||||||
import org.apache.lucene.search.TermQuery;
|
import org.apache.lucene.search.TermQuery;
|
||||||
import org.elasticsearch.Version;
|
import org.elasticsearch.Version;
|
||||||
@ -113,6 +114,10 @@ public class ExistsQueryBuilderTests extends AbstractQueryTestCase<ExistsQueryBu
|
|||||||
assertThat(constantScoreQuery.getQuery(), instanceOf(DocValuesFieldExistsQuery.class));
|
assertThat(constantScoreQuery.getQuery(), instanceOf(DocValuesFieldExistsQuery.class));
|
||||||
DocValuesFieldExistsQuery dvExistsQuery = (DocValuesFieldExistsQuery) constantScoreQuery.getQuery();
|
DocValuesFieldExistsQuery dvExistsQuery = (DocValuesFieldExistsQuery) constantScoreQuery.getQuery();
|
||||||
assertEquals(field, dvExistsQuery.getField());
|
assertEquals(field, dvExistsQuery.getField());
|
||||||
|
} else if (context.getQueryShardContext().getMapperService().fullName(field).omitNorms() == false) {
|
||||||
|
assertThat(constantScoreQuery.getQuery(), instanceOf(NormsFieldExistsQuery.class));
|
||||||
|
NormsFieldExistsQuery normsExistsQuery = (NormsFieldExistsQuery) constantScoreQuery.getQuery();
|
||||||
|
assertEquals(field, normsExistsQuery.getField());
|
||||||
} else {
|
} else {
|
||||||
assertThat(constantScoreQuery.getQuery(), instanceOf(TermQuery.class));
|
assertThat(constantScoreQuery.getQuery(), instanceOf(TermQuery.class));
|
||||||
TermQuery termQuery = (TermQuery) constantScoreQuery.getQuery();
|
TermQuery termQuery = (TermQuery) constantScoreQuery.getQuery();
|
||||||
|
@ -26,6 +26,7 @@ import org.apache.lucene.search.ConstantScoreQuery;
|
|||||||
import org.apache.lucene.search.DocValuesFieldExistsQuery;
|
import org.apache.lucene.search.DocValuesFieldExistsQuery;
|
||||||
import org.apache.lucene.search.IndexOrDocValuesQuery;
|
import org.apache.lucene.search.IndexOrDocValuesQuery;
|
||||||
import org.apache.lucene.search.MatchNoDocsQuery;
|
import org.apache.lucene.search.MatchNoDocsQuery;
|
||||||
|
import org.apache.lucene.search.NormsFieldExistsQuery;
|
||||||
import org.apache.lucene.search.PointRangeQuery;
|
import org.apache.lucene.search.PointRangeQuery;
|
||||||
import org.apache.lucene.search.Query;
|
import org.apache.lucene.search.Query;
|
||||||
import org.apache.lucene.search.TermQuery;
|
import org.apache.lucene.search.TermQuery;
|
||||||
@ -129,6 +130,9 @@ public class RangeQueryBuilderTests extends AbstractQueryTestCase<RangeQueryBuil
|
|||||||
if (context.mapperService().getIndexSettings().getIndexVersionCreated().onOrAfter(Version.V_6_1_0)
|
if (context.mapperService().getIndexSettings().getIndexVersionCreated().onOrAfter(Version.V_6_1_0)
|
||||||
&& context.mapperService().fullName(queryBuilder.fieldName()).hasDocValues()) {
|
&& context.mapperService().fullName(queryBuilder.fieldName()).hasDocValues()) {
|
||||||
expectedQuery = new ConstantScoreQuery(new DocValuesFieldExistsQuery(queryBuilder.fieldName()));
|
expectedQuery = new ConstantScoreQuery(new DocValuesFieldExistsQuery(queryBuilder.fieldName()));
|
||||||
|
} else if (context.mapperService().getIndexSettings().getIndexVersionCreated().onOrAfter(Version.V_6_1_0)
|
||||||
|
&& context.mapperService().fullName(queryBuilder.fieldName()).omitNorms() == false) {
|
||||||
|
expectedQuery = new ConstantScoreQuery(new NormsFieldExistsQuery(queryBuilder.fieldName()));
|
||||||
} else {
|
} else {
|
||||||
expectedQuery = new ConstantScoreQuery(new TermQuery(new Term(FieldNamesFieldMapper.NAME, queryBuilder.fieldName())));
|
expectedQuery = new ConstantScoreQuery(new TermQuery(new Term(FieldNamesFieldMapper.NAME, queryBuilder.fieldName())));
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user