diff options
Diffstat (limited to 'core/src/main/java/org/elasticsearch/index/mapper/internal/TypeFieldMapper.java')
-rw-r--r-- | core/src/main/java/org/elasticsearch/index/mapper/internal/TypeFieldMapper.java | 54 |
1 files changed, 49 insertions, 5 deletions
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/internal/TypeFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/internal/TypeFieldMapper.java index b9e3434fc2..e2b690caca 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/internal/TypeFieldMapper.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/internal/TypeFieldMapper.java @@ -22,15 +22,16 @@ package org.elasticsearch.index.mapper.internal; import org.apache.lucene.document.Field; import org.apache.lucene.document.SortedSetDocValuesField; import org.apache.lucene.index.IndexOptions; +import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.Term; +import org.apache.lucene.index.TermContext; import org.apache.lucene.search.ConstantScoreQuery; -import org.apache.lucene.search.PrefixQuery; +import org.apache.lucene.search.MatchAllDocsQuery; import org.apache.lucene.search.Query; import org.apache.lucene.search.TermQuery; import org.apache.lucene.util.BytesRef; import org.elasticsearch.Version; import org.elasticsearch.common.Nullable; -import org.elasticsearch.common.lucene.BytesRefs; import org.elasticsearch.common.lucene.Lucene; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.XContentBuilder; @@ -39,12 +40,12 @@ import org.elasticsearch.index.mapper.Mapper; import org.elasticsearch.index.mapper.MapperParsingException; import org.elasticsearch.index.mapper.MetadataFieldMapper; import org.elasticsearch.index.mapper.ParseContext; -import org.elasticsearch.index.mapper.Uid; import org.elasticsearch.index.query.QueryShardContext; import java.io.IOException; import java.util.List; import java.util.Map; +import java.util.Objects; /** * @@ -133,12 +134,55 @@ public class TypeFieldMapper extends MetadataFieldMapper { @Override public Query termQuery(Object value, @Nullable QueryShardContext context) { if (indexOptions() == IndexOptions.NONE) { - return new ConstantScoreQuery(new PrefixQuery(new Term(UidFieldMapper.NAME, Uid.typePrefixAsBytes(BytesRefs.toBytesRef(value))))); + throw new AssertionError(); } - return new ConstantScoreQuery(new TermQuery(createTerm(value))); + return new TypeQuery(indexedValueForSearch(value)); } } + public static class TypeQuery extends Query { + + private final BytesRef type; + + public TypeQuery(BytesRef type) { + this.type = Objects.requireNonNull(type); + } + + @Override + public Query rewrite(IndexReader reader) throws IOException { + Term term = new Term(CONTENT_TYPE, type); + TermContext context = TermContext.build(reader.getContext(), term); + if (context.docFreq() == reader.maxDoc()) { + // All docs have the same type. + // Using a match_all query will help Lucene perform some optimizations + // For instance, match_all queries as filter clauses are automatically removed + return new MatchAllDocsQuery(); + } else { + return new ConstantScoreQuery(new TermQuery(term, context)); + } + } + + @Override + public boolean equals(Object obj) { + if (super.equals(obj) == false) { + return false; + } + TypeQuery that = (TypeQuery) obj; + return type.equals(that.type); + } + + @Override + public int hashCode() { + return 31 * super.hashCode() + type.hashCode(); + } + + @Override + public String toString(String field) { + return "_type:" + type; + } + + } + private TypeFieldMapper(Settings indexSettings, MappedFieldType existing) { this(existing == null ? defaultFieldType(indexSettings) : existing.clone(), indexSettings); |