HighlightBuilder高亮显示

来源:互联网 发布:手办数据库 编辑:程序博客网 时间:2024/05/29 09:29

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>]]}


0 0
原创粉丝点击