Fix parsing single `rescore` element in SearchSourceBuilder
We are currently only parsing the array-syntax for the rescore part in SearchSourceBuilder ("rescore" : [ {...}, {...} ]) . We also need to support "rescore" : {...} Closes #18439
This commit is contained in:
parent
1022123f59
commit
808ef6cec7
|
@ -1033,6 +1033,9 @@ public final class SearchSourceBuilder extends ToXContentToBytes implements Writ
|
||||||
suggestBuilder = SuggestBuilder.fromXContent(context, suggesters);
|
suggestBuilder = SuggestBuilder.fromXContent(context, suggesters);
|
||||||
} else if (context.getParseFieldMatcher().match(currentFieldName, SORT_FIELD)) {
|
} else if (context.getParseFieldMatcher().match(currentFieldName, SORT_FIELD)) {
|
||||||
sorts = new ArrayList<>(SortBuilder.fromXContent(context));
|
sorts = new ArrayList<>(SortBuilder.fromXContent(context));
|
||||||
|
} else if (context.getParseFieldMatcher().match(currentFieldName, RESCORE_FIELD)) {
|
||||||
|
rescoreBuilders = new ArrayList<>();
|
||||||
|
rescoreBuilders.add(RescoreBuilder.parseFromXContent(context));
|
||||||
} else if (context.getParseFieldMatcher().match(currentFieldName, EXT_FIELD)) {
|
} else if (context.getParseFieldMatcher().match(currentFieldName, EXT_FIELD)) {
|
||||||
XContentBuilder xContentBuilder = XContentFactory.jsonBuilder().copyCurrentStructure(parser);
|
XContentBuilder xContentBuilder = XContentFactory.jsonBuilder().copyCurrentStructure(parser);
|
||||||
ext = xContentBuilder.bytes();
|
ext = xContentBuilder.bytes();
|
||||||
|
|
|
@ -72,6 +72,7 @@ import org.elasticsearch.search.aggregations.AggregatorParsers;
|
||||||
import org.elasticsearch.search.fetch.source.FetchSourceContext;
|
import org.elasticsearch.search.fetch.source.FetchSourceContext;
|
||||||
import org.elasticsearch.search.highlight.HighlightBuilderTests;
|
import org.elasticsearch.search.highlight.HighlightBuilderTests;
|
||||||
import org.elasticsearch.search.rescore.QueryRescoreBuilderTests;
|
import org.elasticsearch.search.rescore.QueryRescoreBuilderTests;
|
||||||
|
import org.elasticsearch.search.rescore.QueryRescorerBuilder;
|
||||||
import org.elasticsearch.search.searchafter.SearchAfterBuilder;
|
import org.elasticsearch.search.searchafter.SearchAfterBuilder;
|
||||||
import org.elasticsearch.search.sort.FieldSortBuilder;
|
import org.elasticsearch.search.sort.FieldSortBuilder;
|
||||||
import org.elasticsearch.search.sort.ScoreSortBuilder;
|
import org.elasticsearch.search.sort.ScoreSortBuilder;
|
||||||
|
@ -561,6 +562,57 @@ public class SearchSourceBuilderTests extends ESTestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* test that we can parse the `rescore` element either as single object or as array
|
||||||
|
*/
|
||||||
|
public void testParseRescore() throws IOException {
|
||||||
|
{
|
||||||
|
String restContent = "{\n" +
|
||||||
|
" \"query\" : {\n" +
|
||||||
|
" \"match\": { \"content\": { \"query\": \"foo bar\" }}\n" +
|
||||||
|
" },\n" +
|
||||||
|
" \"rescore\": {" +
|
||||||
|
" \"window_size\": 50,\n" +
|
||||||
|
" \"query\": {\n" +
|
||||||
|
" \"rescore_query\" : {\n" +
|
||||||
|
" \"match\": { \"content\": { \"query\": \"baz\" } }\n" +
|
||||||
|
" }\n" +
|
||||||
|
" }\n" +
|
||||||
|
" }\n" +
|
||||||
|
"}\n";
|
||||||
|
try (XContentParser parser = XContentFactory.xContent(restContent).createParser(restContent)) {
|
||||||
|
SearchSourceBuilder searchSourceBuilder = SearchSourceBuilder.fromXContent(createParseContext(parser),
|
||||||
|
aggParsers, suggesters);
|
||||||
|
assertEquals(1, searchSourceBuilder.rescores().size());
|
||||||
|
assertEquals(new QueryRescorerBuilder(QueryBuilders.matchQuery("content", "baz")).windowSize(50),
|
||||||
|
searchSourceBuilder.rescores().get(0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
String restContent = "{\n" +
|
||||||
|
" \"query\" : {\n" +
|
||||||
|
" \"match\": { \"content\": { \"query\": \"foo bar\" }}\n" +
|
||||||
|
" },\n" +
|
||||||
|
" \"rescore\": [ {" +
|
||||||
|
" \"window_size\": 50,\n" +
|
||||||
|
" \"query\": {\n" +
|
||||||
|
" \"rescore_query\" : {\n" +
|
||||||
|
" \"match\": { \"content\": { \"query\": \"baz\" } }\n" +
|
||||||
|
" }\n" +
|
||||||
|
" }\n" +
|
||||||
|
" } ]\n" +
|
||||||
|
"}\n";
|
||||||
|
try (XContentParser parser = XContentFactory.xContent(restContent).createParser(restContent)) {
|
||||||
|
SearchSourceBuilder searchSourceBuilder = SearchSourceBuilder.fromXContent(createParseContext(parser),
|
||||||
|
aggParsers, suggesters);
|
||||||
|
assertEquals(1, searchSourceBuilder.rescores().size());
|
||||||
|
assertEquals(new QueryRescorerBuilder(QueryBuilders.matchQuery("content", "baz")).windowSize(50),
|
||||||
|
searchSourceBuilder.rescores().get(0));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void testEmptyPostFilter() throws IOException {
|
public void testEmptyPostFilter() throws IOException {
|
||||||
SearchSourceBuilder builder = new SearchSourceBuilder();
|
SearchSourceBuilder builder = new SearchSourceBuilder();
|
||||||
builder.postFilter(new EmptyQueryBuilder());
|
builder.postFilter(new EmptyQueryBuilder());
|
||||||
|
|
Loading…
Reference in New Issue