Fix merging logic of Suggester Options (#29514)

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.
This commit is contained in:
James Baiera 2018-05-02 14:40:57 -04:00 committed by GitHub
parent 383856a175
commit 6d6da7c661
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 30 additions and 1 deletions

View File

@ -742,6 +742,13 @@ public class Suggest implements Iterable<Suggest.Suggestion<? extends Entry<? ex
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

View File

@ -191,5 +191,27 @@ public class SuggestTests extends ESTestCase {
}
}
public void testMergingSuggestionOptions() {
String suggestedWord = randomAlphaOfLength(10);
String secondWord = randomAlphaOfLength(10);
Text suggestionText = new Text(suggestedWord + " " + secondWord);
Text highlighted = new Text("<em>" + suggestedWord + "</em> " + 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());
}
}