diff options
author | Isabel Drost-Fromm <isabel.drostfromm@elasticsearch.com> | 2016-03-29 11:04:02 +0200 |
---|---|---|
committer | Isabel Drost-Fromm <isabel.drostfromm@elasticsearch.com> | 2016-03-29 11:04:02 +0200 |
commit | 407e2cdcf93475e2b326228eaf169fa2572d7d8b (patch) | |
tree | 3810be0a7ec51b990fef5b2f7a9cb1ecf3557b10 /core/src/main/java/org/elasticsearch/index/mapper/internal/TypeFieldMapper.java | |
parent | 5dd481bfe3ef81a59217f7809ca51dc4f31b893e (diff) | |
parent | c7bdfb1126d47442f7e12f996eecbb7fab315c2d (diff) |
Merge branch 'master' into deprecation/sort-option-reverse-removal
Conflicts:
core/src/main/java/org/elasticsearch/search/sort/ScoreSortBuilder.java
core/src/test/java/org/elasticsearch/search/sort/FieldSortBuilderTests.java
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); |