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 相关文章推荐
用Juery网页选项卡实现代码
Jun 13 Javascript
THREE.JS入门教程(6)创建自己的全景图实现步骤
Jan 25 Javascript
jQuery阻止同类型事件小结
Apr 19 Javascript
JQuery设置获取下拉菜单某个选项的值(比较全)
Aug 05 Javascript
JavaScript运行机制之事件循环(Event Loop)详解
Oct 10 Javascript
jQuery simplePage+AJAX plus分页插件用法实例
Feb 17 Javascript
详解vue-router 2.0 常用基础知识点之导航钩子
May 10 Javascript
Avalonjs双向数据绑定与监听的实例代码
Jun 23 Javascript
微信小程序报错:this.setData is not a function的解决办法
Sep 27 Javascript
AngularJS 实现购物车全选反选功能
Oct 24 Javascript
MVVM框架下实现分页功能示例
Jun 14 Javascript
vue如何根据网站路由判断页面主题色详解
Nov 02 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根据IP判断地区名信息的示例代码
2014/03/03 PHP
深入解析contentWindow, contentDocument
2013/07/04 Javascript
JavaScript加入收藏夹功能(兼容IE、firefox、chrome)
2014/05/05 Javascript
JS生成不重复随机数组的函数代码
2014/06/10 Javascript
nodejs爬虫抓取数据之编码问题
2015/07/03 NodeJs
鼠标经过子元素触发mouseout,mouseover事件的解决方案
2015/07/26 Javascript
深入浅析Extjs中store分组功能的使用方法
2016/04/20 Javascript
javascript基本语法
2016/05/31 Javascript
AngularJs基于角色的前端访问控制的实现
2016/11/07 Javascript
解决Js先触发失去焦点事件再执行点击事件的问题
2018/08/30 Javascript
微信小程序基于picker实现级联菜单
2019/02/15 Javascript
为vue项目自动设置请求状态的配置方法
2019/06/09 Javascript
JS实现时间校验的代码
2020/05/25 Javascript
[54:10]完美世界DOTA2联赛PWL S2 Magma vs FTD 第二场 11.29
2020/12/03 DOTA
深入了解Python中pop和remove的使用方法
2018/01/09 Python
Django开发中复选框用法示例
2018/03/20 Python
Python3中在Anaconda环境下安装basemap包
2018/10/21 Python
Python3 列表,数组,矩阵的相互转换的方法示例
2019/08/05 Python
Python列表解析操作实例总结
2020/02/26 Python
Python3爬虫里关于识别微博宫格验证码的知识点详解
2020/07/30 Python
Python OpenCV中的numpy与图像类型转换操作
2020/12/11 Python
微软英国官方网站:Microsoft英国
2016/10/15 全球购物
UGG雪地靴德国官网:UGG德国
2016/11/19 全球购物
.NET面试题:什么是反射
2016/09/30 面试题
作为网站管理者应当如何防范XSS
2014/08/16 面试题
大学生简单自荐信
2013/11/10 职场文书
物业管理员岗位职责范文
2013/11/25 职场文书
开工仪式主持词
2014/03/20 职场文书
成品库仓管员岗位职责
2014/04/06 职场文书
妇联主席先进事迹
2014/05/18 职场文书
公司领导班子四风对照检查材料
2014/09/27 职场文书
2015年党员创先争优承诺书
2015/01/22 职场文书
聋哑人盗窃罪辩护词
2015/05/21 职场文书
新郎结婚感言
2015/07/31 职场文书
《检阅》教学反思
2016/02/22 职场文书
Nginx隐藏式跳转(浏览器URL跳转后保持不变)
2022/04/07 Servers