From fd0b0cdd56c1b01e4c4dd0911b53a92819b50a66 Mon Sep 17 00:00:00 2001 From: James Baiera Date: Fri, 13 Apr 2018 10:56:58 -0400 Subject: [PATCH 1/2] Fix merging logic of Suggester Options Suggester Options have a collate match field that is returned when the prune option is set to true. These values should be merged together in the query reduce phase, otherwise good suggestions that result in rare hits in shards with results that do not arrive first may be incorrectly marked as not matching the collate query. --- .../elasticsearch/search/suggest/Suggest.java | 7 +++++ .../search/suggest/SuggestTests.java | 26 ++++++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/server/src/main/java/org/elasticsearch/search/suggest/Suggest.java b/server/src/main/java/org/elasticsearch/search/suggest/Suggest.java index a54f1193df008..e40991933592f 100644 --- a/server/src/main/java/org/elasticsearch/search/suggest/Suggest.java +++ b/server/src/main/java/org/elasticsearch/search/suggest/Suggest.java @@ -742,6 +742,13 @@ public static Option fromXContent(XContentParser parser) { protected void mergeInto(Option otherOption) { score = Math.max(score, otherOption.score); + if (otherOption.collateMatch != null) { + if (collateMatch == null) { + collateMatch = otherOption.collateMatch; + } else { + collateMatch |= otherOption.collateMatch; + } + } } @Override diff --git a/server/src/test/java/org/elasticsearch/search/suggest/SuggestTests.java b/server/src/test/java/org/elasticsearch/search/suggest/SuggestTests.java index d54fa0f705f0d..643dba9db9339 100644 --- a/server/src/test/java/org/elasticsearch/search/suggest/SuggestTests.java +++ b/server/src/test/java/org/elasticsearch/search/suggest/SuggestTests.java @@ -42,7 +42,9 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; import static org.elasticsearch.common.xcontent.XContentHelper.toXContent; import static org.elasticsearch.common.xcontent.XContentParserUtils.ensureExpectedToken; @@ -191,5 +193,27 @@ public void testParsingExceptionOnUnknownSuggestion() throws IOException { } } - + public void testMergingSuggestionOptions() { + String suggestedWord = randomAlphaOfLength(10); + String secondWord = randomAlphaOfLength(10); + Text suggestionText = new Text(suggestedWord + " " + secondWord); + Text highlighted = new Text("" + suggestedWord + " " + secondWord); + PhraseSuggestion.Entry.Option option1 = new Option(suggestionText, highlighted, 0.7f, false); + PhraseSuggestion.Entry.Option option2 = new Option(suggestionText, highlighted, 0.8f, true); + PhraseSuggestion.Entry.Option option3 = new Option(suggestionText, highlighted, 0.6f); + assertEquals(suggestionText, option1.getText()); + assertEquals(highlighted, option1.getHighlighted()); + assertFalse(option1.collateMatch()); + assertTrue(option1.getScore() > 0.6f); + option1.mergeInto(option2); + assertEquals(suggestionText, option1.getText()); + assertEquals(highlighted, option1.getHighlighted()); + assertTrue(option1.collateMatch()); + assertTrue(option1.getScore() > 0.7f); + option1.mergeInto(option3); + assertEquals(suggestionText, option1.getText()); + assertEquals(highlighted, option1.getHighlighted()); + assertTrue(option1.getScore() > 0.7f); + assertTrue(option1.collateMatch()); + } } From 585925683942d9d3e27607c52d653796caea5b82 Mon Sep 17 00:00:00 2001 From: James Baiera Date: Fri, 13 Apr 2018 11:04:47 -0400 Subject: [PATCH 2/2] Cleanup imports --- .../java/org/elasticsearch/search/suggest/SuggestTests.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/server/src/test/java/org/elasticsearch/search/suggest/SuggestTests.java b/server/src/test/java/org/elasticsearch/search/suggest/SuggestTests.java index 643dba9db9339..412dd3c6a2017 100644 --- a/server/src/test/java/org/elasticsearch/search/suggest/SuggestTests.java +++ b/server/src/test/java/org/elasticsearch/search/suggest/SuggestTests.java @@ -42,9 +42,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.HashMap; import java.util.List; -import java.util.Map; import static org.elasticsearch.common.xcontent.XContentHelper.toXContent; import static org.elasticsearch.common.xcontent.XContentParserUtils.ensureExpectedToken;