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 相关文章推荐
[原创]后缀就扩展名为js的文件是什么文件
Dec 06 Javascript
jquery.alert 弹出式复选框实现代码
Jun 15 Javascript
JavaScript实现的购物车效果可以运用在好多地方
May 09 Javascript
jquery使用$(element).is()来判断获取的tagName
Aug 24 Javascript
BOM系列第二篇之定时器requestAnimationFrame
Aug 17 Javascript
javascript对浅拷贝和深拷贝的详解
Oct 14 Javascript
Vue.js Ajax动态参数与列表显示实现方法
Oct 20 Javascript
jQuery实现别踩白块儿网页版小游戏
Jan 18 Javascript
解决JS内存泄露之js对象和dom对象互相引用问题
Jun 25 Javascript
javascript History对象原理解析
Feb 17 Javascript
使用Vant完成DatetimePicker 日期的选择器操作
Nov 12 Javascript
vue-cli 3如何使用vue-bootstrap-datetimepicker日期插件
Feb 20 Vue.js
如何通过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入门速成教程
2007/03/19 PHP
浅析PHP中strlen和mb_strlen的区别
2014/08/31 PHP
PHP中is_dir()函数使用指南
2015/05/08 PHP
JavaScript转换农历类实现及调用方法
2013/01/27 Javascript
js使用for循环及if语句判断多个一样的name
2014/09/09 Javascript
Node.js中使用Log.io在浏览器中实时监控日志(等同tail -f命令)
2014/09/17 Javascript
关于javascript事件响应的基础语法总结(必看篇)
2016/12/26 Javascript
学习使用Bootstrap栅格系统
2017/05/11 Javascript
将angular.js项目整合到.net mvc中的方法详解
2017/06/29 Javascript
SpringBoot+Vue开发之Login校验规则、实现登录和重置事件
2020/10/19 Javascript
js实现筛选功能
2020/11/24 Javascript
使用Python编写Linux系统守护进程实例
2015/02/03 Python
Django实现图片文字同时提交的方法
2015/05/26 Python
python在控制台输出进度条的方法
2015/06/20 Python
python实现爬虫下载美女图片
2015/07/14 Python
全面分析Python的优点和缺点
2018/02/07 Python
Python使用Dijkstra算法实现求解图中最短路径距离问题详解
2018/05/16 Python
Python操作word常见方法示例【win32com与docx模块】
2018/07/17 Python
Python 3.x基于Xml数据的Http请求方法
2018/12/28 Python
Opencv+Python实现图像运动模糊和高斯模糊的示例
2019/04/11 Python
详解Python传入参数的几种方法
2019/05/16 Python
pytorch点乘与叉乘示例讲解
2019/12/27 Python
Python unittest 自动识别并执行测试用例方式
2020/03/09 Python
通俗易懂了解Python装饰器原理
2020/09/17 Python
详解HTML5 data-* 自定义属性
2018/01/24 HTML / CSS
英国领先的NHS批准的在线药店:Pharmacy2U
2017/01/06 全球购物
公务员的自我鉴定
2013/10/26 职场文书
三爱活动实施方案
2014/03/19 职场文书
六查六看自查报告
2014/10/14 职场文书
化工见习报告范文
2014/10/31 职场文书
教师群众路线教育实践活动个人对照检查材料
2014/11/04 职场文书
稽核岗位职责范本
2015/04/13 职场文书
导游词之泉州崇武古城
2019/12/20 职场文书
python爬虫之selenium库的安装及使用教程
2021/05/23 Python
浅谈哪个Python库才最适合做数据可视化
2021/06/28 Python
vue组件vue-esign实现电子签名
2022/04/21 Vue.js