FetchSubPhase to support a single parser that extends SearchExtParser
This commit is contained in:
parent
f9530dfe8f
commit
12eaeb3945
|
@ -63,7 +63,7 @@ import org.elasticsearch.search.dfs.DfsPhase;
|
||||||
import org.elasticsearch.search.dfs.DfsSearchResult;
|
import org.elasticsearch.search.dfs.DfsSearchResult;
|
||||||
import org.elasticsearch.search.fetch.FetchPhase;
|
import org.elasticsearch.search.fetch.FetchPhase;
|
||||||
import org.elasticsearch.search.fetch.FetchSearchResult;
|
import org.elasticsearch.search.fetch.FetchSearchResult;
|
||||||
import org.elasticsearch.search.fetch.FetchSubPhaseParser;
|
import org.elasticsearch.search.fetch.SearchExtParser;
|
||||||
import org.elasticsearch.search.fetch.QueryFetchSearchResult;
|
import org.elasticsearch.search.fetch.QueryFetchSearchResult;
|
||||||
import org.elasticsearch.search.fetch.ScrollQueryFetchSearchResult;
|
import org.elasticsearch.search.fetch.ScrollQueryFetchSearchResult;
|
||||||
import org.elasticsearch.search.fetch.ShardFetchRequest;
|
import org.elasticsearch.search.fetch.ShardFetchRequest;
|
||||||
|
@ -144,7 +144,7 @@ public class SearchService extends AbstractLifecycleComponent implements IndexEv
|
||||||
|
|
||||||
private final ConcurrentMapLong<SearchContext> activeContexts = ConcurrentCollections.newConcurrentMapLongWithAggressiveConcurrency();
|
private final ConcurrentMapLong<SearchContext> activeContexts = ConcurrentCollections.newConcurrentMapLongWithAggressiveConcurrency();
|
||||||
|
|
||||||
private final Map<String, FetchSubPhaseParser> fetchPhaseParsers;
|
private final Map<String, SearchExtParser> fetchPhaseParsers;
|
||||||
|
|
||||||
private final ParseFieldMatcher parseFieldMatcher;
|
private final ParseFieldMatcher parseFieldMatcher;
|
||||||
|
|
||||||
|
@ -763,8 +763,8 @@ public class SearchService extends AbstractLifecycleComponent implements IndexEv
|
||||||
if (token == XContentParser.Token.FIELD_NAME) {
|
if (token == XContentParser.Token.FIELD_NAME) {
|
||||||
currentFieldName = extParser.currentName();
|
currentFieldName = extParser.currentName();
|
||||||
} else {
|
} else {
|
||||||
FetchSubPhaseParser fetchSubPhaseParser = this.fetchPhaseParsers.get(currentFieldName);
|
SearchExtParser searchExtParser = this.fetchPhaseParsers.get(currentFieldName);
|
||||||
if (fetchSubPhaseParser == null) {
|
if (searchExtParser == null) {
|
||||||
if (currentFieldName != null && currentFieldName.equals("suggest")) {
|
if (currentFieldName != null && currentFieldName.equals("suggest")) {
|
||||||
throw new SearchParseException(context,
|
throw new SearchParseException(context,
|
||||||
"suggest is not supported in [ext], please use SearchSourceBuilder#suggest(SuggestBuilder) instead",
|
"suggest is not supported in [ext], please use SearchSourceBuilder#suggest(SuggestBuilder) instead",
|
||||||
|
@ -773,7 +773,7 @@ public class SearchService extends AbstractLifecycleComponent implements IndexEv
|
||||||
throw new SearchParseException(context, "Unknown element [" + currentFieldName + "] in [ext]",
|
throw new SearchParseException(context, "Unknown element [" + currentFieldName + "] in [ext]",
|
||||||
extParser.getTokenLocation());
|
extParser.getTokenLocation());
|
||||||
} else {
|
} else {
|
||||||
Object fetchSubPhaseBuilder = fetchSubPhaseParser.parse(extParser);
|
Object fetchSubPhaseBuilder = searchExtParser.parse(extParser);
|
||||||
context.putFetchSubPhaseBuilder(currentFieldName, fetchSubPhaseBuilder);
|
context.putFetchSubPhaseBuilder(currentFieldName, fetchSubPhaseBuilder);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,10 +77,12 @@ public class FetchPhase implements SearchPhase {
|
||||||
this.fetchSubPhases[fetchSubPhases.size()] = new InnerHitsFetchSubPhase(this);
|
this.fetchSubPhases[fetchSubPhases.size()] = new InnerHitsFetchSubPhase(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<String, ? extends FetchSubPhaseParser> parsers() {
|
public Map<String, ? extends SearchExtParser> parsers() {
|
||||||
Map<String, FetchSubPhaseParser> parsers = new HashMap<>();
|
Map<String, SearchExtParser> parsers = new HashMap<>();
|
||||||
for (FetchSubPhase fetchSubPhase : fetchSubPhases) {
|
for (FetchSubPhase fetchSubPhase : fetchSubPhases) {
|
||||||
parsers.putAll(fetchSubPhase.parsers());
|
if (fetchSubPhase.parser() != null) {
|
||||||
|
parsers.put(fetchSubPhase.parser().getName(), fetchSubPhase.parser());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return unmodifiableMap(parsers);
|
return unmodifiableMap(parsers);
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,7 +25,6 @@ import org.apache.lucene.search.IndexSearcher;
|
||||||
import org.elasticsearch.search.internal.InternalSearchHit;
|
import org.elasticsearch.search.internal.InternalSearchHit;
|
||||||
import org.elasticsearch.search.internal.SearchContext;
|
import org.elasticsearch.search.internal.SearchContext;
|
||||||
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
@ -77,8 +76,11 @@ public interface FetchSubPhase {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
default Map<String, ? extends FetchSubPhaseParser> parsers() {
|
/**
|
||||||
return Collections.emptyMap();
|
* Returns the parser for the optional config to be put in the ext section of the search request
|
||||||
|
*/
|
||||||
|
default SearchExtParser parser() {
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -22,9 +22,17 @@ package org.elasticsearch.search.fetch;
|
||||||
import org.elasticsearch.common.xcontent.XContentParser;
|
import org.elasticsearch.common.xcontent.XContentParser;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parser for the ext section of a search request, which can hold custom fetch sub phase
|
* Parser for the ext section of a search request, which can hold custom fetch sub phases config
|
||||||
*/
|
*/
|
||||||
public interface FetchSubPhaseParser {
|
public interface SearchExtParser {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the name of the element that this parser is able to parse
|
||||||
|
*/
|
||||||
|
String getName();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses the element whose name is returned by {@link #getName()}
|
||||||
|
*/
|
||||||
Object parse(XContentParser parser) throws Exception;
|
Object parse(XContentParser parser) throws Exception;
|
||||||
}
|
}
|
|
@ -50,7 +50,6 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import static java.util.Collections.singletonList;
|
import static java.util.Collections.singletonList;
|
||||||
import static java.util.Collections.singletonMap;
|
|
||||||
import static org.elasticsearch.client.Requests.indexRequest;
|
import static org.elasticsearch.client.Requests.indexRequest;
|
||||||
import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
|
import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
|
||||||
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertSearchResponse;
|
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertSearchResponse;
|
||||||
|
@ -109,8 +108,8 @@ public class FetchSubPhasePluginIT extends ESIntegTestCase {
|
||||||
private static final String NAME = "term_vectors_fetch";
|
private static final String NAME = "term_vectors_fetch";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<String, ? extends FetchSubPhaseParser> parsers() {
|
public SearchExtParser parser() {
|
||||||
return singletonMap(NAME, new TermVectorsFetchParser());
|
return TermVectorsFetchParser.INSTANCE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -145,7 +144,18 @@ public class FetchSubPhasePluginIT extends ESIntegTestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class TermVectorsFetchParser implements FetchSubPhaseParser {
|
public static final class TermVectorsFetchParser implements SearchExtParser {
|
||||||
|
|
||||||
|
private static final TermVectorsFetchParser INSTANCE = new TermVectorsFetchParser();
|
||||||
|
|
||||||
|
private TermVectorsFetchParser() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return TermVectorsFetchSubPhase.NAME;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TermVectorsFetchBuilder parse(XContentParser parser) throws Exception {
|
public TermVectorsFetchBuilder parse(XContentParser parser) throws Exception {
|
||||||
String field;
|
String field;
|
||||||
|
@ -162,7 +172,7 @@ public class FetchSubPhasePluginIT extends ESIntegTestCase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class TermVectorsFetchBuilder {
|
public static final class TermVectorsFetchBuilder {
|
||||||
private final String field;
|
private final String field;
|
||||||
|
|
||||||
private TermVectorsFetchBuilder(String field) {
|
private TermVectorsFetchBuilder(String field) {
|
||||||
|
|
Loading…
Reference in New Issue