|  | @@ -37,6 +37,7 @@ import org.elasticsearch.action.support.IndicesOptions;
 | 
	
		
			
				|  |  |  import org.elasticsearch.action.support.WriteRequest;
 | 
	
		
			
				|  |  |  import org.elasticsearch.client.ESRestHighLevelClientTestCase;
 | 
	
		
			
				|  |  |  import org.elasticsearch.client.RestHighLevelClient;
 | 
	
		
			
				|  |  | +import org.elasticsearch.common.Strings;
 | 
	
		
			
				|  |  |  import org.elasticsearch.common.text.Text;
 | 
	
		
			
				|  |  |  import org.elasticsearch.common.unit.Fuzziness;
 | 
	
		
			
				|  |  |  import org.elasticsearch.common.unit.TimeValue;
 | 
	
	
		
			
				|  | @@ -44,6 +45,16 @@ import org.elasticsearch.common.xcontent.XContentType;
 | 
	
		
			
				|  |  |  import org.elasticsearch.index.query.MatchQueryBuilder;
 | 
	
		
			
				|  |  |  import org.elasticsearch.index.query.QueryBuilder;
 | 
	
		
			
				|  |  |  import org.elasticsearch.index.query.QueryBuilders;
 | 
	
		
			
				|  |  | +import org.elasticsearch.index.rankeval.EvalQueryQuality;
 | 
	
		
			
				|  |  | +import org.elasticsearch.index.rankeval.EvaluationMetric;
 | 
	
		
			
				|  |  | +import org.elasticsearch.index.rankeval.MetricDetail;
 | 
	
		
			
				|  |  | +import org.elasticsearch.index.rankeval.PrecisionAtK;
 | 
	
		
			
				|  |  | +import org.elasticsearch.index.rankeval.RankEvalRequest;
 | 
	
		
			
				|  |  | +import org.elasticsearch.index.rankeval.RankEvalResponse;
 | 
	
		
			
				|  |  | +import org.elasticsearch.index.rankeval.RankEvalSpec;
 | 
	
		
			
				|  |  | +import org.elasticsearch.index.rankeval.RatedDocument;
 | 
	
		
			
				|  |  | +import org.elasticsearch.index.rankeval.RatedRequest;
 | 
	
		
			
				|  |  | +import org.elasticsearch.index.rankeval.RatedSearchHit;
 | 
	
		
			
				|  |  |  import org.elasticsearch.rest.RestStatus;
 | 
	
		
			
				|  |  |  import org.elasticsearch.search.Scroll;
 | 
	
		
			
				|  |  |  import org.elasticsearch.search.SearchHit;
 | 
	
	
		
			
				|  | @@ -74,6 +85,7 @@ import org.elasticsearch.search.suggest.SuggestionBuilder;
 | 
	
		
			
				|  |  |  import org.elasticsearch.search.suggest.term.TermSuggestion;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import java.io.IOException;
 | 
	
		
			
				|  |  | +import java.util.ArrayList;
 | 
	
		
			
				|  |  |  import java.util.Arrays;
 | 
	
		
			
				|  |  |  import java.util.Collections;
 | 
	
		
			
				|  |  |  import java.util.List;
 | 
	
	
		
			
				|  | @@ -688,6 +700,78 @@ public class SearchDocumentationIT extends ESRestHighLevelClientTestCase {
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    public void testRankEval() throws Exception {
 | 
	
		
			
				|  |  | +        indexSearchTestData();
 | 
	
		
			
				|  |  | +        RestHighLevelClient client = highLevelClient();
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            // tag::rank-eval-request-basic
 | 
	
		
			
				|  |  | +            EvaluationMetric metric = new PrecisionAtK();                 // <1>
 | 
	
		
			
				|  |  | +            List<RatedDocument> ratedDocs = new ArrayList<>();
 | 
	
		
			
				|  |  | +            ratedDocs.add(new RatedDocument("posts", "1", 1));            // <2>
 | 
	
		
			
				|  |  | +            SearchSourceBuilder searchQuery = new SearchSourceBuilder();
 | 
	
		
			
				|  |  | +            searchQuery.query(QueryBuilders.matchQuery("user", "kimchy"));// <3>
 | 
	
		
			
				|  |  | +            RatedRequest ratedRequest =                                   // <4>
 | 
	
		
			
				|  |  | +                    new RatedRequest("kimchy_query", ratedDocs, searchQuery);
 | 
	
		
			
				|  |  | +            List<RatedRequest> ratedRequests = Arrays.asList(ratedRequest);
 | 
	
		
			
				|  |  | +            RankEvalSpec specification =
 | 
	
		
			
				|  |  | +                    new RankEvalSpec(ratedRequests, metric);              // <5>
 | 
	
		
			
				|  |  | +            RankEvalRequest request =                                     // <6>
 | 
	
		
			
				|  |  | +                    new RankEvalRequest(specification, new String[] { "posts" });
 | 
	
		
			
				|  |  | +            // end::rank-eval-request-basic
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // tag::rank-eval-execute
 | 
	
		
			
				|  |  | +            RankEvalResponse response = client.rankEval(request);
 | 
	
		
			
				|  |  | +            // end::rank-eval-execute
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            logger.warn(Strings.toString(response));
 | 
	
		
			
				|  |  | +            // tag::rank-eval-response
 | 
	
		
			
				|  |  | +            double evaluationResult = response.getEvaluationResult();   // <1>
 | 
	
		
			
				|  |  | +            assertEquals(1.0 / 3.0, evaluationResult, 0.0);
 | 
	
		
			
				|  |  | +            Map<String, EvalQueryQuality> partialResults =
 | 
	
		
			
				|  |  | +                    response.getPartialResults();
 | 
	
		
			
				|  |  | +            EvalQueryQuality evalQuality =
 | 
	
		
			
				|  |  | +                    partialResults.get("kimchy_query");                 // <2>
 | 
	
		
			
				|  |  | +            assertEquals("kimchy_query", evalQuality.getId());
 | 
	
		
			
				|  |  | +            double qualityLevel = evalQuality.getQualityLevel();        // <3>
 | 
	
		
			
				|  |  | +            assertEquals(1.0 / 3.0, qualityLevel, 0.0);
 | 
	
		
			
				|  |  | +            List<RatedSearchHit> hitsAndRatings = evalQuality.getHitsAndRatings();
 | 
	
		
			
				|  |  | +            RatedSearchHit ratedSearchHit = hitsAndRatings.get(0);
 | 
	
		
			
				|  |  | +            assertEquals("3", ratedSearchHit.getSearchHit().getId());   // <4>
 | 
	
		
			
				|  |  | +            assertFalse(ratedSearchHit.getRating().isPresent());        // <5>
 | 
	
		
			
				|  |  | +            MetricDetail metricDetails = evalQuality.getMetricDetails();
 | 
	
		
			
				|  |  | +            String metricName = metricDetails.getMetricName();
 | 
	
		
			
				|  |  | +            assertEquals(PrecisionAtK.NAME, metricName);                // <6>
 | 
	
		
			
				|  |  | +            PrecisionAtK.Detail detail = (PrecisionAtK.Detail) metricDetails;
 | 
	
		
			
				|  |  | +            assertEquals(1, detail.getRelevantRetrieved());             // <7>
 | 
	
		
			
				|  |  | +            assertEquals(3, detail.getRetrieved());
 | 
	
		
			
				|  |  | +            // end::rank-eval-response
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // tag::rank-eval-execute-listener
 | 
	
		
			
				|  |  | +            ActionListener<RankEvalResponse> listener = new ActionListener<RankEvalResponse>() {
 | 
	
		
			
				|  |  | +                @Override
 | 
	
		
			
				|  |  | +                public void onResponse(RankEvalResponse response) {
 | 
	
		
			
				|  |  | +                    // <1>
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                @Override
 | 
	
		
			
				|  |  | +                public void onFailure(Exception e) {
 | 
	
		
			
				|  |  | +                    // <2>
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            };
 | 
	
		
			
				|  |  | +            // end::rank-eval-execute-listener
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // Replace the empty listener by a blocking listener in test
 | 
	
		
			
				|  |  | +            final CountDownLatch latch = new CountDownLatch(1);
 | 
	
		
			
				|  |  | +            listener = new LatchedActionListener<>(listener, latch);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // tag::rank-eval-execute-async
 | 
	
		
			
				|  |  | +            client.rankEvalAsync(request, listener); // <1>
 | 
	
		
			
				|  |  | +            // end::rank-eval-execute-async
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            assertTrue(latch.await(30L, TimeUnit.SECONDS));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      public void testMultiSearch() throws Exception {
 | 
	
		
			
				|  |  |          indexSearchTestData();
 | 
	
		
			
				|  |  |          RestHighLevelClient client = highLevelClient();
 |