ES上存在如下数据
如果想查询interest中含有basketball的文档,并对basketball进行高亮,ES查询语句如下
GET my_index/my_type/_search
{
"query": {
"match": {
"interest": "basketball"
}
},
"highlight":{
"fields": {
"interest": {}
}
},
"size": 10
}
从搜索结果中可以看出basketball前后加上了<em></em>,对basketball进行了高亮
下面用JAVA代码实现搜索结果的高亮
1.创建带有高亮的搜索方法,实现高亮可以使用HighlightBuilder
public class ElasticsearchUtils {
private Client client;
public ElasticsearchUtils(String clusterName, String ipAddress) {
Settings settings = ImmutableSettings
.settingsBuilder()
//设置集群名称
.put("cluster.name", clusterName)
.put("client.transport.ignore_cluster_name", false)
.put("node.client", true).put("client.transport.sniff", true)
.build();
client = new TransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress(ipAddress,
9300));
}
/**
* 执行搜索(带高亮)
* @param indexname 索引名称
* @param type 索引类型
* @param queryBuilder 查询条件
* @param highligtFiled 高亮字段
* @return
*/
public SearchResponse searcherHighlight(String indexName, String typeName,
QueryBuilder queryBuilder, String highligtFiled) {
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();//构造搜索对象
searchSourceBuilder.query(queryBuilder);//设置查询条件
//设置高亮
String preTags = "<strong>";
String postTags = "</strong>";
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.preTags(preTags);//设置前缀
highlightBuilder.postTags(postTags);//设置后缀
highlightBuilder.field(highligtFiled);//设置高亮字段
searchSourceBuilder.highlight(highlightBuilder);//设置高亮信息
SearchRequest searchRequest = new SearchRequest(indexName);//创建查询请求对象
searchRequest.types(typeName);//设置type
searchRequest.extraSource(searchSourceBuilder);//设置searchSourceBuilder
SearchResponse searchResponse = client.search(searchRequest)
.actionGet();//执行查询
return searchResponse;
}
}
2.创建测试类
public class HighlightTest {
public static void main(String[] args) {
//创建对象,设置集群名称和IP地址
ElasticsearchUtils es = new ElasticsearchUtils("im_shanmenglu",
"localhost");
String indexName = "my_index";//索引名称
String typeName = "my_type";//类型名称
String highligtFiled = "interest";//设置高亮的字段,此处查询的是interest中含有basketball的文档,因此高亮字段设为interest
QueryBuilder queryBuilder = QueryBuilders.matchQuery("interest",
"basketball");//查询interest中含有basketball的文档
SearchResponse searchResponse = es.searcherHighlight(indexName,
typeName, queryBuilder, highligtFiled);
SearchHits hits = searchResponse.getHits();
SearchHit[] searchHits = hits.getHits();
for (SearchHit searchHit : searchHits) {
Map<String, HighlightField> map = searchHit.getHighlightFields();
System.out.println(map.toString());
}
}
}
searchResponse的结果如下,可以看到highlight中的basketball前后已经加上了设置的前缀和后缀
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 2,
"max_score" : 0.19178301,
"hits" : [ {
"_index" : "my_index",
"_type" : "my_type",
"_id" : "1",
"_score" : 0.19178301,
"_source":{ "name": "a",
"interest": "football basketball"
}
,
"highlight" : {
"interest" : [ "football <strong>basketball</strong>" ]
}
}, {
"_index" : "my_index",
"_type" : "my_type",
"_id" : "2",
"_score" : 0.19178301,
"_source":{ "name": "b",
"interest": "music basketball"
}
,
"highlight" : {
"interest" : [ "music <strong>basketball</strong>" ]
}
} ]
}
}
控制台输出结果如下:
{interest=[interest], fragments[[football <strong>basketball</strong>]]}
{interest=[interest], fragments[[music <strong>basketball</strong>]]}