Skip to content

Commit 5ddaed9

Browse files
author
Christoph Büscher
authored
Fix Plain Highlighter ordering for none (#74084) (#74912)
The plain highlighter should order the fragments by order of appearance by default, but sorts them by score internally. This fix changes the sorting comparator in case ordering by score is not selected (the default) and adds testing around this. Closes #58236
1 parent 2782586 commit 5ddaed9

File tree

2 files changed

+50
-4
lines changed

2 files changed

+50
-4
lines changed

server/src/internalClusterTest/java/org/elasticsearch/search/fetch/subphase/highlight/HighlighterSearchIT.java

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -698,15 +698,60 @@ public void testPlainHighlighter() throws Exception {
698698
.setSource("field1", "this is a test", "field2", "The quick brown fox jumps over the lazy dog").get();
699699
refresh();
700700

701-
logger.info("--> highlighting and searching on field1");
702701
SearchSourceBuilder source = searchSource()
703702
.query(termQuery("field1", "test"))
704-
.highlighter(highlight().field("field1").order("score").preTags("<xxx>").postTags("</xxx>"));
703+
.highlighter(highlight().highlighterType("plain").field("field1").order("score").preTags("<xxx>").postTags("</xxx>"));
705704

706705
SearchResponse searchResponse = client().prepareSearch("test").setSource(source).get();
707706

708707
assertHighlight(searchResponse, 0, "field1", 0, 1, equalTo("this is a <xxx>test</xxx>"));
708+
}
709+
710+
public void testPlainHighlighterOrder() throws Exception {
711+
ensureGreen();
712+
713+
client().prepareIndex("test", "type")
714+
.setSource("field1", "The quick brown fox jumps over the lazy brown dog but to no suprise the dog doesn't care").get();
715+
refresh();
716+
717+
{
718+
// fragments should be in order of appearance by default
719+
SearchSourceBuilder source = searchSource().query(matchQuery("field1", "brown dog"))
720+
.highlighter(
721+
highlight().highlighterType("plain").field("field1").preTags("<xxx>").postTags("</xxx>").fragmentSize(25)
722+
);
723+
724+
SearchResponse searchResponse = client().prepareSearch("test").setSource(source).get();
709725

726+
assertHighlight(searchResponse, 0, "field1", 0, 3, equalTo("The quick <xxx>brown</xxx> fox"));
727+
assertHighlight(searchResponse, 0, "field1", 1, 3, equalTo(" jumps over the lazy <xxx>brown</xxx> <xxx>dog</xxx>"));
728+
assertHighlight(searchResponse, 0, "field1", 2, 3, equalTo(" <xxx>dog</xxx> doesn't care"));
729+
730+
// lets be explicit about the order
731+
source = searchSource().query(matchQuery("field1", "brown dog"))
732+
.highlighter(
733+
highlight().highlighterType("plain").field("field1").order("none").preTags("<xxx>").postTags("</xxx>").fragmentSize(25)
734+
);
735+
736+
searchResponse = client().prepareSearch("test").setSource(source).get();
737+
738+
assertHighlight(searchResponse, 0, "field1", 0, 3, equalTo("The quick <xxx>brown</xxx> fox"));
739+
assertHighlight(searchResponse, 0, "field1", 1, 3, equalTo(" jumps over the lazy <xxx>brown</xxx> <xxx>dog</xxx>"));
740+
assertHighlight(searchResponse, 0, "field1", 2, 3, equalTo(" <xxx>dog</xxx> doesn't care"));
741+
}
742+
{
743+
// order by score
744+
SearchSourceBuilder source = searchSource().query(matchQuery("field1", "brown dog"))
745+
.highlighter(
746+
highlight().highlighterType("plain").order("score").field("field1").preTags("<xxx>").postTags("</xxx>").fragmentSize(25)
747+
);
748+
749+
SearchResponse searchResponse = client().prepareSearch("test").setSource(source).get();
750+
751+
assertHighlight(searchResponse, 0, "field1", 0, 3, equalTo(" jumps over the lazy <xxx>brown</xxx> <xxx>dog</xxx>"));
752+
assertHighlight(searchResponse, 0, "field1", 1, 3, equalTo("The quick <xxx>brown</xxx> fox"));
753+
assertHighlight(searchResponse, 0, "field1", 2, 3, equalTo(" <xxx>dog</xxx> doesn't care"));
754+
}
710755
}
711756

712757
public void testFastVectorHighlighter() throws Exception {

server/src/main/java/org/elasticsearch/search/fetch/subphase/highlight/PlainHighlighter.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,9 @@ public HighlightField highlight(FieldHighlightContext fieldContext) throws IOExc
135135
}
136136
}
137137

138-
if (field.fieldOptions().scoreOrdered()) {
139-
CollectionUtil.introSort(fragsList, (o1, o2) -> Math.round(o2.getScore() - o1.getScore()));
138+
// fragments are ordered by score by default since we add them in best
139+
if (field.fieldOptions().scoreOrdered() == false) {
140+
CollectionUtil.introSort(fragsList, (o1, o2) -> o1.getFragNum() - o2.getFragNum());
140141
}
141142
String[] fragments;
142143
// number_of_fragments is set to 0 but we have a multivalued field

0 commit comments

Comments
 (0)