2424import org .apache .lucene .search .vectorhighlight .*;
2525import org .elasticsearch .ElasticSearchException ;
2626import org .elasticsearch .common .collect .ImmutableMap ;
27- import org .elasticsearch .common .collect .Tuple ;
2827import org .elasticsearch .index .mapper .DocumentMapper ;
2928import org .elasticsearch .index .mapper .FieldMapper ;
3029import org .elasticsearch .search .SearchHit ;
3534import org .elasticsearch .search .internal .SearchContext ;
3635
3736import java .io .IOException ;
38- import java .util .Arrays ;
3937import java .util .Map ;
4038
41- import static org .elasticsearch .common .collect .Maps .newHashMap ;
39+ import static org .elasticsearch .common .collect .Maps .* ;
4240
4341/**
4442 * @author kimchy (shay.banon)
@@ -57,78 +55,58 @@ public class HighlightPhase implements SearchPhase {
5755 return ;
5856 }
5957
60- Map <Integer ,FastVectorHighlighter > highlighterMap = newHashMap ();
61- Map <Integer ,FieldQuery > fieldQueryMap = newHashMap ();
62-
6358 for (SearchHit hit : context .fetchResult ().hits ().hits ()) {
6459 InternalSearchHit internalHit = (InternalSearchHit ) hit ;
6560
6661 DocumentMapper documentMapper = context .mapperService ().type (internalHit .type ());
6762 int docId = internalHit .docId ();
6863
6964 Map <String , HighlightField > highlightFields = newHashMap ();
70- for (SearchContextHighlight .ParsedHighlightField parsedHighlightField : context .highlight ().fields ()) {
71- String fieldName = parsedHighlightField .field ();
72- FieldMapper mapper = documentMapper .mappers ().smartNameFieldMapper (parsedHighlightField .field ());
65+ for (SearchContextHighlight .Field field : context .highlight ().fields ()) {
66+ String fieldName = field .field ();
67+ FieldMapper mapper = documentMapper .mappers ().smartNameFieldMapper (field .field ());
7368 if (mapper != null ) {
7469 fieldName = mapper .names ().indexName ();
7570 }
7671
77- Tuple <Integer ,FastVectorHighlighter > highlighterTuple = getHighlighter (highlighterMap , parsedHighlightField .settings ());
78- FastVectorHighlighter highlighter = highlighterTuple .v2 ();
79- FieldQuery fieldQuery = getFieldQuery (highlighterTuple .v1 (), fieldQueryMap , highlighter , context .query (), context .searcher ().getIndexReader (), parsedHighlightField .settings ());
80-
72+ FastVectorHighlighter highlighter = buildHighlighter (field );
73+ FieldQuery fieldQuery = buildFieldQuery (highlighter , context .query (), context .searcher ().getIndexReader (), field );
74+
8175 String [] fragments ;
8276 try {
83- fragments = highlighter .getBestFragments (fieldQuery , context .searcher ().getIndexReader (), docId , fieldName , parsedHighlightField . settings (). fragmentCharSize (), parsedHighlightField . settings () .numberOfFragments ());
77+ fragments = highlighter .getBestFragments (fieldQuery , context .searcher ().getIndexReader (), docId , fieldName , field . fragmentCharSize (), field .numberOfFragments ());
8478 } catch (IOException e ) {
85- throw new FetchPhaseExecutionException (context , "Failed to highlight field [" + parsedHighlightField .field () + "]" , e );
79+ throw new FetchPhaseExecutionException (context , "Failed to highlight field [" + field .field () + "]" , e );
8680 }
87- HighlightField highlightField = new HighlightField (parsedHighlightField .field (), fragments );
81+ HighlightField highlightField = new HighlightField (field .field (), fragments );
8882 highlightFields .put (highlightField .name (), highlightField );
8983 }
9084
9185 internalHit .highlightFields (highlightFields );
9286 }
9387 }
9488
95- private FieldQuery getFieldQuery (int key , Map <Integer ,FieldQuery > fieldQueryMap , FastVectorHighlighter highlighter , Query query , IndexReader indexReader , SearchContextHighlight .ParsedHighlightSettings settings ) {
96- FieldQuery fq = fieldQueryMap .get (key );
97- if (fq == null ) {
98- CustomFieldQuery .reader .set (indexReader );
99- CustomFieldQuery .highlightFilters .set (settings .highlightFilter ());
100- fq = new CustomFieldQuery (query , highlighter );
101- fieldQueryMap .put (key ,fq );
102- }
103- return fq ;
89+ private FieldQuery buildFieldQuery (FastVectorHighlighter highlighter , Query query , IndexReader indexReader , SearchContextHighlight .Field field ) {
90+ CustomFieldQuery .reader .set (indexReader );
91+ CustomFieldQuery .highlightFilters .set (field .highlightFilter ());
92+ return new CustomFieldQuery (query , highlighter );
10493 }
10594
106- private Tuple <Integer , FastVectorHighlighter > getHighlighter (Map <Integer ,FastVectorHighlighter > highlighterMap , SearchContextHighlight .ParsedHighlightSettings settings ) {
107-
95+ private FastVectorHighlighter buildHighlighter (SearchContextHighlight .Field field ) {
10896 FragListBuilder fragListBuilder ;
10997 FragmentsBuilder fragmentsBuilder ;
110- if (! settings . fragmentsAllowed () ) {
98+ if (field . numberOfFragments () == 0 ) {
11199 fragListBuilder = new SingleFragListBuilder ();
112- fragmentsBuilder = new SimpleFragmentsBuilder (settings .preTags (), settings .postTags ());
100+ fragmentsBuilder = new SimpleFragmentsBuilder (field .preTags (), field .postTags ());
113101 } else {
114102 fragListBuilder = new SimpleFragListBuilder ();
115- if (settings .scoreOrdered ()) {
116- fragmentsBuilder = new ScoreOrderFragmentsBuilder (settings .preTags (), settings .postTags ());
103+ if (field .scoreOrdered ()) {
104+ fragmentsBuilder = new ScoreOrderFragmentsBuilder (field .preTags (), field .postTags ());
117105 } else {
118- fragmentsBuilder = new SimpleFragmentsBuilder (settings .preTags (), settings .postTags ());
106+ fragmentsBuilder = new SimpleFragmentsBuilder (field .preTags (), field .postTags ());
119107 }
120108 }
121109
122- // highlighter key is determined by tags and FragList and Fragment builder classes.
123- String [] mask = Arrays .copyOf (settings .preTags (), settings .preTags ().length + settings .postTags ().length );
124- System .arraycopy (settings .postTags (), 0 , mask , settings .preTags ().length , settings .postTags ().length );
125- int key = (Arrays .toString (mask )+fragListBuilder .getClass ().getSimpleName ()+fragmentsBuilder .getClass ().getSimpleName ()).hashCode ();
126-
127- FastVectorHighlighter highlighter = highlighterMap .get (key );
128- if (highlighter == null ) {
129- highlighter = new FastVectorHighlighter (true , false , fragListBuilder , fragmentsBuilder );
130- highlighterMap .put (key ,highlighter );
131- }
132- return Tuple .tuple (key , highlighter );
110+ return new FastVectorHighlighter (true , false , fragListBuilder , fragmentsBuilder );
133111 }
134112}
0 commit comments