elasticsearch 如何设置高亮显示 ?

简介: 许多应用都倾向于在每个搜索结果中 高亮 显示搜索的关键词,比如字体的加粗,改变字体的颜色等.以便让用户知道为何该文档符合查询条件。在 Elasticsearch 中检索出高亮片段也很容易。 为了执行突出显示,需要该字段的实际内容。如果存储了相关字段(已 在映射中store设置true),则将使用_source该字段,否则将加载实际字段并从中提取相关字段。
+关注继续查看

高亮搜索:

许多应用都倾向于在每个搜索结果中 高亮 显示搜索的关键词,比如字体的加粗,改变字体的颜色等.以便让用户知道为何该文档符合查询条件。在 Elasticsearch 中检索出高亮片段也很容易。


为了执行突出显示,需要该字段的实际内容。如果存储了相关字段(已 在映射中store设置true),则将使用_source该字段,否则将加载实际字段并从中提取相关字段。


该_all字段无法从中提取_source,因此只有在映射为已store设置的情况下才能用于突出显示true。


在执行语句的前面,增加一个新的 highlight 参数:


GET /megacorp/employee/_search
{
    "query" : {
        "match_phrase" : {
            "about" : "rock climbing"
        }
    },
    "highlight": {
        "fields" : {
            "about" : {}
        }
    }
}


当执行该查询时,返回结果与之前一样,与此同时结果中还多了一个叫做 highlight 的部分。这个部分包含了 about 属性匹配的文本片段,并以 HTML 标签 <em></em> 封装:


{
   ...
   "hits": {
      "total":      1,
      "max_score":  0.23013961,
      "hits": [
         {
            ...
            "_score":         0.23013961,
            "_source": {
               "first_name":  "John",
               "last_name":   "Smith",
               "age":         25,
               "about":       "I love to go rock climbing",
               "interests": [ "sports", "music" ]
            },
            "highlight": {
               "about": [
                  "I love to go <em>rock</em> <em>climbing</em>" 
               ]
            }
         }
      ]
   }
}


下面看一下JAVA,API的实现,对title字段返回的结果,高亮显示搜索关键字,也是非常的简单.


package com.bonc.test;
import com.bonc.entity.ParamsEntity;
import net.sf.json.JSONObject;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.Operator;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * es的高亮显示;
 */
public class Test {
    private SearchResponse response = null;
    public String query(TransportClient client, ParamsEntity p) {
        List list = new ArrayList();
        SearchRequestBuilder searchRequestBuilder = client.prepareSearch("").setTypes("");
        searchRequestBuilder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH);
        searchRequestBuilder.setFrom(p.getPage()).setSize(p.getSize()).setExplain(true);
        HighlightBuilder highlightBuilder = new HighlightBuilder().field("title").requireFieldMatch(true);
        highlightBuilder.preTags("<span style=\"color:red\">");
        highlightBuilder.postTags("</span>");
        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
        queryBuilder.must(QueryBuilders.queryStringQuery(p.getTitle()).field("title").defaultOperator(Operator.AND));
        try {
            response = searchRequestBuilder.execute().get();
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("报错了---------------------" + e.getMessage());
        }
        SearchHits hits = response.getHits();
        long totalHits = response.getHits().totalHits;
        for (SearchHit hit : hits) {
            String sourceAsString = hit.getSourceAsString();
            JSONObject jsonObject = JSONObject.fromObject(sourceAsString);
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
            HighlightField title = highlightFields.get("title");
            if (title != null) {
                Text[] fragments = title.fragments();
                String str = "";
                for (Text text : fragments) {
                    str += text;
                }
                jsonObject.put("title", str);
                list.add(jsonObject);
            }
        }
        Map map = new HashMap<String, Object>();
        map.put("total", totalHits);
        map.put("rows", list);
        return JSONObject.fromObject(map).toString();
    }
}
相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
1月前
|
Java Windows
windows设置elasticsearch开机自启
windows设置elasticsearch开机自启
51 0
单机elasticsearch设置远程访问
我这里是在虚拟机安装的es,虚拟机系统用的是优麒麟20.04
|
10月前
|
Java Spring
spring data elasticsearch: 设置保活策略|长时间不连接es,报错超时连接
java client长时间没有连接es后,再次调用访问接口,报错连接超时
914 0
Elasticsearch搜索结果高亮显示highlight
Elasticsearch搜索结果高亮显示highlight
Elasticsearch搜索结果高亮显示highlight
|
缓存 自然语言处理 Java
springboot 2.0集成elasticsearch 7.6.2 (集群)关键字高亮显示(下)
springboot 2.0集成elasticsearch 7.6.2 (集群)关键字高亮显示(下)
151 0
|
SQL 自然语言处理 Java
springboot 2.0集成elasticsearch 7.6.2 (集群)关键字高亮显示(上)
springboot 2.0集成elasticsearch 7.6.2 (集群)关键字高亮显示
143 0
springboot 2.0集成elasticsearch 7.6.2 (集群)关键字高亮显示(上)
Elasticsearch搜索结果高亮显示highlight
Elasticsearch搜索结果高亮显示highlight
141 0
Elasticsearch搜索结果高亮显示highlight
|
关系型数据库 MySQL 索引
Elasticsearch 设置默认值的三种方式
1、实战问题 在使用 Elasticsearch 过程中,不免还会有 Mysql 等关系型数据库的使用痕迹,以下两个都是实战开发问到的问题: Elasticsearch 新增字段,能在 Mapping 设置默认值吗? Elasticsearch 有什么好的方式维护文档的 create_time (创建时间)和 update_time (更新时间)吗? 本文就从 Elasticsearch 默认值的实现方案说开去。
856 1
Elasticsearch 设置默认值的三种方式
|
存储 安全 搜索推荐
Elasticsearch究竟要设置多少分片数?
0、引言 本文翻译自Elasticsearch20170918热乎的官方博客,原作者:Christian Dahlqvist。 在构建Elasticsearch集群的初期如果集群分片设置不合理,可能在项目的中后期就会出现性能问题。
711 0
Elasticsearch究竟要设置多少分片数?
|
Web App开发 安全 数据安全/隐私保护
阿里云Elasticsearch 三大IP设置
容易迷糊的阿里云Elasticsearch 三大IP设置
4416 0
相关产品
云迁移中心
推荐文章
更多