Skip to content
30 changes: 30 additions & 0 deletions server/src/main/java/org/elasticsearch/index/engine/Engine.java
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@
import org.elasticsearch.core.TimeValue;
import org.elasticsearch.index.IndexVersion;
import org.elasticsearch.index.VersionType;
import org.elasticsearch.index.codec.FieldInfosWithUsages;
import org.elasticsearch.index.mapper.DocumentParser;
import org.elasticsearch.index.mapper.FieldNamesFieldMapper;
import org.elasticsearch.index.mapper.LuceneDocument;
Expand All @@ -76,6 +77,7 @@
import org.elasticsearch.index.shard.DenseVectorStats;
import org.elasticsearch.index.shard.DocsStats;
import org.elasticsearch.index.shard.IndexShard;
import org.elasticsearch.index.shard.ShardFieldStats;
import org.elasticsearch.index.shard.ShardId;
import org.elasticsearch.index.shard.ShardLongFieldRange;
import org.elasticsearch.index.shard.SparseVectorStats;
Expand Down Expand Up @@ -243,6 +245,34 @@ protected final DocsStats docsStats(IndexReader indexReader) {
return new DocsStats(numDocs, numDeletedDocs, sizeInBytes);
}

/**
* @throws AlreadyClosedException if the shard is closed
*/
public ShardFieldStats shardFieldStats() {
try (var searcher = acquireSearcher("shard_field_stats", Engine.SearcherScope.INTERNAL)) {
return shardFieldStats(searcher.getLeafContexts());
}
}

protected ShardFieldStats shardFieldStats(List<LeafReaderContext> leaves) {
int numSegments = 0;
int totalFields = 0;
long usages = 0;
for (LeafReaderContext leaf : leaves) {
numSegments++;
var fieldInfos = leaf.reader().getFieldInfos();
totalFields += fieldInfos.size();
if (fieldInfos instanceof FieldInfosWithUsages ft) {
if (usages != -1) {
usages += ft.getTotalUsages();
}
} else {
usages = -1;
}
}
return new ShardFieldStats(numSegments, totalFields, usages);
}

/**
* Returns the {@link DenseVectorStats} for this engine
*/
Expand Down
25 changes: 3 additions & 22 deletions server/src/main/java/org/elasticsearch/index/shard/IndexShard.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
import org.apache.lucene.index.FilterDirectoryReader;
import org.apache.lucene.index.IndexCommit;
import org.apache.lucene.index.LeafReader;
import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.index.SegmentInfos;
import org.apache.lucene.search.QueryCachingPolicy;
import org.apache.lucene.search.ReferenceManager;
Expand Down Expand Up @@ -84,7 +83,6 @@
import org.elasticsearch.index.cache.query.TrivialQueryCachingPolicy;
import org.elasticsearch.index.cache.request.ShardRequestCache;
import org.elasticsearch.index.codec.CodecService;
import org.elasticsearch.index.codec.FieldInfosWithUsages;
import org.elasticsearch.index.engine.CommitStats;
import org.elasticsearch.index.engine.Engine;
import org.elasticsearch.index.engine.Engine.GetResult;
Expand Down Expand Up @@ -4160,26 +4158,9 @@ public void beforeRefresh() {
@Override
public void afterRefresh(boolean didRefresh) {
if (shardFieldStats == null || didRefresh) {
try (var searcher = getEngine().acquireSearcher("shard_field_stats", Engine.SearcherScope.INTERNAL)) {
int numSegments = 0;
int totalFields = 0;
long usages = 0;
for (LeafReaderContext leaf : searcher.getLeafContexts()) {
numSegments++;
var fieldInfos = leaf.reader().getFieldInfos();
totalFields += fieldInfos.size();
if (fieldInfos instanceof FieldInfosWithUsages ft) {
if (usages != -1) {
usages += ft.getTotalUsages();
}
} else {
usages = -1;
}
}
shardFieldStats = new ShardFieldStats(numSegments, totalFields, usages);
} catch (AlreadyClosedException ignored) {

}
try {
shardFieldStats = getEngine().shardFieldStats();
} catch (AlreadyClosedException ignored) {}
}
}
}
Expand Down