diff --git a/src/main/java/org/elasticsearch/index/cache/IndexCache.java b/src/main/java/org/elasticsearch/index/cache/IndexCache.java index beeeed8dc26..589c449b417 100644 --- a/src/main/java/org/elasticsearch/index/cache/IndexCache.java +++ b/src/main/java/org/elasticsearch/index/cache/IndexCache.java @@ -65,6 +65,13 @@ public class IndexCache extends AbstractIndexComponent implements CloseableCompo return filterCache; } + /** + * Return the {@link FixedBitSetFilterCache} for this index. + */ + public FixedBitSetFilterCache fixedBitSetFilterCache() { + return fixedBitSetFilterCache; + } + public QueryParserCache queryParserCache() { return this.queryParserCache; } diff --git a/src/main/java/org/elasticsearch/index/engine/Engine.java b/src/main/java/org/elasticsearch/index/engine/Engine.java index a41814dd191..dd9c6ab845f 100644 --- a/src/main/java/org/elasticsearch/index/engine/Engine.java +++ b/src/main/java/org/elasticsearch/index/engine/Engine.java @@ -34,6 +34,7 @@ import org.elasticsearch.common.lucene.uid.Versions; import org.elasticsearch.common.unit.ByteSizeValue; import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.index.VersionType; +import org.elasticsearch.index.cache.fixedbitset.FixedBitSetFilter; import org.elasticsearch.index.deletionpolicy.SnapshotIndexCommit; import org.elasticsearch.index.mapper.DocumentMapper; import org.elasticsearch.index.mapper.ParseContext.Document; @@ -650,13 +651,13 @@ public interface Engine extends IndexShardComponent, CloseableComponent { private final String[] filteringAliases; private final Filter aliasFilter; private final String[] types; - private final Filter parentFilter; + private final FixedBitSetFilter parentFilter; private final Operation.Origin origin; private final long startTime; private long endTime; - public DeleteByQuery(Query query, BytesReference source, @Nullable String[] filteringAliases, @Nullable Filter aliasFilter, Filter parentFilter, Operation.Origin origin, long startTime, String... types) { + public DeleteByQuery(Query query, BytesReference source, @Nullable String[] filteringAliases, @Nullable Filter aliasFilter, FixedBitSetFilter parentFilter, Operation.Origin origin, long startTime, String... types) { this.query = query; this.source = source; this.types = types; @@ -691,7 +692,7 @@ public interface Engine extends IndexShardComponent, CloseableComponent { return parentFilter != null; } - public Filter parentFilter() { + public FixedBitSetFilter parentFilter() { return parentFilter; } diff --git a/src/main/java/org/elasticsearch/index/search/nested/IncludeNestedDocsQuery.java b/src/main/java/org/elasticsearch/index/search/nested/IncludeNestedDocsQuery.java index cf74def8cb7..32d449c3f79 100644 --- a/src/main/java/org/elasticsearch/index/search/nested/IncludeNestedDocsQuery.java +++ b/src/main/java/org/elasticsearch/index/search/nested/IncludeNestedDocsQuery.java @@ -25,7 +25,7 @@ import org.apache.lucene.index.Term; import org.apache.lucene.search.*; import org.apache.lucene.util.Bits; import org.apache.lucene.util.FixedBitSet; -import org.elasticsearch.common.lucene.docset.DocIdSets; +import org.elasticsearch.index.cache.fixedbitset.FixedBitSetFilter; import java.io.IOException; import java.util.Collection; @@ -39,7 +39,7 @@ import java.util.Set; */ public class IncludeNestedDocsQuery extends Query { - private final Filter parentFilter; + private final FixedBitSetFilter parentFilter; private final Query parentQuery; // If we are rewritten, this is the original childQuery we @@ -50,7 +50,7 @@ public class IncludeNestedDocsQuery extends Query { private final Query origParentQuery; - public IncludeNestedDocsQuery(Query parentQuery, Filter parentFilter) { + public IncludeNestedDocsQuery(Query parentQuery, FixedBitSetFilter parentFilter) { this.origParentQuery = parentQuery; this.parentQuery = parentQuery; this.parentFilter = parentFilter; @@ -80,9 +80,9 @@ public class IncludeNestedDocsQuery extends Query { private final Query parentQuery; private final Weight parentWeight; - private final Filter parentsFilter; + private final FixedBitSetFilter parentsFilter; - IncludeNestedDocsWeight(Query parentQuery, Weight parentWeight, Filter parentsFilter) { + IncludeNestedDocsWeight(Query parentQuery, Weight parentWeight, FixedBitSetFilter parentsFilter) { this.parentQuery = parentQuery; this.parentWeight = parentWeight; this.parentsFilter = parentsFilter; @@ -112,20 +112,11 @@ public class IncludeNestedDocsQuery extends Query { return null; } - DocIdSet parents = parentsFilter.getDocIdSet(context, acceptDocs); + FixedBitSet parents = parentsFilter.getDocIdSet(context, acceptDocs); if (parents == null) { // No matches return null; } - if (!(parents instanceof FixedBitSet)) { - if (parents.isCacheable()) { - // the filter is cached, yet not with the right type - throw new IllegalStateException("parentFilter must return FixedBitSet; got " + parents); - } else { - // may happen if the filter cache type is none - parents = DocIdSets.toFixedBitSet(parents.iterator(), context.reader().maxDoc()); - } - } int firstParentDoc = parentScorer.nextDoc(); if (firstParentDoc == DocIdSetIterator.NO_MORE_DOCS) { diff --git a/src/main/java/org/elasticsearch/index/shard/service/InternalIndexShard.java b/src/main/java/org/elasticsearch/index/shard/service/InternalIndexShard.java index 32660589d77..48f019ee5fb 100644 --- a/src/main/java/org/elasticsearch/index/shard/service/InternalIndexShard.java +++ b/src/main/java/org/elasticsearch/index/shard/service/InternalIndexShard.java @@ -48,6 +48,8 @@ import org.elasticsearch.index.aliases.IndexAliasesService; import org.elasticsearch.index.cache.IndexCache; import org.elasticsearch.index.cache.filter.FilterCacheStats; import org.elasticsearch.index.cache.filter.ShardFilterCache; +import org.elasticsearch.index.cache.fixedbitset.FixedBitSetFilter; +import org.elasticsearch.index.cache.fixedbitset.ShardFixedBitSetFilterCache; import org.elasticsearch.index.cache.id.IdCacheStats; import org.elasticsearch.index.cache.query.ShardQueryCache; import org.elasticsearch.index.codec.CodecService; @@ -68,7 +70,6 @@ import org.elasticsearch.index.merge.scheduler.MergeSchedulerProvider; import org.elasticsearch.index.percolator.PercolatorQueriesRegistry; import org.elasticsearch.index.percolator.stats.ShardPercolateService; import org.elasticsearch.index.query.IndexQueryParserService; -import org.elasticsearch.index.cache.fixedbitset.ShardFixedBitSetFilterCache; import org.elasticsearch.index.refresh.RefreshStats; import org.elasticsearch.index.search.nested.NonNestedDocsFilter; import org.elasticsearch.index.search.stats.SearchStats; @@ -465,7 +466,7 @@ public class InternalIndexShard extends AbstractIndexShardComponent implements I query = filterQueryIfNeeded(query, types); Filter aliasFilter = indexAliasesService.aliasFilter(filteringAliases); - Filter parentFilter = mapperService.hasNested() ? indexCache.filter().cache(NonNestedDocsFilter.INSTANCE) : null; + FixedBitSetFilter parentFilter = mapperService.hasNested() ? indexCache.fixedBitSetFilterCache().getFixedBitSetFilter(NonNestedDocsFilter.INSTANCE) : null; return new Engine.DeleteByQuery(query, source, filteringAliases, aliasFilter, parentFilter, origin, startTime, types); }