From 9bebccba0c6f58bb1bbd09a99d23d765ad4153a5 Mon Sep 17 00:00:00 2001 From: Britta Weber Date: Wed, 13 Aug 2014 09:51:10 +0200 Subject: [PATCH] function_score: fix explanation, [ was missing --- .../functionscore/DecayFunctionParser.java | 1 + .../DecayFunctionScoreTests.java | 30 +++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/src/main/java/org/elasticsearch/index/query/functionscore/DecayFunctionParser.java b/src/main/java/org/elasticsearch/index/query/functionscore/DecayFunctionParser.java index 67310f559319b..017b8bc1a2ceb 100644 --- a/src/main/java/org/elasticsearch/index/query/functionscore/DecayFunctionParser.java +++ b/src/main/java/org/elasticsearch/index/query/functionscore/DecayFunctionParser.java @@ -381,6 +381,7 @@ protected double distance(int docId) { protected String getDistanceString(int docId) { StringBuilder values = new StringBuilder(mode.name()); + values.append("["); doubleValues.setDocument(docId); final int num = doubleValues.count(); if (num > 0) { diff --git a/src/test/java/org/elasticsearch/search/functionscore/DecayFunctionScoreTests.java b/src/test/java/org/elasticsearch/search/functionscore/DecayFunctionScoreTests.java index 93d4c91e6ff6a..2abafe850d209 100644 --- a/src/test/java/org/elasticsearch/search/functionscore/DecayFunctionScoreTests.java +++ b/src/test/java/org/elasticsearch/search/functionscore/DecayFunctionScoreTests.java @@ -45,6 +45,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.ExecutionException; import static org.elasticsearch.client.Requests.indexRequest; import static org.elasticsearch.client.Requests.searchRequest; @@ -938,4 +939,33 @@ public void testMissingFunctionThrowsElasticsearchParseException() throws IOExce assertTrue(failure.getMessage().contains("function must not be null")); } } + + @Test + public void testExplainString() throws IOException, ExecutionException, InterruptedException { + assertAcked(prepareCreate("test").addMapping( + "type1", + jsonBuilder().startObject().startObject("type1").startObject("properties").startObject("test").field("type", "string") + .endObject().startObject("num").field("type", "double").endObject().endObject().endObject().endObject())); + ensureYellow(); + + + client().prepareIndex().setType("type1").setId("1").setIndex("test") + .setSource(jsonBuilder().startObject().field("test", "value").array("num", 0.5, 0.7).endObject()).get(); + + refresh(); + + SearchResponse response = client().search( + searchRequest().searchType(SearchType.QUERY_THEN_FETCH).source( + searchSource().explain(true) + .query(functionScoreQuery(termQuery("test", "value")) + .add(gaussDecayFunction("num", 1.0, 5.0).setOffset(1.0)) + .add(linearDecayFunction("num", 1.0, 5.0).setOffset(1.0)) + .add(exponentialDecayFunction("num", 1.0, 5.0).setOffset(1.0)) + .boostMode(CombineFunction.REPLACE.getName())))).get(); + String explanation = response.getHits().getAt(0).getExplanation().toString(); + assertThat(explanation, containsString(" 1.0 = -exp(-0.5*pow(MIN[Math.max(Math.abs(0.5(=doc value) - 1.0(=origin))) - 1.0(=offset), 0), Math.max(Math.abs(0.7(=doc value) - 1.0(=origin))) - 1.0(=offset), 0)],2.0)/18.033688011112044)")); + assertThat(explanation, containsString("1.0 = max(0.0, ((10.0 - MIN[Math.max(Math.abs(0.5(=doc value) - 1.0(=origin))) - 1.0(=offset), 0), Math.max(Math.abs(0.7(=doc value) - 1.0(=origin))) - 1.0(=offset), 0)])/10.0)")); + assertThat(explanation, containsString("1.0 = exp(- MIN[Math.max(Math.abs(0.5(=doc value) - 1.0(=origin))) - 1.0(=offset), 0), Math.max(Math.abs(0.7(=doc value) - 1.0(=origin))) - 1.0(=offset), 0)] * 0.13862943611198905)")); + + } }