Elasticsearch实现复合查询高亮结果功能


Posted in Javascript onSeptember 10, 2019

一.Es的配置

实现es的全文检索功能的第一步,首先从与es进行连接开始,这里我使用的是es的5.x java api语法.

public TransportClient esClient() throws UnknownHostException{
    Settings settings = Settings.builder()
        .put("cluster.name", "my-application") //节点的名字
        .put("client.transport.sniff", true)
        .build();
    
    InetSocketTransportAddress iAddress = new InetSocketTransportAddress( //连接es的ip地址和端口号
        InetAddress.getByName("127.0.0.1"),9300
        );
    
    //根据先前的配置生成client,后面的操作基本都是基于这个
    TransportClient client = new PreBuiltTransportClient(settings)
        .addTransportAddress(iAddress);
    return client;
  }

二.功能的实现

以下是全文检索的核心代码,包括我遇到的错误以及解决,包括如何对高亮失效,高亮不全等的解决.

1.查询条件

TransportClient esClient = esClient();  //获取先前生成的client
    BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); //生成复合查询构造器
    
    boolQuery.mustNot(
        QueryBuilders.matchQuery("",) //字段必须不包含啥 
        );
    
    boolQuery.should(
        QueryBuilders.matchQuery(, )  //字段可以包含啥,相当于或者
        );

    boolQuery.must(
        QueryBuilders.matchQuery(,) //字段必须包含啥
        );

2.高亮条件

//配置标题高亮显示
    HighlightBuilder highlightBuilder = new HighlightBuilder(); //生成高亮查询器
    highlightBuilder.field(title);   //高亮查询字段
    highlightBuilder.field(content);  //高亮查询字段
    highlightBuilder.requireFieldMatch(false);   //如果要多个字段高亮,这项要为false
    highlightBuilder.preTags("<span style=\"color:red\">");  //高亮设置
    highlightBuilder.postTags("</span>");
    //下面这两项,如果你要高亮如文字内容等有很多字的字段,必须配置,不然会导致高亮不全,文章内容缺失等
    highlightBuilder.fragmentSize(800000); //最大高亮分片数
    highlightBuilder.numOfFragments(0); //从第一个分片获取高亮片段

3.查询配置

// 根据字段进行排序,这里我根据时间进行倒排
FieldSortBuilder timeSort = SortBuilders.fieldSort("time").order(SortOrder.DESC); 
     
    //查询请求生成
    SearchRequestBuilder requestBuilder = esClient.prepareSearch(indexname)//索引名字
            .setTypes(indextype)   //索引类型
            .setQuery(boolQuery)   //配置查询条件
            .addSort(new ScoreSortBuilder())  //根据查询相关度进行排序
            .addSort(timeSort)         //再根据时间进行排序
            .setTrackScores(true)       //避免分页之后相关性乱了
            .highlighter(highlightBuilder)   //配置高亮
            .setFrom(from)         //设置分页
            .setSize();

4.获取查询结果对其高亮

   

//获取查询结果
    SearchResponse searchResponse = requestBuilder.get();
    List<Map<String, Object>> course = new ArrayList<>(); 
    if(searchResponse.status() != RestStatus.OK){
      return course;
    }
    for(SearchHit hit:searchResponse.getHits()){
      //获取高亮字段
      Map<String, HighlightField> highlightFields = hit.getHighlightFields();
      HighlightField titleField = highlightFields.get("");
      HighlightField contentField = highlightFields.get("");
      Map<String, Object> source = hit.getSource();
      //千万记得要记得判断是不是为空,不然你匹配的第一个结果没有高亮内容,那么就会报空指针异常,这个错误一开始真的搞了很久
      if(titleField!=null){
        Text[] fragments = titleField.fragments(); 
        String name = "";
        for (Text text : fragments) {
        name+=text;
        }
        source.put("", name);  //高亮字段替换掉原本的内容
        }
      course.add(source);
    }
    esClient.close();   //用完记得关闭
    return course;

三.结语

这样前端所获取结果的搜索内容将会被<span style="color:red;"></span>所包含,比如我前端是微信小程序,所以直接获取内容进行渲染的话,就是一堆字符串,所以用的是小程序的富文本标签<rich-text>.

