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 相关文章推荐
JQuery 小练习(实例代码)
Aug 07 Javascript
一个可以兼容IE FF的加为首页与加入收藏实现代码
Nov 02 Javascript
js中的前绑定和后绑定详解
Aug 01 Javascript
下拉列表选择项的选中在不同浏览器中的兼容性问题探讨
Sep 18 Javascript
javascript实现10个球随机运动、碰撞实例详解
Jul 08 Javascript
jQuery实现彩带延伸效果的网页加载条loading动画
Oct 29 Javascript
js自调用匿名函数的三种写法(推荐)
Aug 19 Javascript
微信小程序 向左滑动删除功能的实现
Mar 10 Javascript
使用vue构建一个上传图片表单
Jul 04 Javascript
Bootstrap3.3.7导航栏下拉菜单鼠标滑过展开效果
Oct 31 Javascript
vuejs选中当前样式active的实例
Aug 22 Javascript
vue中组件的3种使用方式详解
Mar 23 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 base64+gzinflate压缩编码和解码代码
2008/10/03 PHP
PHP5.3.1 不再支持ISAPI
2010/01/08 PHP
thinkphp缓存技术详解
2014/12/09 PHP
Yii框架调试心得--在页面输出执行sql语句
2014/12/25 PHP
PHP+Apache+Mysql环境搭建教程
2016/08/01 PHP
Zend Framework入门教程之Zend_Mail用法示例
2016/12/08 PHP
PHP simplexml_load_string()函数实例讲解
2019/02/03 PHP
laravel ORM关联关系中的 with和whereHas用法
2019/10/16 PHP
JavaScript 入门基础知识 想学习js的朋友可以参考下
2009/12/26 Javascript
jQuery each()方法的使用方法
2010/03/18 Javascript
Jquery ajaxsubmit上传图片实现代码
2010/11/04 Javascript
JQuery中getJSON的使用方法
2010/12/13 Javascript
基于jquery的监控数据是否发生改变
2011/04/11 Javascript
event.X和event.clientX的区别分析
2011/10/06 Javascript
javascript淡入淡出效果的实现思路
2012/03/31 Javascript
js判断上传文件的类型和大小示例代码
2013/10/18 Javascript
jquery滚动条插件jScrollPane的使用介绍
2013/11/08 Javascript
原生js和jquery实现图片轮播淡入淡出效果
2015/04/23 Javascript
JavaScript中停止执行setInterval和setTimeout事件的方法
2015/05/14 Javascript
简单封装js的dom查询实例代码
2016/07/08 Javascript
详解Vue中使用v-for语句抛出错误的解决方案
2017/05/04 Javascript
iview tabs 顶部导航栏和模块切换栏的示例代码
2019/03/04 Javascript
深入理解es6块级作用域的使用
2019/03/28 Javascript
[00:42]《辉夜杯》—职业组预选赛12月3日15点 正式打响
2015/12/03 DOTA
Python 错误和异常代码详解
2018/01/29 Python
Django自定义用户登录认证示例代码
2019/06/30 Python
pandas 选取行和列数据的方法详解
2019/08/08 Python
简单易懂Pytorch实战实例VGG深度网络
2019/08/27 Python
python如何通过pyqt5实现进度条
2020/01/20 Python
Python分析最近大火的网剧《隐秘的角落》
2020/07/02 Python
浅析Python 条件控制语句
2020/07/15 Python
美国最大的船只买卖在线市场:Boat Trader
2018/08/04 全球购物
档案工作汇报材料
2014/08/21 职场文书
预备党员的思想汇报,你真的会写吗?
2019/06/28 职场文书
年会邀请函的格式及范文五篇
2019/11/02 职场文书
疑《守望先锋2》A测截图泄露 或将推出新模式、新界面
2022/04/03 其他游戏