Skip to content

Commit 19d3533

Browse files
opensearch-trigger-bot[bot]github-actions[bot]
authored andcommitted
Fix the rewrite method for MatchOnlyText field query (opensearch-project#14154) (opensearch-project#14250)
(cherry picked from commit 435af89) Signed-off-by: Rishabh Maurya <[email protected]> Signed-off-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> Signed-off-by: kkewwei <[email protected]>
1 parent f804ba4 commit 19d3533

File tree

2 files changed

+97
-1
lines changed

2 files changed

+97
-1
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public void visit(QueryVisitor visitor) {
7373

7474
@Override
7575
public Query rewrite(IndexSearcher indexSearcher) throws IOException {
76-
Query rewritten = indexSearcher.rewrite(delegateQuery);
76+
Query rewritten = delegateQuery.rewrite(indexSearcher);
7777
if (rewritten == delegateQuery) {
7878
return this;
7979
}

server/src/test/java/org/opensearch/search/query/QueryProfilePhaseTests.java

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.apache.lucene.search.LeafCollector;
3636
import org.apache.lucene.search.MatchAllDocsQuery;
3737
import org.apache.lucene.search.MatchNoDocsQuery;
38+
import org.apache.lucene.search.PhraseQuery;
3839
import org.apache.lucene.search.Pruning;
3940
import org.apache.lucene.search.Query;
4041
import org.apache.lucene.search.Sort;
@@ -48,12 +49,18 @@
4849
import org.opensearch.action.search.SearchShardTask;
4950
import org.opensearch.common.settings.Settings;
5051
import org.opensearch.common.xcontent.json.JsonXContent;
52+
import org.opensearch.core.index.Index;
5153
import org.opensearch.core.xcontent.ToXContent;
5254
import org.opensearch.core.xcontent.XContentBuilder;
55+
import org.opensearch.index.mapper.DocumentMapper;
56+
import org.opensearch.index.mapper.MatchOnlyTextFieldMapper;
5357
import org.opensearch.index.mapper.NumberFieldMapper.NumberFieldType;
5458
import org.opensearch.index.mapper.NumberFieldMapper.NumberType;
59+
import org.opensearch.index.mapper.SourceFieldMapper;
60+
import org.opensearch.index.mapper.TextSearchInfo;
5561
import org.opensearch.index.query.ParsedQuery;
5662
import org.opensearch.index.query.QueryShardContext;
63+
import org.opensearch.index.query.SourceFieldMatchQuery;
5764
import org.opensearch.index.shard.IndexShard;
5865
import org.opensearch.index.shard.IndexShardTestCase;
5966
import org.opensearch.lucene.queries.MinDocQuery;
@@ -62,6 +69,9 @@
6269
import org.opensearch.search.internal.ContextIndexSearcher;
6370
import org.opensearch.search.internal.ScrollContext;
6471
import org.opensearch.search.internal.SearchContext;
72+
import org.opensearch.search.lookup.LeafSearchLookup;
73+
import org.opensearch.search.lookup.SearchLookup;
74+
import org.opensearch.search.lookup.SourceLookup;
6575
import org.opensearch.search.profile.ProfileResult;
6676
import org.opensearch.search.profile.ProfileShardResult;
6777
import org.opensearch.search.profile.SearchProfileShardResults;
@@ -80,6 +90,7 @@
8090
import java.util.Collection;
8191
import java.util.Collections;
8292
import java.util.List;
93+
import java.util.Set;
8394
import java.util.concurrent.ExecutorService;
8495
import java.util.concurrent.Executors;
8596
import java.util.concurrent.TimeUnit;
@@ -94,6 +105,7 @@
94105
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
95106
import static org.hamcrest.Matchers.hasSize;
96107
import static org.hamcrest.Matchers.instanceOf;
108+
import static org.mockito.ArgumentMatchers.any;
97109
import static org.mockito.Mockito.mock;
98110
import static org.mockito.Mockito.when;
99111

@@ -1526,6 +1538,90 @@ public void testCollapseQuerySearchResults() throws Exception {
15261538
dir.close();
15271539
}
15281540

1541+
public void testSourceFieldMatchQueryWithProfile() throws Exception {
1542+
Directory dir = newDirectory();
1543+
IndexWriterConfig iwc = newIndexWriterConfig();
1544+
RandomIndexWriter w = new RandomIndexWriter(random(), dir, iwc);
1545+
w.close();
1546+
IndexReader reader = DirectoryReader.open(dir);
1547+
QueryShardContext queryShardContext = mock(QueryShardContext.class);
1548+
DocumentMapper mockDocumentMapper = mock(DocumentMapper.class);
1549+
SourceFieldMapper mockSourceMapper = mock(SourceFieldMapper.class);
1550+
SearchLookup searchLookup = mock(SearchLookup.class);
1551+
LeafSearchLookup leafSearchLookup = mock(LeafSearchLookup.class);
1552+
1553+
when(queryShardContext.sourcePath("foo")).thenReturn(Set.of("bar"));
1554+
when(queryShardContext.index()).thenReturn(new Index("test_index", "uuid"));
1555+
when(searchLookup.getLeafSearchLookup(any())).thenReturn(leafSearchLookup);
1556+
when(leafSearchLookup.source()).thenReturn(new SourceLookup());
1557+
when(mockSourceMapper.enabled()).thenReturn(true);
1558+
when(mockDocumentMapper.sourceMapper()).thenReturn(mockSourceMapper);
1559+
when(queryShardContext.documentMapper(any())).thenReturn(mockDocumentMapper);
1560+
when(queryShardContext.lookup()).thenReturn(searchLookup);
1561+
1562+
TestSearchContext context = new TestSearchContext(queryShardContext, indexShard, newContextSearcher(reader, executor));
1563+
context.parsedQuery(
1564+
new ParsedQuery(
1565+
new SourceFieldMatchQuery(
1566+
new TermQuery(new Term("foo", "bar")),
1567+
new PhraseQuery("foo", "bar", "baz"),
1568+
new MatchOnlyTextFieldMapper.MatchOnlyTextFieldType(
1569+
"user",
1570+
true,
1571+
true,
1572+
TextSearchInfo.WHITESPACE_MATCH_ONLY,
1573+
Collections.emptyMap()
1574+
),
1575+
queryShardContext
1576+
)
1577+
)
1578+
);
1579+
1580+
context.setTask(new SearchShardTask(123L, "", "", "", null, Collections.emptyMap()));
1581+
context.setSize(1);
1582+
context.trackTotalHitsUpTo(5);
1583+
QueryPhase.executeInternal(context.withCleanQueryResult().withProfilers(), queryPhaseSearcher);
1584+
assertProfileData(context, "SourceFieldMatchQuery", query -> {
1585+
assertThat(query.getTimeBreakdown().keySet(), not(empty()));
1586+
assertThat(query.getTimeBreakdown().get("score"), equalTo(0L));
1587+
assertThat(query.getTimeBreakdown().get("score_count"), equalTo(0L));
1588+
if (executor != null) {
1589+
long maxScore = query.getTimeBreakdown().get("max_score");
1590+
long minScore = query.getTimeBreakdown().get("min_score");
1591+
long avgScore = query.getTimeBreakdown().get("avg_score");
1592+
long maxScoreCount = query.getTimeBreakdown().get("max_score_count");
1593+
long minScoreCount = query.getTimeBreakdown().get("min_score_count");
1594+
long avgScoreCount = query.getTimeBreakdown().get("avg_score_count");
1595+
assertThat(maxScore, equalTo(0L));
1596+
assertThat(minScore, equalTo(0L));
1597+
assertThat(avgScore, equalTo(0L));
1598+
assertThat(maxScore, equalTo(avgScore));
1599+
assertThat(avgScore, equalTo(minScore));
1600+
assertThat(maxScoreCount, equalTo(0L));
1601+
assertThat(minScoreCount, equalTo(0L));
1602+
assertThat(avgScoreCount, equalTo(0L));
1603+
assertThat(maxScoreCount, equalTo(avgScoreCount));
1604+
assertThat(avgScoreCount, equalTo(minScoreCount));
1605+
}
1606+
assertThat(query.getTimeBreakdown().get("create_weight"), greaterThan(0L));
1607+
assertThat(query.getTimeBreakdown().get("create_weight_count"), equalTo(1L));
1608+
assertThat(query.getProfiledChildren(), empty());
1609+
}, collector -> {
1610+
assertThat(collector.getReason(), equalTo("search_top_hits"));
1611+
assertThat(collector.getTime(), greaterThan(0L));
1612+
if (collector.getName().contains("CollectorManager")) {
1613+
assertThat(collector.getReduceTime(), greaterThan(0L));
1614+
}
1615+
assertThat(collector.getMaxSliceTime(), greaterThan(0L));
1616+
assertThat(collector.getMinSliceTime(), greaterThan(0L));
1617+
assertThat(collector.getAvgSliceTime(), greaterThan(0L));
1618+
assertThat(collector.getSliceCount(), greaterThanOrEqualTo(1));
1619+
assertThat(collector.getProfiledChildren(), empty());
1620+
});
1621+
reader.close();
1622+
dir.close();
1623+
}
1624+
15291625
private void assertProfileData(SearchContext context, String type, Consumer<ProfileResult> query, Consumer<CollectorResult> collector)
15301626
throws IOException {
15311627
assertProfileData(context, collector, (profileResult) -> {

0 commit comments

Comments
 (0)