总结

以上所述是小编给大家介绍的Elasticsearch实现复合查询高亮结果功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
JavaScript 高效运行代码分析
Mar 18 Javascript
JavaScript设计模式之抽象工厂模式介绍
Dec 28 Javascript
深入理解jQuery中的事件冒泡
May 24 Javascript
jQuery图片左右滚动代码 有左右按钮实例
Jun 20 Javascript
漂亮! js实现颜色渐变效果
Aug 12 Javascript
JS常见疑难点分析之match,charAt,charCodeAt,map,search用法分析
Dec 25 Javascript
js实现背景图自适应窗口大小
Jan 10 Javascript
js通过指定下标或指定元素进行删除数组的实例
Jan 12 Javascript
微信小程序 生命周期和页面的生命周期详细介绍
Jan 19 Javascript
对于防止按钮重复点击的尝试详解
Apr 22 Javascript
js计时事件实现圆形时钟
Mar 25 Javascript
Element Alert警告的具体使用方法
Jul 27 Javascript
如何通过shell脚本自动生成vue文件详解
Sep 10 #Javascript
js获取 gif 的帧数的代码实例
Sep 10 #Javascript
微信小程序实现pdf、word等格式文件上传的方法
Sep 10 #Javascript
js中console在一行内打印字符串和对象的方法
Sep 10 #Javascript
layui表格内放置图片,并点击放大的实例
Sep 10 #Javascript
layui监听工具栏的实例(操作列表按钮)
Sep 10 #Javascript
es6中reduce的基本使用方法
Sep 10 #Javascript
You might like
php中使用getimagesize获取图片、flash等文件的尺寸信息实例
2014/04/29 PHP
php上传图片客户端和服务器端实现方法
2015/03/30 PHP
php使用PDO执行SQL语句的方法分析
2017/02/16 PHP
jquery的ajax()函数传值中文乱码解决方法介绍
2012/11/08 Javascript
javascript对select标签的控制(option选项/select)
2013/01/31 Javascript
Android中的jQuery:AQuery简介
2014/05/06 Javascript
JavaScript获取当前网页标题(title)的方法
2015/04/03 Javascript
JavaScript编写推箱子游戏
2015/07/07 Javascript
Node.js环境下编写爬虫爬取维基百科内容的实例分享
2016/06/12 Javascript
js实现登录验证码
2016/12/22 Javascript
用jQuery实现优酷首页轮播图
2017/01/09 Javascript
JavaScript轮播图简单制作方法
2017/02/20 Javascript
基于JavaScript实现表格滚动分页
2017/11/22 Javascript
JS获取动态添加元素的方法详解
2019/07/31 Javascript
[14:21]VICI vs EG (BO3)
2018/06/07 DOTA
Python中用max()方法求最大值的介绍
2015/05/15 Python
python中enumerate函数遍历元素用法分析
2016/03/11 Python
Python检测网络延迟的代码
2018/05/15 Python
python3.5基于TCP实现文件传输
2020/03/20 Python
python判断单向链表是否包括环,若包含则计算环入口的节点实例分析
2019/10/23 Python
浅析python内置模块collections
2019/11/15 Python
浅谈matplotlib.pyplot与axes的关系
2020/03/06 Python
Python实现加密的RAR文件解压的方法(密码已知)
2020/09/11 Python
美国南部最大的家族百货公司:Belk
2017/01/30 全球购物
倩碧澳大利亚官网:Clinique澳大利亚
2019/07/22 全球购物
自我评价格式
2014/01/06 职场文书
采购经理岗位职责
2014/02/16 职场文书
黄金酒广告词
2014/03/21 职场文书
科级干部群众路线教育实践活动个人对照检查材料
2014/09/19 职场文书
代办社保委托书范文
2014/10/06 职场文书
隐形的翅膀观后感
2015/06/10 职场文书
2016大学生优秀志愿者事迹材料
2016/02/25 职场文书
股权投资协议书
2016/03/23 职场文书
详解JAVA的控制语句
2021/11/11 Java/Android
MySQL窗口函数的具体使用
2021/11/17 MySQL
MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法
2022/04/18 MySQL