3333 * <pre>
3434 * highlight : {
3535 * tags_schema : "styled",
36- * pre_Tags : ["tag1", "tag2"],
36+ * pre_tags : ["tag1", "tag2"],
3737 * post_tags : ["tag1", "tag2"],
3838 * order : "score",
39+ * highlight_filter : true,
3940 * fields : {
40- * field1 : { }
41- * field2 : { fragment_size : 100, num_of_fragments : 2 }
41+ * field1 : { },
42+ * field2 : { fragment_size : 100, number_of_fragments : 2 },
43+ * field3 : { number_of_fragments : 5, order : "simple", tags_schema : "styled" },
44+ * field4 : { fragment_type : "content", pre_tags : ["openingTagA", "openingTagB"], post_tags : ["closingTag"] }
4245 * }
4346 * }
4447 * </pre>
@@ -56,17 +59,21 @@ public class HighlighterParseElement implements SearchParseElement {
5659 "<em class=\" hlt7\" >" , "<em class=\" hlt8\" >" , "<em class=\" hlt9\" >" ,
5760 "<em class=\" hlt10\" >"
5861 };
59- public static final String [] STYLED_POST_TAGS = {"</em>" };
60-
62+ private static final String [] STYLED_POST_TAGS = {"</em>" };
6163
6264 @ Override public void parse (XContentParser parser , SearchContext context ) throws Exception {
6365 XContentParser .Token token ;
6466 String topLevelFieldName = null ;
6567 List <SearchContextHighlight .ParsedHighlightField > fields = newArrayList ();
66- String [] preTags = DEFAULT_PRE_TAGS ;
67- String [] postTags = DEFAULT_POST_TAGS ;
68- boolean scoreOrdered = false ;
69- boolean highlightFilter = true ;
68+
69+ String [] globalPreTags = DEFAULT_PRE_TAGS ;
70+ String [] globalPostTags = DEFAULT_POST_TAGS ;
71+ boolean globalScoreOrdered = false ;
72+ boolean globalHighlightFilter = true ;
73+ int globalFragmentSize = 100 ;
74+ int globalNumOfFragments = 5 ;
75+ boolean globalFragmentsAllowed = true ;
76+
7077 while ((token = parser .nextToken ()) != XContentParser .Token .END_OBJECT ) {
7178 if (token == XContentParser .Token .FIELD_NAME ) {
7279 topLevelFieldName = parser .currentName ();
@@ -76,25 +83,31 @@ public class HighlighterParseElement implements SearchParseElement {
7683 while ((token = parser .nextToken ()) != XContentParser .Token .END_ARRAY ) {
7784 preTagsList .add (parser .text ());
7885 }
79- preTags = preTagsList .toArray (new String [preTagsList .size ()]);
86+ globalPreTags = preTagsList .toArray (new String [preTagsList .size ()]);
8087 } else if ("post_tags" .equals (topLevelFieldName ) || "postTags" .equals (topLevelFieldName )) {
8188 List <String > postTagsList = Lists .newArrayList ();
8289 while ((token = parser .nextToken ()) != XContentParser .Token .END_ARRAY ) {
8390 postTagsList .add (parser .text ());
8491 }
85- postTags = postTagsList .toArray (new String [postTagsList .size ()]);
92+ globalPostTags = postTagsList .toArray (new String [postTagsList .size ()]);
8693 }
8794 } else if (token .isValue ()) {
8895 if ("order" .equals (topLevelFieldName )) {
89- scoreOrdered = "score" .equals (parser .text ());
96+ globalScoreOrdered = "score" .equals (parser .text ());
9097 } else if ("tags_schema" .equals (topLevelFieldName ) || "tagsSchema" .equals (topLevelFieldName )) {
9198 String schema = parser .text ();
9299 if ("styled" .equals (schema )) {
93- preTags = STYLED_PRE_TAG ;
94- postTags = STYLED_POST_TAGS ;
100+ globalPreTags = STYLED_PRE_TAG ;
101+ globalPostTags = STYLED_POST_TAGS ;
95102 }
96103 } else if ("highlight_filter" .equals (topLevelFieldName ) || "highlightFilter" .equals (topLevelFieldName )) {
97- highlightFilter = parser .booleanValue ();
104+ globalHighlightFilter = parser .booleanValue ();
105+ } else if ("fragment_size" .equals (topLevelFieldName ) || "fragmentSize" .equals (topLevelFieldName )) {
106+ globalFragmentSize = parser .intValue ();
107+ } else if ("number_of_fragments" .equals (topLevelFieldName ) || "numberOfFragments" .equals (topLevelFieldName )) {
108+ globalNumOfFragments = parser .intValue ();
109+ } else if ("fragment_type" .equals (topLevelFieldName ) || "fragmentType" .equals (topLevelFieldName )) {
110+ globalFragmentsAllowed = !("content" .equals (parser .text ()));
98111 }
99112 } else if (token == XContentParser .Token .START_OBJECT ) {
100113 if ("fields" .equals (topLevelFieldName )) {
@@ -104,28 +117,64 @@ public class HighlighterParseElement implements SearchParseElement {
104117 highlightFieldName = parser .currentName ();
105118 } else if (token == XContentParser .Token .START_OBJECT ) {
106119 String fieldName = null ;
107- int fragmentSize = 100 ;
108- int numOfFragments = 5 ;
120+
121+ int fragmentSize = globalFragmentSize ;
122+ int numOfFragments = globalNumOfFragments ;
123+ boolean highlightFilter = globalHighlightFilter ;
124+ boolean scoreOrdered = globalScoreOrdered ;
125+ boolean fragmentsAllowed = globalFragmentsAllowed ;
126+ String [] preTags = globalPreTags ;
127+ String [] postTags = globalPostTags ;
128+
109129 while ((token = parser .nextToken ()) != XContentParser .Token .END_OBJECT ) {
110130 if (token == XContentParser .Token .FIELD_NAME ) {
111131 fieldName = parser .currentName ();
132+ } else if (token == XContentParser .Token .START_ARRAY ) {
133+ if ("pre_tags" .equals (fieldName ) || "preTags" .equals (fieldName )) {
134+ List <String > preTagsList = Lists .newArrayList ();
135+ while ((token = parser .nextToken ()) != XContentParser .Token .END_ARRAY ) {
136+ preTagsList .add (parser .text ());
137+ }
138+ preTags = preTagsList .toArray (new String [preTagsList .size ()]);
139+ } else if ("post_tags" .equals (fieldName ) || "postTags" .equals (fieldName )) {
140+ List <String > postTagsList = Lists .newArrayList ();
141+ while ((token = parser .nextToken ()) != XContentParser .Token .END_ARRAY ) {
142+ postTagsList .add (parser .text ());
143+ }
144+ postTags = postTagsList .toArray (new String [postTagsList .size ()]);
145+ }
112146 } else if (token .isValue ()) {
113147 if ("fragment_size" .equals (fieldName ) || "fragmentSize" .equals (fieldName )) {
114148 fragmentSize = parser .intValue ();
115149 } else if ("number_of_fragments" .equals (fieldName ) || "numberOfFragments" .equals (fieldName )) {
116150 numOfFragments = parser .intValue ();
151+ } else if ("highlight_filter" .equals (fieldName ) || "highlightFilter" .equals (fieldName )) {
152+ highlightFilter = parser .booleanValue ();
153+ } else if ("score" .equals (fieldName )) {
154+ scoreOrdered = "score" .equals (parser .text ());;
155+ } else if ("fragment_type" .equals (fieldName ) || "fragmentType" .equals (fieldName )) {
156+ fragmentsAllowed = !("content" .equals (parser .text ()));
117157 }
118158 }
119159 }
120- fields .add (new SearchContextHighlight .ParsedHighlightField (highlightFieldName , fragmentSize , numOfFragments ));
160+ fields .add (new SearchContextHighlight .ParsedHighlightField (
161+ highlightFieldName ,
162+ new SearchContextHighlight .ParsedHighlightSettings (
163+ fragmentSize , numOfFragments , preTags , postTags ,
164+ scoreOrdered , highlightFilter , fragmentsAllowed )));
121165 }
122166 }
123167 }
124168 }
125169 }
126- if (preTags != null && postTags == null ) {
127- throw new SearchParseException (context , "Highlighter preTags are set, but postTags are not set" );
170+ if (globalPreTags != null && globalPostTags == null ) {
171+ throw new SearchParseException (context , "Highlighter global preTags are set, but global postTags are not set" );
128172 }
129- context .highlight (new SearchContextHighlight (fields , preTags , postTags , scoreOrdered , highlightFilter ));
173+ context .highlight (new SearchContextHighlight (
174+ fields ,
175+ new SearchContextHighlight .ParsedHighlightSettings (
176+ globalFragmentSize , globalNumOfFragments , globalPreTags , globalPostTags ,
177+ globalScoreOrdered , globalHighlightFilter , globalFragmentsAllowed ))
178+ );
130179 }
131180}
0 commit comments