Skip to content

Commit dcdd050

Browse files
authored
Merge branch 'main' into dependabot/gradle/libs/grok/org.jruby.jcodings-jcodings-1.0.61
Signed-off-by: Craig Perkins <cwperx@amazon.com>
2 parents f6490a7 + 92088be commit dcdd050

19 files changed

Lines changed: 669 additions & 160 deletions

File tree

CHANGELOG-3.0.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5050
- Fix 'org.apache.hc.core5.http.ParseException: Invalid protocol version' under JDK 16+ ([#4827](https://github.com/opensearch-project/OpenSearch/pull/4827))
5151
- Fix compression support for h2c protocol ([#4944](https://github.com/opensearch-project/OpenSearch/pull/4944))
5252
- Don't over-allocate in HeapBufferedAsyncEntityConsumer in order to consume the response ([#9993](https://github.com/opensearch-project/OpenSearch/pull/9993))
53+
- Fix swapped field formats in nodes API where `total_indexing_buffer_in_bytes` and `total_indexing_buffer` values were reversed ([#17070](https://github.com/opensearch-project/OpenSearch/pull/17070))
54+
5355

5456
### Security
5557

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
3232
- Support object fields in star-tree index([#16728](https://github.com/opensearch-project/OpenSearch/pull/16728/))
3333
- Support searching from doc_value using termQueryCaseInsensitive/termQuery in flat_object/keyword field([#16974](https://github.com/opensearch-project/OpenSearch/pull/16974/))
3434
- Added a new `time` field to replace the deprecated `getTime` field in `GetStats`. ([#17009](https://github.com/opensearch-project/OpenSearch/pull/17009))
35+
- Improve performance of the bitmap filtering([#16936](https://github.com/opensearch-project/OpenSearch/pull/16936/))
3536

3637
### Dependencies
3738
- Bump `com.google.cloud:google-cloud-core-http` from 2.23.0 to 2.47.0 ([#16504](https://github.com/opensearch-project/OpenSearch/pull/16504))
@@ -66,7 +67,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6667
- Bump `opentelemetry-semconv` from 1.27.0-alpha to 1.29.0-alpha ([#16700](https://github.com/opensearch-project/OpenSearch/pull/16700))
6768
- Bump `com.google.re2j:re2j` from 1.7 to 1.8 ([#17012](https://github.com/opensearch-project/OpenSearch/pull/17012))
6869
- Bump `com.squareup.okio:okio` from 3.9.1 to 3.10.2 ([#17060](https://github.com/opensearch-project/OpenSearch/pull/17060))
69-
- Bump `com.diffplug.spotless` from 6.25.0 to 7.0.2 ([#17058](https://github.com/opensearch-project/OpenSearch/pull/17058))
7070
- Bump `org.jruby.jcodings:jcodings` from 1.0.58 to 1.0.61 ([#17061](https://github.com/opensearch-project/OpenSearch/pull/17061))
7171

7272
### Changed
@@ -76,6 +76,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
7676
- Allow extended plugins to be optional ([#16909](https://github.com/opensearch-project/OpenSearch/pull/16909))
7777
- Use the correct type to widen the sort fields when merging top docs ([#16881](https://github.com/opensearch-project/OpenSearch/pull/16881))
7878
- Limit reader writer separation to remote store enabled clusters [#16760](https://github.com/opensearch-project/OpenSearch/pull/16760)
79+
- Optimize innerhits query performance [#16937](https://github.com/opensearch-project/OpenSearch/pull/16937)
7980

8081
### Deprecated
8182
- Performing update operation with default pipeline or final pipeline is deprecated ([#16712](https://github.com/opensearch-project/OpenSearch/pull/16712))

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ plugins {
5454
id 'lifecycle-base'
5555
id 'opensearch.docker-support'
5656
id 'opensearch.global-build-info'
57-
id "com.diffplug.spotless" version "7.0.2" apply false
57+
id "com.diffplug.spotless" version "6.25.0" apply false
5858
id "test-report-aggregation"
5959
id 'jacoco-report-aggregation'
6060
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
---
2+
"Test total indexing buffer fields should have correct formats":
3+
- skip:
4+
version: " - 2.99.99"
5+
reason: "this change is added in 3.0.0"
6+
features: [arbitrary_key]
7+
8+
- do:
9+
nodes.info: {}
10+
- set:
11+
nodes._arbitrary_key_: node_id
12+
13+
- do:
14+
nodes.info:
15+
human: true
16+
filter_path: "nodes.*.total_indexing_buffer*"
17+
18+
- gte: { nodes.$node_id.total_indexing_buffer_in_bytes: 0 }
19+
20+
- match:
21+
nodes.$node_id.total_indexing_buffer: /^\d+(\.\d+)?(b|kb|mb|gb|tb|pb)$/

server/src/main/java/org/opensearch/action/admin/cluster/node/info/NodesInfoResponse.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
9898
builder.field("build_type", nodeInfo.getBuild().type().displayName());
9999
builder.field("build_hash", nodeInfo.getBuild().hash());
100100
if (nodeInfo.getTotalIndexingBuffer() != null) {
101-
builder.humanReadableField("total_indexing_buffer", "total_indexing_buffer_in_bytes", nodeInfo.getTotalIndexingBuffer());
101+
builder.humanReadableField("total_indexing_buffer_in_bytes", "total_indexing_buffer", nodeInfo.getTotalIndexingBuffer());
102102
}
103103

104104
builder.startArray("roles");

server/src/main/java/org/opensearch/index/mapper/DocumentMapper.java

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,7 @@
3535
import org.apache.lucene.document.StoredField;
3636
import org.apache.lucene.index.LeafReaderContext;
3737
import org.apache.lucene.search.Query;
38-
import org.apache.lucene.search.ScoreMode;
39-
import org.apache.lucene.search.Scorer;
40-
import org.apache.lucene.search.Weight;
38+
import org.apache.lucene.util.BitSet;
4139
import org.apache.lucene.util.BytesRef;
4240
import org.opensearch.OpenSearchGenerationException;
4341
import org.opensearch.common.annotation.PublicApi;
@@ -53,6 +51,7 @@
5351
import org.opensearch.index.analysis.IndexAnalyzers;
5452
import org.opensearch.index.mapper.MapperService.MergeReason;
5553
import org.opensearch.index.mapper.MetadataFieldMapper.TypeParser;
54+
import org.opensearch.index.query.NestedQueryBuilder;
5655
import org.opensearch.search.internal.SearchContext;
5756

5857
import java.io.IOException;
@@ -270,25 +269,15 @@ public ParsedDocument createNoopTombstoneDoc(String index, String reason) throws
270269
* Returns the best nested {@link ObjectMapper} instances that is in the scope of the specified nested docId.
271270
*/
272271
public ObjectMapper findNestedObjectMapper(int nestedDocId, SearchContext sc, LeafReaderContext context) throws IOException {
272+
if (sc instanceof NestedQueryBuilder.NestedInnerHitSubContext) {
273+
ObjectMapper objectMapper = ((NestedQueryBuilder.NestedInnerHitSubContext) sc).getChildObjectMapper();
274+
assert objectMappers().containsKey(objectMapper.fullPath());
275+
assert containSubDocIdWithObjectMapper(nestedDocId, objectMapper, sc, context);
276+
return objectMapper;
277+
}
273278
ObjectMapper nestedObjectMapper = null;
274279
for (ObjectMapper objectMapper : objectMappers().values()) {
275-
if (!objectMapper.nested().isNested()) {
276-
continue;
277-
}
278-
279-
Query filter = objectMapper.nestedTypeFilter();
280-
if (filter == null) {
281-
continue;
282-
}
283-
// We can pass down 'null' as acceptedDocs, because nestedDocId is a doc to be fetched and
284-
// therefore is guaranteed to be a live doc.
285-
final Weight nestedWeight = filter.createWeight(sc.searcher(), ScoreMode.COMPLETE_NO_SCORES, 1f);
286-
Scorer scorer = nestedWeight.scorer(context);
287-
if (scorer == null) {
288-
continue;
289-
}
290-
291-
if (scorer.iterator().advance(nestedDocId) == nestedDocId) {
280+
if (containSubDocIdWithObjectMapper(nestedDocId, objectMapper, sc, context)) {
292281
if (nestedObjectMapper == null) {
293282
nestedObjectMapper = objectMapper;
294283
} else {
@@ -301,6 +290,25 @@ public ObjectMapper findNestedObjectMapper(int nestedDocId, SearchContext sc, Le
301290
return nestedObjectMapper;
302291
}
303292

293+
private boolean containSubDocIdWithObjectMapper(int nestedDocId, ObjectMapper objectMapper, SearchContext sc, LeafReaderContext context)
294+
throws IOException {
295+
if (!objectMapper.nested().isNested()) {
296+
return false;
297+
}
298+
Query filter = objectMapper.nestedTypeFilter();
299+
if (filter == null) {
300+
return false;
301+
}
302+
// We can pass down 'null' as acceptedDocs, because nestedDocId is a doc to be fetched and
303+
// therefore is guaranteed to be a live doc.
304+
BitSet nestedDocIds = sc.bitsetFilterCache().getBitSetProducer(filter).getBitSet(context);
305+
if (nestedDocIds != null && nestedDocIds.get(nestedDocId)) {
306+
return true;
307+
} else {
308+
return false;
309+
}
310+
}
311+
304312
public DocumentMapper merge(Mapping mapping, MergeReason reason) {
305313
Mapping merged = this.mapping.merge(mapping, reason);
306314
return new DocumentMapper(mapperService, merged);

server/src/main/java/org/opensearch/index/mapper/NumberFieldMapper.java

Lines changed: 3 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,8 @@
4646
import org.apache.lucene.sandbox.document.HalfFloatPoint;
4747
import org.apache.lucene.search.BoostQuery;
4848
import org.apache.lucene.search.IndexOrDocValuesQuery;
49-
import org.apache.lucene.search.IndexSearcher;
5049
import org.apache.lucene.search.IndexSortSortedNumericDocValuesRangeQuery;
5150
import org.apache.lucene.search.MatchNoDocsQuery;
52-
import org.apache.lucene.search.PointInSetQuery;
5351
import org.apache.lucene.search.Query;
5452
import org.apache.lucene.util.BytesRef;
5553
import org.apache.lucene.util.NumericUtils;
@@ -73,6 +71,7 @@
7371
import org.opensearch.search.DocValueFormat;
7472
import org.opensearch.search.lookup.SearchLookup;
7573
import org.opensearch.search.query.BitmapDocValuesQuery;
74+
import org.opensearch.search.query.BitmapIndexQuery;
7675

7776
import java.io.IOException;
7877
import java.math.BigInteger;
@@ -81,7 +80,6 @@
8180
import java.util.ArrayList;
8281
import java.util.Arrays;
8382
import java.util.Collections;
84-
import java.util.Iterator;
8583
import java.util.List;
8684
import java.util.Map;
8785
import java.util.Objects;
@@ -888,10 +886,10 @@ public Query bitmapQuery(String field, BytesArray bitmapArray, boolean isSearcha
888886
}
889887

890888
if (isSearchable && hasDocValues) {
891-
return new IndexOrDocValuesQuery(bitmapIndexQuery(field, bitmap), new BitmapDocValuesQuery(field, bitmap));
889+
return new IndexOrDocValuesQuery(new BitmapIndexQuery(field, bitmap), new BitmapDocValuesQuery(field, bitmap));
892890
}
893891
if (isSearchable) {
894-
return bitmapIndexQuery(field, bitmap);
892+
return new BitmapIndexQuery(field, bitmap);
895893
}
896894
return new BitmapDocValuesQuery(field, bitmap);
897895
}
@@ -1507,40 +1505,6 @@ public static Query unsignedLongRangeQuery(
15071505
}
15081506
return builder.apply(l, u);
15091507
}
1510-
1511-
static PointInSetQuery bitmapIndexQuery(String field, RoaringBitmap bitmap) {
1512-
final BytesRef encoded = new BytesRef(new byte[Integer.BYTES]);
1513-
return new PointInSetQuery(field, 1, Integer.BYTES, new PointInSetQuery.Stream() {
1514-
1515-
final Iterator<Integer> iterator = bitmap.iterator();
1516-
1517-
@Override
1518-
public BytesRef next() {
1519-
int value;
1520-
if (iterator.hasNext()) {
1521-
value = iterator.next();
1522-
} else {
1523-
return null;
1524-
}
1525-
IntPoint.encodeDimension(value, encoded.bytes, 0);
1526-
return encoded;
1527-
}
1528-
}) {
1529-
@Override
1530-
public Query rewrite(IndexSearcher indexSearcher) throws IOException {
1531-
if (bitmap.isEmpty()) {
1532-
return new MatchNoDocsQuery();
1533-
}
1534-
return super.rewrite(indexSearcher);
1535-
}
1536-
1537-
@Override
1538-
protected String toString(byte[] value) {
1539-
assert value.length == Integer.BYTES;
1540-
return Integer.toString(IntPoint.decodeDimension(value, 0));
1541-
}
1542-
};
1543-
}
15441508
}
15451509

15461510
/**

server/src/main/java/org/opensearch/index/query/NestedQueryBuilder.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,7 @@ protected void doBuild(SearchContext parentSearchContext, InnerHitsContext inner
438438
*
439439
* @opensearch.internal
440440
*/
441-
static final class NestedInnerHitSubContext extends InnerHitsContext.InnerHitSubContext {
441+
public static final class NestedInnerHitSubContext extends InnerHitsContext.InnerHitSubContext {
442442

443443
private final ObjectMapper parentObjectMapper;
444444
private final ObjectMapper childObjectMapper;
@@ -507,6 +507,10 @@ public TopDocsAndMaxScore topDocs(SearchHit hit) throws IOException {
507507
return new TopDocsAndMaxScore(td, maxScore);
508508
}
509509
}
510+
511+
public ObjectMapper getChildObjectMapper() {
512+
return childObjectMapper;
513+
}
510514
}
511515

512516
@Override

server/src/main/java/org/opensearch/search/fetch/FetchPhase.java

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,7 @@
3838
import org.apache.lucene.index.ReaderUtil;
3939
import org.apache.lucene.search.DocIdSetIterator;
4040
import org.apache.lucene.search.Query;
41-
import org.apache.lucene.search.ScoreMode;
42-
import org.apache.lucene.search.Scorer;
4341
import org.apache.lucene.search.TotalHits;
44-
import org.apache.lucene.search.Weight;
4542
import org.apache.lucene.util.BitSet;
4643
import org.opensearch.common.CheckedBiConsumer;
4744
import org.opensearch.common.annotation.PublicApi;
@@ -55,7 +52,6 @@
5552
import org.opensearch.core.common.text.Text;
5653
import org.opensearch.core.tasks.TaskCancelledException;
5754
import org.opensearch.core.xcontent.MediaType;
58-
import org.opensearch.index.IndexSettings;
5955
import org.opensearch.index.fieldvisitor.CustomFieldsVisitor;
6056
import org.opensearch.index.fieldvisitor.FieldsVisitor;
6157
import org.opensearch.index.mapper.DocumentMapper;
@@ -501,7 +497,6 @@ private SearchHit.NestedIdentity getInternalNestedIdentity(
501497
ObjectMapper current = nestedObjectMapper;
502498
String originalName = nestedObjectMapper.name();
503499
SearchHit.NestedIdentity nestedIdentity = null;
504-
final IndexSettings indexSettings = context.getQueryShardContext().getIndexSettings();
505500
do {
506501
Query parentFilter;
507502
nestedParentObjectMapper = current.getParentObjectMapper(mapperService);
@@ -520,14 +515,13 @@ private SearchHit.NestedIdentity getInternalNestedIdentity(
520515
current = nestedParentObjectMapper;
521516
continue;
522517
}
523-
final Weight childWeight = context.searcher()
524-
.createWeight(context.searcher().rewrite(childFilter), ScoreMode.COMPLETE_NO_SCORES, 1f);
525-
Scorer childScorer = childWeight.scorer(subReaderContext);
526-
if (childScorer == null) {
518+
BitSet childIter = context.bitsetFilterCache()
519+
.getBitSetProducer(context.searcher().rewrite(childFilter))
520+
.getBitSet(subReaderContext);
521+
if (childIter == null) {
527522
current = nestedParentObjectMapper;
528523
continue;
529524
}
530-
DocIdSetIterator childIter = childScorer.iterator();
531525

532526
BitSet parentBits = context.bitsetFilterCache().getBitSetProducer(parentFilter).getBitSet(subReaderContext);
533527

@@ -541,8 +535,8 @@ private SearchHit.NestedIdentity getInternalNestedIdentity(
541535
* that appear before him.
542536
*/
543537
int previousParent = parentBits.prevSetBit(currentParent);
544-
for (int docId = childIter.advance(previousParent + 1); docId < nestedSubDocId
545-
&& docId != DocIdSetIterator.NO_MORE_DOCS; docId = childIter.nextDoc()) {
538+
for (int docId = childIter.nextSetBit(previousParent + 1); docId < nestedSubDocId
539+
&& docId != DocIdSetIterator.NO_MORE_DOCS; docId = childIter.nextSetBit(docId + 1)) {
546540
offset++;
547541
}
548542
currentParent = nestedSubDocId;

server/src/main/java/org/opensearch/search/query/BitmapDocValuesQuery.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030

3131
import org.roaringbitmap.RoaringBitmap;
3232

33+
import static org.opensearch.search.query.BitmapIndexQuery.checkArgs;
34+
3335
/**
3436
* Filter with bitmap
3537
* <p>
@@ -43,6 +45,7 @@ public class BitmapDocValuesQuery extends Query implements Accountable {
4345
final long max;
4446

4547
public BitmapDocValuesQuery(String field, RoaringBitmap bitmap) {
48+
checkArgs(field, bitmap);
4649
this.field = field;
4750
this.bitmap = bitmap;
4851
if (!bitmap.isEmpty()) {
@@ -111,8 +114,7 @@ public boolean isCacheable(LeafReaderContext ctx) {
111114

112115
@Override
113116
public String toString(String field) {
114-
// bitmap may contain high cardinality, so choose to not show the actual values in it
115-
return field + " cardinality: " + bitmap.getLongCardinality();
117+
return "BitmapDocValuesQuery(field=" + this.field + ")";
116118
}
117119

118120
@Override
@@ -139,8 +141,8 @@ public int hashCode() {
139141

140142
@Override
141143
public long ramBytesUsed() {
142-
return RamUsageEstimator.shallowSizeOfInstance(BitmapDocValuesQuery.class) + RamUsageEstimator.sizeOfObject(field)
143-
+ RamUsageEstimator.sizeOfObject(bitmap);
144+
return RamUsageEstimator.shallowSizeOfInstance(BitmapIndexQuery.class) + RamUsageEstimator.sizeOf(field) + bitmap
145+
.getLongSizeInBytes();
144146
}
145147

146148
@Override

0 commit comments

Comments
 (0)