ES6.2.3 restClient API 高亮搜索
话不多说,直接上demo :
package com.test;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.index.query.QueryStringQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import com.alibaba.fastjson.JSON;
import com.bean.RecogcardInfo;
import com.common.ESClientFactory;
public class HighLightTest {
public static void main(String[] args) {
String searchKey = "李四";
RestHighLevelClient restClient = ESClientFactory.getHighLevelClient();
关于restClient 的创建 点击 :RestHighLevelClient
SearchRequest searchRequest = new SearchRequest("index_recogcardinfo").types("doc");
try {
//搜索体(可以添加多个搜索参数)SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
QueryStringQueryBuilder queryBuilder = new QueryStringQueryBuilder(searchKey);
queryBuilder.field("address").field("name");
//构建高亮体
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.preTags("<span style=\"color:red\">");
highlightBuilder.postTags("</span>");
//高亮字段
highlightBuilder.field("address").field("name");
//搜索体(添加多个搜索参数)
searchSourceBuilder.highlighter(highlightBuilder);
searchSourceBuilder.query(queryBuilder);
searchRequest.source(searchSourceBuilder);
searchSourceBuilder.from(page.getPageNum()).size(page.getPageSize());
//执行查询
SearchResponse response = restClient.search(searchRequest);
//获取搜索的文档结果
SearchHits hit = response.getHits();
SearchHit[] hits = hit.getHits();
for (SearchHit searchHit : hits) {
//将文档中的每一个对象转换json串值
String sourceAsString = searchHit.getSourceAsString();
//将json串值转换成对应的实体对象
RecogcardInfo recogcardInfo = JSON.parseObject(sourceAsString, RecogcardInfo.class);
//获取对应的高亮域
Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();
//高亮字段
HighlightField highlightAddress = highlightFields.get("address");
if(highlightAddress!=null){
// 为title串值增加自定义的高亮标签
Text[] titleTexts = highlightAddress.fragments();
String address = "";
for (Text text : titleTexts) {
address += text;
}
//将追加了高亮标签的串值重新填充到对应的对象
recogcardInfo.setAddress(address);
}
HighlightField highlightName = highlightFields.get("name");
if(highlightName!=null){
Text[] titleTexts = highlightName.fragments();
// 为title串值增加自定义的高亮标签
String name = "";
for (Text text : titleTexts) {
name += text;
}
//将追加了高亮标签的串值重新填充到对应的对象
recogcardInfo.setName(name);
}
list.add(recogcardInfo);
System.out.println("list:"+list.toString());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
后记:写这些东西只是为了让给自己做个记录,希望自己能理解的更深刻。如果你看到了这篇博文希望能对你有那么一点帮助,关于里面的注解只是我自己的理解,不正确的地方,请指出。