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 iframe编程相关代码
Dec 28 Javascript
单独使用CKFinder选择图片的方法
Aug 21 Javascript
基于JQuery的访问WebService的代码(可访问Java[Xfire])
Nov 19 Javascript
JS运行耗时操作的延时显示方法
Nov 19 Javascript
DIY jquery plugin - tabs标签切换实现代码
Dec 11 Javascript
Jquery代码实现图片轮播效果(一)
Aug 12 Javascript
js实现适合新闻类图片的轮播效果
Feb 05 Javascript
jQuery中Datatables增加跳转到指定页功能
Feb 08 Javascript
关于jQuery中fade(),show()起始位置的一点小发现
Apr 25 jQuery
使用ajax的post同步执行(实现方法)
Dec 21 Javascript
Vuex的基本概念、项目搭建以及入坑点
Nov 04 Javascript
Vue-cli assets SubDirectory及PublicPath区别详解
Aug 18 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
如何过滤高亮显示非法字符
2006/10/09 PHP
一篇不错的PHP基础学习笔记
2007/03/18 PHP
PHP操作数组的一些函数整理介绍
2011/07/17 PHP
easyui的tabs update正确用法分享
2014/03/21 PHP
thinkphp3.2.2实现生成多张缩略图的方法
2014/12/19 PHP
Yii2使用自带的UploadedFile实现的文件上传
2016/06/20 PHP
详谈php静态方法及普通方法的区别
2016/10/04 PHP
PHP 二维关联数组根据其中一个字段排序(推荐)
2017/04/04 PHP
基于ThinkPHP实现的日历功能实例详解
2017/04/15 PHP
Mootools 1.2教程 输入过滤第一部分(数字)
2009/09/15 Javascript
跟我学Nodejs(一)--- Node.js简介及安装开发环境
2014/05/20 NodeJs
node.js中的http.response.writeHead方法使用说明
2014/12/14 Javascript
jQuery中toggleClass()方法用法实例
2015/01/05 Javascript
JQuery中使文本框获得焦点的方法实例分析
2015/02/28 Javascript
详细探究ES6之Proxy代理
2016/07/22 Javascript
微信小程序之swiper滑动面板用法示例
2018/12/04 Javascript
Postman内建变量常用方法实例解析
2020/07/28 Javascript
Vue基于iview table展示图片实现点击放大
2020/08/05 Javascript
Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容
2018/02/23 Python
对numpy和pandas中数组的合并和拆分详解
2018/04/11 Python
Django框架使用富文本编辑器Uedit的方法分析
2018/07/31 Python
利用Python将数值型特征进行离散化操作的方法
2018/11/06 Python
详解python中sort排序使用
2019/03/23 Python
python循环输出三角形图案的例子
2019/11/22 Python
Python使用matplotlib绘制圆形代码实例
2020/05/27 Python
Python venv虚拟环境配置过程解析
2020/07/08 Python
Python requests接口测试实现代码
2020/09/08 Python
pandas抽取行列数据的几种方法
2020/12/13 Python
Skyscanner台湾:全球知名的旅行比价引擎
2018/07/01 全球购物
上班看电影检讨书
2014/02/12 职场文书
大学生2014全国两会学习心得体会
2014/03/10 职场文书
《三个小伙伴》教学反思
2014/04/11 职场文书
安全生产大检查方案
2014/05/07 职场文书
计划生育宣传标语
2014/06/21 职场文书
2014年幼儿园班级工作总结
2014/12/17 职场文书
机关干部纪律作风整顿心得体会
2016/01/23 职场文书