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 相关文章推荐
超级酷和最实用的jQuery实例收集(20个)
Apr 21 Javascript
ajax java 实现自动完成功能
Dec 19 Javascript
js形成页面的一种遮罩效果实例代码
Jan 04 Javascript
AngularJS实践之使用NgModelController进行数据绑定
Oct 08 Javascript
js实时获取窗口大小变化的实例代码
Nov 18 Javascript
JS写XSS cookie stealer来窃取密码的步骤详解
Nov 20 Javascript
javascript按顺序加载运行js方法
Dec 01 Javascript
微信小程序显示下拉列表功能【附源码下载】
Dec 12 Javascript
vuex state及mapState的基础用法详解
Apr 19 Javascript
vue+element树组件 实现树懒加载的过程详解
Oct 21 Javascript
vue element-ui el-date-picker限制选择时间为当天之前的代码
Nov 07 Javascript
VuePress 中如何增加用户登录功能
Nov 29 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 Static关键字实用方法
2010/06/04 PHP
php用正则表达式匹配中文实例详解
2013/11/06 PHP
php编译安装php-amq扩展简明教程
2016/06/25 PHP
JavaScript 开发规范要求(图文并茂)
2010/06/11 Javascript
利用javascript打开模态对话框(示例代码)
2014/01/11 Javascript
js获取当前地址 JS获取当前URL的示例代码
2014/02/26 Javascript
利用函数的惰性载入提高javascript代码执行效率
2014/05/05 Javascript
jQuery中even选择器的定义和用法
2014/12/23 Javascript
jQuery学习笔记之基础中的基础
2015/01/19 Javascript
JQuery分屏指示器图片轮换效果实例
2015/05/21 Javascript
js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)
2015/11/09 Javascript
轻松实现Bootstrap图片轮播
2020/04/20 Javascript
手机浏览器 后退按钮强制刷新页面方法总结
2016/10/09 Javascript
jQuery扩展+xml实现表单验证功能的方法
2016/12/25 Javascript
详解Jquery Easyui的验证扩展
2017/01/09 Javascript
js+css3实现旋转效果
2017/01/20 Javascript
js实现简单的选项卡效果
2017/02/23 Javascript
vue使用axios跨域请求数据问题详解
2017/10/18 Javascript
jQuery滚动条美化插件nicescroll简单用法示例
2018/04/18 jQuery
微信小程序 SOTER 生物认证DEMO 指纹识别功能
2019/12/13 Javascript
[27:08]完美世界DOTA2联赛PWL S2 SZ vs Rebirth 第二场 11.21
2020/11/23 DOTA
Python BeautifulSoup中文乱码问题的2种解决方法
2014/04/22 Python
python使用turtle库绘制时钟
2020/03/25 Python
python+selenium实现自动抢票功能实例代码
2018/11/23 Python
详解python3 + Scrapy爬虫学习之创建项目
2019/04/12 Python
Django获取model中的字段名和字段的verbose_name方式
2020/05/19 Python
搭建pypi私有仓库实现过程详解
2020/11/25 Python
详解CSS3的opacity属性设置透明效果的用法
2016/05/09 HTML / CSS
Homestay中文官网:全球寄宿家庭
2018/10/18 全球购物
介绍java中初始化块的使用
2012/09/11 面试题
给朋友的道歉信
2014/01/09 职场文书
2014年镇党建工作汇报材料
2014/11/02 职场文书
校车司机安全责任书
2015/05/11 职场文书
刑事上诉状(无罪)
2015/05/23 职场文书
2016年世界人口日宣传活动总结
2016/04/05 职场文书
SQL之各种join小结详细讲解
2021/08/04 MySQL