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在XHTML中的用法详解
Apr 11 Javascript
jQuery固定元素插件scrolltofixed使用指南
Apr 21 Javascript
jQuery实现仿百度首页滑动伸缩展开的添加服务效果代码
Sep 09 Javascript
Vue.js组件使用开发实例教程
Nov 01 Javascript
解决jquery appaend元素中id绑定事件失效的问题
Sep 12 jQuery
Thinkphp5微信小程序获取用户信息接口的实例详解
Sep 26 Javascript
js实现扫雷小程序的示例代码
Sep 27 Javascript
node.js操作MongoDB的实例详解
Oct 11 Javascript
Vue2.0系列之过滤器的使用
Mar 01 Javascript
24个解决实际问题的ES6代码片段(小结)
Feb 02 Javascript
vue-resourc发起异步请求的方法
Feb 11 Javascript
vue监听dom大小改变案例
Jul 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面向对象之多态
2014/08/20 PHP
Yii操作数据库实现动态获取表名的方法
2016/03/29 PHP
详解PHP原生DOM对象操作XML的方法
2016/10/17 PHP
laravel 创建命令行命令的图文教程
2019/10/23 PHP
提交表单时执行func方法实现代码
2013/03/17 Javascript
jquery和javascript的区别(常用方法比较)
2013/07/04 Javascript
js动态生成Html元素实现Post操作(createElement)
2015/09/14 Javascript
学习JavaScript设计模式(代理模式)
2015/12/03 Javascript
完美解决jQuery fancybox ie 无法显示关闭按钮的问题
2016/11/29 Javascript
微信小程序之ES6与事项助手的功能实现
2016/11/30 Javascript
jQuery Validate 数组 全部验证问题
2017/01/12 Javascript
AngularJS之页面跳转Route实例代码
2017/03/10 Javascript
ES6新特性二:Iterator(遍历器)和for-of循环详解
2017/04/20 Javascript
微信提示 在浏览器打开 效果实现过程解析
2019/09/10 Javascript
详解react组件通讯方式(多种)
2020/05/06 Javascript
JQuery通过键盘控制键盘按下与松开触发事件
2020/08/07 jQuery
vue中路由跳转不计入history的操作
2020/09/21 Javascript
ant-design表单处理和常用方法及自定义验证操作
2020/10/27 Javascript
解决vant框架做H5时踩过的坑(下拉刷新、上拉加载等)
2020/11/11 Javascript
[44:04]OG vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
使用python提取html文件中的特定数据的实现代码
2013/03/24 Python
python 递归深度优先搜索与广度优先搜索算法模拟实现
2018/10/22 Python
python将字母转化为数字实例方法
2019/10/04 Python
TensorFlow2.X使用图片制作简单的数据集训练模型
2020/04/08 Python
Python常驻任务实现接收外界参数代码解析
2020/07/21 Python
Under Armour安德玛英国官网:美国高端运动科技品牌
2018/09/17 全球购物
如何防止同一个帐户被多人同时登录
2013/08/01 面试题
派出所所长先进事迹
2014/05/19 职场文书
李开复演讲稿
2014/05/24 职场文书
2014年度安全生产目标管理责任书
2014/07/25 职场文书
2014和解协议书范文
2014/09/15 职场文书
《改造我们的学习》心得体会
2014/11/07 职场文书
建筑安全员岗位职责
2015/02/15 职场文书
宣传委员竞选稿
2015/11/19 职场文书
vue引入Excel表格插件的方法
2021/04/28 Vue.js
教你怎么用python实现字符串转日期
2021/05/24 Python