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