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以对象为索引的关联数组
Jul 04 Javascript
js和as的稳定传值问题解决
Jul 14 Javascript
IE下写xml文件的两种方式(fso/saveAs)
Aug 05 Javascript
iframe窗口高度自适应的又一个巧妙实现思路
Apr 04 Javascript
angular.element方法汇总
Jan 07 Javascript
JS实现在状态栏显示打字效果完整实例
Nov 02 Javascript
AngularJS+Bootstrap实现多文件上传与管理
Nov 08 Javascript
微信小程序踩坑记录之解决tabBar.list[3].selectedIconPath大小超过40kb
Jul 04 Javascript
Vue配合iView实现省市二级联动的示例代码
Jul 27 Javascript
详解js加减乘除精确计算
Mar 19 Javascript
js 下拉菜单点击旁边收起实现(踩坑记)
Sep 29 Javascript
vue3中轻松实现switch功能组件的全过程
Jan 07 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中的正规表达式(一)
2006/10/09 PHP
优化php效率,提高php性能的一些方法
2011/03/24 PHP
phpstudy默认不支持64位php的解决方法
2017/02/20 PHP
php与js的区别是什么
2013/08/05 Javascript
escape编码与unescape解码汉字出现乱码的解决方法
2014/07/02 Javascript
js和jquery如何获取图片真实的宽度和高度
2014/09/28 Javascript
JavaScript window.location对象
2014/11/14 Javascript
Javascript学习指南
2014/12/01 Javascript
javascript实现超炫的向上滑行菜单实例
2015/08/03 Javascript
原生JS封装ajax 传json,str,excel文件上传提交表单(推荐)
2016/06/21 Javascript
如何用js实现鼠标向上滚动时浮动导航
2016/07/18 Javascript
Vue基于NUXT的SSR详解
2017/10/24 Javascript
JS实现区分中英文并统计字符个数的方法示例
2018/06/09 Javascript
Vue项目环境搭建详细总结
2019/09/26 Javascript
angular异步验证防抖踩坑实录
2019/12/01 Javascript
VUE 直接通过JS 修改html对象的值导致没有更新到数据中解决方法分析
2019/12/02 Javascript
[05:28]刀塔密之一:团结则存
2014/07/03 DOTA
详解Python函数作用域的LEGB顺序
2016/05/14 Python
Python编程pygame模块实现移动的小车示例代码
2018/01/03 Python
Python3.6日志Logging模块简单用法示例
2018/06/14 Python
Python实现拷贝/删除文件夹的方法详解
2018/08/29 Python
python3使用flask编写注册post接口的方法
2018/12/28 Python
Python爬取智联招聘数据分析师岗位相关信息的方法
2019/08/13 Python
python+OpenCV实现车牌号码识别
2019/11/08 Python
CSS3 box-shadow属性实例详解
2020/06/19 HTML / CSS
如何开发一款堪比APP的微信小程序(腾讯内部团队分享)
2016/12/22 HTML / CSS
大二自我鉴定范文
2013/10/05 职场文书
大学生自助营养快餐店创业计划书
2014/01/13 职场文书
《散步》教学反思
2014/03/02 职场文书
《爱如茉莉》教后反思
2014/04/12 职场文书
求职信标题怎么写
2014/05/26 职场文书
学校食堂标语
2014/10/06 职场文书
2014年保卫部工作总结
2014/11/21 职场文书
Vue如何实现组件间通信
2021/05/15 Vue.js
Win11怎么修改电源模式?Win11修改电源模式的方法
2022/04/05 数码科技
Win10加载疑难解答时出错发生意外错误的解决方法
2022/07/07 数码科技