|
4 | 4 | import org.elasticsearch.action.search.SearchRequestBuilder;
|
5 | 5 | import org.elasticsearch.action.support.IndicesOptions;
|
6 | 6 | import org.elasticsearch.client.Client;
|
| 7 | +import org.elasticsearch.search.highlight.HighlightBuilder; |
7 | 8 | import org.nlpcn.es4sql.domain.Query;
|
8 | 9 | import org.nlpcn.es4sql.domain.Select;
|
9 | 10 | import org.nlpcn.es4sql.domain.hints.Hint;
|
10 | 11 | import org.nlpcn.es4sql.domain.hints.HintType;
|
11 | 12 | import org.nlpcn.es4sql.exception.SqlParseException;
|
12 | 13 |
|
13 | 14 | import java.util.ArrayList;
|
| 15 | +import java.util.Map; |
14 | 16 |
|
15 | 17 | /**
|
16 | 18 | * Abstract class. used to transform Select object (Represents SQL query) to
|
@@ -46,8 +48,87 @@ protected void updateRequestWithIndexAndRoutingOptions(Select select, SearchRequ
|
46 | 48 | }
|
47 | 49 |
|
48 | 50 |
|
| 51 | + protected void updateRequestWithHighlight(Select select, SearchRequestBuilder request) { |
49 | 52 |
|
50 |
| - /** |
| 53 | + //? here Map<String,Object> HEIGHLIGHT('field',JSON) ? |
| 54 | + |
| 55 | + for(Hint hint : select.getHints()){ |
| 56 | + if(hint.getType() == HintType.HIGHLIGHT){ |
| 57 | + HighlightBuilder.Field highlightField = parseHeiglightField(hint.getParams()); |
| 58 | + if(highlightField != null){ |
| 59 | + request.addHighlightedField(highlightField); |
| 60 | + } |
| 61 | + } |
| 62 | + } |
| 63 | + } |
| 64 | + |
| 65 | + protected HighlightBuilder.Field parseHeiglightField(Object[] params) |
| 66 | + { |
| 67 | + if(params == null || params.length == 0 || params.length > 2){ |
| 68 | + //todo: exception. |
| 69 | + } |
| 70 | + HighlightBuilder.Field field = new HighlightBuilder.Field(params[0].toString()); |
| 71 | + if(params.length == 1){ |
| 72 | + return field; |
| 73 | + } |
| 74 | + Map<String,Object> heighlightParams = (Map<String,Object>) params[1]; |
| 75 | + |
| 76 | + for (Map.Entry<String,Object> param : heighlightParams.entrySet()){ |
| 77 | + switch (param.getKey()){ |
| 78 | + case "boundary_chars": |
| 79 | + //todo: array. |
| 80 | + field.boundaryChars((char[]) param.getValue()); |
| 81 | + break; |
| 82 | + case "boundary_max_scan": |
| 83 | + field.boundaryMaxScan((Integer) param.getValue()); |
| 84 | + break; |
| 85 | + case "force_source": |
| 86 | + field.forceSource((Boolean) param.getValue()); |
| 87 | + break; |
| 88 | + case "fragmenter": |
| 89 | + field.fragmenter((String) param.getValue()); |
| 90 | + break; |
| 91 | + case "fragment_offset": |
| 92 | + field.fragmentOffset((Integer) param.getValue()); |
| 93 | + break; |
| 94 | + case "fragment_size": |
| 95 | + field.fragmentSize((Integer) param.getValue()); |
| 96 | + break; |
| 97 | + case "highlight_filter": |
| 98 | + field.highlightFilter((Boolean) param.getValue()); |
| 99 | + break; |
| 100 | + case "matched_fields": |
| 101 | + field.matchedFields((String[]) param.getValue()); |
| 102 | + break; |
| 103 | + case "no_match_size": |
| 104 | + field.noMatchSize((Integer) param.getValue()); |
| 105 | + break; |
| 106 | + case "num_of_fragments": |
| 107 | + field.numOfFragments((Integer) param.getValue()); |
| 108 | + break; |
| 109 | + case "order": |
| 110 | + field.order((String) param.getValue()); |
| 111 | + break; |
| 112 | + case "phrase_limit": |
| 113 | + field.phraseLimit((Integer) param.getValue()); |
| 114 | + break; |
| 115 | + case "post_tags": |
| 116 | + field.postTags((String[]) param.getValue()); |
| 117 | + break; |
| 118 | + case "pre_tags": |
| 119 | + field.preTags((String[]) param.getValue()); |
| 120 | + break; |
| 121 | + case "require_field_match": |
| 122 | + field.requireFieldMatch((Boolean) param.getValue()); |
| 123 | + break; |
| 124 | + |
| 125 | + } |
| 126 | + } |
| 127 | + return field; |
| 128 | + } |
| 129 | + |
| 130 | + |
| 131 | + /** |
51 | 132 | * Prepare the request, and return ES request.
|
52 | 133 | * @return ActionRequestBuilder (ES request)
|
53 | 134 | * @throws SqlParseException
|
|
0 commit comments