diff --git a/server/src/internalClusterTest/java/org/elasticsearch/search/fetch/subphase/highlight/HighlighterSearchIT.java b/server/src/internalClusterTest/java/org/elasticsearch/search/fetch/subphase/highlight/HighlighterSearchIT.java index 2d05bb0765f75..4e61645d6c0b7 100644 --- a/server/src/internalClusterTest/java/org/elasticsearch/search/fetch/subphase/highlight/HighlighterSearchIT.java +++ b/server/src/internalClusterTest/java/org/elasticsearch/search/fetch/subphase/highlight/HighlighterSearchIT.java @@ -698,15 +698,60 @@ public void testPlainHighlighter() throws Exception { .setSource("field1", "this is a test", "field2", "The quick brown fox jumps over the lazy dog").get(); refresh(); - logger.info("--> highlighting and searching on field1"); SearchSourceBuilder source = searchSource() .query(termQuery("field1", "test")) - .highlighter(highlight().field("field1").order("score").preTags("").postTags("")); + .highlighter(highlight().highlighterType("plain").field("field1").order("score").preTags("").postTags("")); SearchResponse searchResponse = client().prepareSearch("test").setSource(source).get(); assertHighlight(searchResponse, 0, "field1", 0, 1, equalTo("this is a test")); + } + + public void testPlainHighlighterOrder() throws Exception { + ensureGreen(); + + client().prepareIndex("test", "type") + .setSource("field1", "The quick brown fox jumps over the lazy brown dog but to no suprise the dog doesn't care").get(); + refresh(); + + { + // fragments should be in order of appearance by default + SearchSourceBuilder source = searchSource().query(matchQuery("field1", "brown dog")) + .highlighter( + highlight().highlighterType("plain").field("field1").preTags("").postTags("").fragmentSize(25) + ); + + SearchResponse searchResponse = client().prepareSearch("test").setSource(source).get(); + assertHighlight(searchResponse, 0, "field1", 0, 3, equalTo("The quick brown fox")); + assertHighlight(searchResponse, 0, "field1", 1, 3, equalTo(" jumps over the lazy brown dog")); + assertHighlight(searchResponse, 0, "field1", 2, 3, equalTo(" dog doesn't care")); + + // lets be explicit about the order + source = searchSource().query(matchQuery("field1", "brown dog")) + .highlighter( + highlight().highlighterType("plain").field("field1").order("none").preTags("").postTags("").fragmentSize(25) + ); + + searchResponse = client().prepareSearch("test").setSource(source).get(); + + assertHighlight(searchResponse, 0, "field1", 0, 3, equalTo("The quick brown fox")); + assertHighlight(searchResponse, 0, "field1", 1, 3, equalTo(" jumps over the lazy brown dog")); + assertHighlight(searchResponse, 0, "field1", 2, 3, equalTo(" dog doesn't care")); + } + { + // order by score + SearchSourceBuilder source = searchSource().query(matchQuery("field1", "brown dog")) + .highlighter( + highlight().highlighterType("plain").order("score").field("field1").preTags("").postTags("").fragmentSize(25) + ); + + SearchResponse searchResponse = client().prepareSearch("test").setSource(source).get(); + + assertHighlight(searchResponse, 0, "field1", 0, 3, equalTo(" jumps over the lazy brown dog")); + assertHighlight(searchResponse, 0, "field1", 1, 3, equalTo("The quick brown fox")); + assertHighlight(searchResponse, 0, "field1", 2, 3, equalTo(" dog doesn't care")); + } } public void testFastVectorHighlighter() throws Exception { diff --git a/server/src/main/java/org/elasticsearch/search/fetch/subphase/highlight/PlainHighlighter.java b/server/src/main/java/org/elasticsearch/search/fetch/subphase/highlight/PlainHighlighter.java index 59755d22489d8..3d4167d9e1e40 100644 --- a/server/src/main/java/org/elasticsearch/search/fetch/subphase/highlight/PlainHighlighter.java +++ b/server/src/main/java/org/elasticsearch/search/fetch/subphase/highlight/PlainHighlighter.java @@ -135,8 +135,9 @@ public HighlightField highlight(FieldHighlightContext fieldContext) throws IOExc } } - if (field.fieldOptions().scoreOrdered()) { - CollectionUtil.introSort(fragsList, (o1, o2) -> Math.round(o2.getScore() - o1.getScore())); + // fragments are ordered by score by default since we add them in best + if (field.fieldOptions().scoreOrdered() == false) { + CollectionUtil.introSort(fragsList, (o1, o2) -> o1.getFragNum() - o2.getFragNum()); } String[] fragments; // number_of_fragments is set to 0 but we have a multivalued field