Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 9a55c03

Browse files
committed
highlight field support NLPchina#140
1 parent 2286659 commit 9a55c03

File tree

5 files changed

+61
-18
lines changed

5 files changed

+61
-18
lines changed

src/main/java/org/nlpcn/es4sql/domain/hints/HintFactory.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -69,14 +69,20 @@ public static Hint getHintFromString(String hintAsString) throws SqlParseExcepti
6969
String[] heighlights = getParamsFromHint(hintAsString,"! HIGHLIGHT");
7070
ArrayList hintParams = new ArrayList();
7171
hintParams.add(heighlights[0]);
72-
if(heighlights.length == 2){
73-
String heighlightParam = heighlights[1];
74-
heighlightParam = heighlightParam.replaceAll(" , ", "\n");
72+
if(heighlights.length > 1 ){
73+
StringBuilder builder = new StringBuilder();
74+
for(int i=1;i<heighlights.length;i++){
75+
if(i!=1){
76+
builder.append("\n");
77+
}
78+
builder.append(heighlights[i]);
79+
}
80+
String heighlightParam = builder.toString();
7581
YAMLFactory yamlFactory = new YAMLFactory();
76-
YAMLParser parser1 = null;
82+
YAMLParser yamlParser = null;
7783
try {
78-
parser1 = yamlFactory.createParser(heighlightParam.toCharArray());
79-
YamlXContentParser yamlXContentParser = new YamlXContentParser(parser1);
84+
yamlParser = yamlFactory.createParser(heighlightParam.toCharArray());
85+
YamlXContentParser yamlXContentParser = new YamlXContentParser(yamlParser);
8086
Map<String, Object> map = yamlXContentParser.map();
8187
hintParams.add(map);
8288
} catch (IOException e) {

src/main/java/org/nlpcn/es4sql/query/DefaultQueryAction.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ public SqlElasticSearchRequestBuilder explain() throws SqlParseException {
4848
request.setSearchType(SearchType.DFS_QUERY_THEN_FETCH);
4949
}
5050
updateRequestWithIndexAndRoutingOptions(select, request);
51+
updateRequestWithHighlight(select, request);
5152

5253
SqlElasticSearchRequestBuilder sqlElasticRequestBuilder = new SqlElasticSearchRequestBuilder(request);
5354

src/main/java/org/nlpcn/es4sql/query/QueryAction.java

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package org.nlpcn.es4sql.query;
22

3-
import org.elasticsearch.action.ActionRequestBuilder;
43
import org.elasticsearch.action.search.SearchRequestBuilder;
54
import org.elasticsearch.action.support.IndicesOptions;
65
import org.elasticsearch.client.Client;
@@ -50,19 +49,17 @@ protected void updateRequestWithIndexAndRoutingOptions(Select select, SearchRequ
5049

5150
protected void updateRequestWithHighlight(Select select, SearchRequestBuilder request) {
5251

53-
//? here Map<String,Object> HEIGHLIGHT('field',JSON) ?
54-
5552
for(Hint hint : select.getHints()){
5653
if(hint.getType() == HintType.HIGHLIGHT){
57-
HighlightBuilder.Field highlightField = parseHeiglightField(hint.getParams());
54+
HighlightBuilder.Field highlightField = parseHighlightField(hint.getParams());
5855
if(highlightField != null){
5956
request.addHighlightedField(highlightField);
6057
}
6158
}
6259
}
6360
}
6461

65-
protected HighlightBuilder.Field parseHeiglightField(Object[] params)
62+
protected HighlightBuilder.Field parseHighlightField(Object[] params)
6663
{
6764
if(params == null || params.length == 0 || params.length > 2){
6865
//todo: exception.
@@ -71,13 +68,12 @@ protected HighlightBuilder.Field parseHeiglightField(Object[] params)
7168
if(params.length == 1){
7269
return field;
7370
}
74-
Map<String,Object> heighlightParams = (Map<String,Object>) params[1];
71+
Map<String,Object> highlightParams = (Map<String,Object>) params[1];
7572

76-
for (Map.Entry<String,Object> param : heighlightParams.entrySet()){
73+
for (Map.Entry<String,Object> param : highlightParams.entrySet()){
7774
switch (param.getKey()){
7875
case "boundary_chars":
79-
//todo: array.
80-
field.boundaryChars((char[]) param.getValue());
76+
field.boundaryChars(fromArrayListToCharArray((ArrayList) param.getValue()));
8177
break;
8278
case "boundary_max_scan":
8379
field.boundaryMaxScan((Integer) param.getValue());
@@ -98,7 +94,7 @@ protected HighlightBuilder.Field parseHeiglightField(Object[] params)
9894
field.highlightFilter((Boolean) param.getValue());
9995
break;
10096
case "matched_fields":
101-
field.matchedFields((String[]) param.getValue());
97+
field.matchedFields((String[]) ((ArrayList)param.getValue()).toArray(new String[((ArrayList) param.getValue()).size()]));
10298
break;
10399
case "no_match_size":
104100
field.noMatchSize((Integer) param.getValue());
@@ -113,10 +109,10 @@ protected HighlightBuilder.Field parseHeiglightField(Object[] params)
113109
field.phraseLimit((Integer) param.getValue());
114110
break;
115111
case "post_tags":
116-
field.postTags((String[]) param.getValue());
112+
field.postTags((String[]) ((ArrayList)param.getValue()).toArray(new String[((ArrayList) param.getValue()).size()]));
117113
break;
118114
case "pre_tags":
119-
field.preTags((String[]) param.getValue());
115+
field.preTags((String[]) ((ArrayList)param.getValue()).toArray(new String[((ArrayList) param.getValue()).size()]));
120116
break;
121117
case "require_field_match":
122118
field.requireFieldMatch((Boolean) param.getValue());
@@ -127,6 +123,16 @@ protected HighlightBuilder.Field parseHeiglightField(Object[] params)
127123
return field;
128124
}
129125

126+
private char[] fromArrayListToCharArray(ArrayList arrayList){
127+
char[] chars = new char[arrayList.size()];
128+
int i=0;
129+
for(Object item : arrayList){
130+
chars[i] = item.toString().charAt(0);
131+
i++;
132+
}
133+
return chars;
134+
}
135+
130136

131137
/**
132138
* Prepare the request, and return ES request.

src/test/java/org/nlpcn/es4sql/MainTestSuite.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ public static void setUp() throws Exception {
5050
deleteQuery(TEST_INDEX);
5151
loadBulk("src/test/resources/accounts.json");
5252
loadBulk("src/test/resources/online.json");
53+
preparePhrasesIndex();
5354
loadBulk("src/test/resources/phrases.json");
5455
loadBulk("src/test/resources/dogs.json");
5556
loadBulk("src/test/resources/peoples.json");
@@ -75,6 +76,19 @@ public static void setUp() throws Exception {
7576
System.out.println("Finished the setup process...");
7677
}
7778

79+
private static void preparePhrasesIndex() {
80+
String dataMapping = "{ \"phrase\": {" +
81+
" \"properties\": {\n" +
82+
" \"phrase\": {\n" +
83+
" \"type\": \"string\",\n" +
84+
" \"store\": true\n" +
85+
" }" +
86+
" }"+
87+
" }" +
88+
"}";
89+
client.admin().indices().preparePutMapping(TEST_INDEX).setType("phrase").setSource(dataMapping).execute().actionGet();
90+
}
91+
7892
private static void prepareNestedTypeIndex() {
7993

8094
String dataMapping = "{ \"nestedType\": {\n" +

src/test/java/org/nlpcn/es4sql/QueryTest.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.elasticsearch.indices.IndexMissingException;
1212
import org.elasticsearch.search.SearchHit;
1313
import org.elasticsearch.search.SearchHits;
14+
import org.elasticsearch.search.highlight.HighlightField;
1415
import org.junit.Assert;
1516
import org.junit.Test;
1617
import org.nlpcn.es4sql.domain.Select;
@@ -846,6 +847,21 @@ public void routingRequestMultipleRountings() throws IOException, SqlParseExcept
846847
// }
847848

848849

850+
@Test
851+
public void highlightPreTagsAndPostTags() throws IOException, SqlParseException, SQLFeatureNotSupportedException{
852+
String query = String.format("select /*! HIGHLIGHT(phrase,pre_tags : ['<b>'], post_tags : ['</b>'] ) */ " +
853+
"* from %s/phrase " +
854+
"where phrase like 'fox' " +
855+
"order by _score",TEST_INDEX);
856+
SearchHits hits = query(query);
857+
for (SearchHit hit : hits){
858+
HighlightField phrase = hit.getHighlightFields().get("phrase");
859+
String highlightPhrase = phrase.getFragments()[0].string();
860+
Assert.assertTrue(highlightPhrase.contains("<b>fox</b>"));
861+
}
862+
863+
}
864+
849865
private SearchHits query(String query) throws SqlParseException, SQLFeatureNotSupportedException, SQLFeatureNotSupportedException {
850866
SearchDao searchDao = MainTestSuite.getSearchDao();
851867
SqlElasticSearchRequestBuilder select = (SqlElasticSearchRequestBuilder) searchDao.explain(query).explain();

0 commit comments

Comments
 (0)