Elasticsearch plugin providing comprehensive ranking evaluation capabilities for search quality assessment.
—
This section covers the core request and response classes for the Elasticsearch Rank Eval plugin, including request builders, response handling, and evaluation specifications.
Main request class for ranking evaluation operations.
public class RankEvalRequest extends ActionRequest implements IndicesRequest.Replaceable {
// Constructors
public RankEvalRequest(RankEvalSpec rankingEvaluationSpec, String[] indices);
RankEvalRequest(); // package-private
// Evaluation specification methods
public RankEvalSpec getRankEvalSpec();
public void setRankEvalSpec(RankEvalSpec task);
// Index targeting methods
public RankEvalRequest indices(String... indices);
public String[] indices();
// Options and configuration
public IndicesOptions indicesOptions();
public void indicesOptions(IndicesOptions indicesOptions);
public SearchType searchType();
public void searchType(SearchType searchType);
// Validation
public ActionRequestValidationException validate();
}Usage:
// Create evaluation specification
RankEvalSpec spec = new RankEvalSpec(ratedRequests, metric);
// Create request targeting specific indices
RankEvalRequest request = new RankEvalRequest(spec, new String[]{"products", "catalog"});
// Configure search options
request.searchType(SearchType.DFS_QUERY_THEN_FETCH);
request.indicesOptions(IndicesOptions.strictExpandOpen());Response containing evaluation results and per-query details.
public class RankEvalResponse extends ActionResponse implements ToXContentObject {
// Constructor
public RankEvalResponse(double metricScore, Map<String, EvalQueryQuality> partialResults, Map<String, Exception> failures);
// Result access methods
public double getMetricScore();
public Map<String, EvalQueryQuality> getPartialResults();
public Map<String, Exception> getFailures();
// Serialization
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException;
public static RankEvalResponse fromXContent(XContentParser parser) throws IOException;
}Usage:
// Execute request and access results
RankEvalResponse response = client.execute(RankEvalAction.INSTANCE, request).get();
// Get overall evaluation score
double overallScore = response.getMetricScore();
// Access per-query results
Map<String, EvalQueryQuality> queryResults = response.getPartialResults();
for (Map.Entry<String, EvalQueryQuality> entry : queryResults.entrySet()) {
String queryId = entry.getKey();
EvalQueryQuality quality = entry.getValue();
double queryScore = quality.metricScore();
System.out.println("Query " + queryId + " score: " + queryScore);
}
// Check for failures
Map<String, Exception> failures = response.getFailures();
if (!failures.isEmpty()) {
System.out.println("Failed queries: " + failures.keySet());
}Specification containing the complete evaluation configuration.
public class RankEvalSpec implements Writeable, ToXContentObject {
// Constructors
public RankEvalSpec(List<RatedRequest> ratedRequests, EvaluationMetric metric);
public RankEvalSpec(List<RatedRequest> ratedRequests, EvaluationMetric metric, Collection<ScriptWithId> templates);
// Core configuration access
public EvaluationMetric getMetric();
public List<RatedRequest> getRatedRequests();
public Map<String, Script> getTemplates();
// Concurrency control
public int getMaxConcurrentSearches();
public void setMaxConcurrentSearches(int maxConcurrentSearches);
// Parsing and serialization
public static RankEvalSpec parse(XContentParser parser);
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException;
}Usage:
// Create basic specification
RankEvalSpec spec = new RankEvalSpec(ratedRequests, new PrecisionAtK());
// Create specification with templates
List<ScriptWithId> templates = Arrays.asList(
new ScriptWithId("product_search", new Script("mustache", "{{query_string}}", templateParams))
);
RankEvalSpec specWithTemplates = new RankEvalSpec(ratedRequests, metric, templates);
// Configure concurrency
spec.setMaxConcurrentSearches(5);Builder class for constructing rank evaluation requests.
public class RankEvalRequestBuilder extends ActionRequestBuilder<RankEvalRequest, RankEvalResponse> {
// Constructor
public RankEvalRequestBuilder(ElasticsearchClient client, ActionType<RankEvalResponse> action, RankEvalRequest request);
// Request access and modification
public RankEvalRequest request();
public void setRankEvalSpec(RankEvalSpec spec);
public RankEvalSpec getRankEvalSpec();
}Usage:
// Using request builder
RankEvalRequestBuilder builder = new RankEvalRequestBuilder(client, RankEvalAction.INSTANCE, new RankEvalRequest());
builder.setRankEvalSpec(spec);
RankEvalResponse response = builder.execute().actionGet();Individual query with its rated documents for evaluation.
public class RatedRequest implements Writeable, ToXContentObject {
// Core properties access
public String getId();
public SearchSourceBuilder getEvaluationRequest();
public List<RatedDocument> getRatedDocs();
// Template-based evaluation
public String getTemplateId();
public Map<String, Object> getParams();
// Serialization
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException;
public static RatedRequest fromXContent(XContentParser parser) throws IOException;
}Usage:
// Create search request
SearchSourceBuilder searchSource = SearchSourceBuilder.searchSource()
.query(QueryBuilders.multiMatchQuery("smartphone", "title", "description"))
.size(50);
// Create rated documents
List<RatedDocument> ratedDocs = Arrays.asList(
new RatedDocument("products", "iphone_13", 3), // highly relevant
new RatedDocument("products", "samsung_s21", 2), // relevant
new RatedDocument("products", "old_phone", 0) // not relevant
);
// Create rated request
RatedRequest ratedRequest = new RatedRequest(
"smartphone_search", // query identifier
Arrays.asList("products"), // target indices
searchSource, // search request
ratedDocs // document ratings
);Document with its relevance rating for a specific query.
public class RatedDocument implements Writeable, ToXContentObject {
// Constructor
public RatedDocument(String index, String id, int rating);
// Property access
public DocumentKey getKey();
public int getRating();
// Serialization
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException;
public static RatedDocument fromXContent(XContentParser parser) throws IOException;
// Nested DocumentKey class
public static class DocumentKey {
public DocumentKey(String index, String id);
public String getIndex();
public String getId();
}
}Usage:
// Create rated documents with different relevance levels
List<RatedDocument> ratedDocs = Arrays.asList(
new RatedDocument("articles", "elasticsearch_guide", 3), // perfect match
new RatedDocument("articles", "search_basics", 2), // good match
new RatedDocument("articles", "database_intro", 1), // marginal relevance
new RatedDocument("articles", "cooking_tips", 0) // not relevant
);
// Access document properties
for (RatedDocument doc : ratedDocs) {
DocumentKey key = doc.getKey();
int rating = doc.getRating();
System.out.println("Document " + key.getId() + " in " + key.getIndex() + ": rating " + rating);
}// Direct execution using transport client
RankEvalRequest request = new RankEvalRequest(spec, indices);
RankEvalResponse response = client.execute(RankEvalAction.INSTANCE, request).get();// Async execution with callback
client.execute(RankEvalAction.INSTANCE, request, new ActionListener<RankEvalResponse>() {
@Override
public void onResponse(RankEvalResponse response) {
double score = response.getMetricScore();
// Process results
}
@Override
public void onFailure(Exception e) {
// Handle failure
}
});// Create template script
Script template = new Script(
ScriptType.INLINE,
"mustache",
"{\"query\": {\"match\": {\"{{field}}\": \"{{query}}\"}}}",
Collections.emptyMap()
);
// Create template wrapper
ScriptWithId scriptWithId = new ScriptWithId("search_template", template);
// Create rated request using template
RatedRequest templateRequest = new RatedRequest(
"templated_query",
"search_template",
Map.of("field", "title", "query", "elasticsearch"),
ratedDocs
);
// Include in specification
RankEvalSpec spec = new RankEvalSpec(
Arrays.asList(templateRequest),
metric,
Arrays.asList(scriptWithId)
);try {
RankEvalResponse response = client.execute(RankEvalAction.INSTANCE, request).get();
// Check for partial failures
Map<String, Exception> failures = response.getFailures();
if (!failures.isEmpty()) {
for (Map.Entry<String, Exception> failure : failures.entrySet()) {
System.err.println("Query " + failure.getKey() + " failed: " + failure.getValue().getMessage());
}
}
} catch (ExecutionException e) {
if (e.getCause() instanceof ElasticsearchException) {
ElasticsearchException esException = (ElasticsearchException) e.getCause();
System.err.println("Elasticsearch error: " + esException.getMessage());
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
System.err.println("Request interrupted");
}Install with Tessl CLI
npx tessl i tessl/maven-org-elasticsearch-plugin--rank-eval-client