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入门教程(10) 认识其他对象
Jan 31 Javascript
jquery easyui中treegrid用法的简单实例
Feb 18 Javascript
js遍历map javaScript遍历map的简单实现
Aug 26 Javascript
jQuery easyui刷新当前tabs的方法
Sep 23 Javascript
JavaScript基本语法_动力节点Java学院整理
Jun 26 Javascript
vue实现商城上货组件简易版
Nov 27 Javascript
解决使用Vue.js显示数据的时,页面闪现原始代码的问题
Feb 11 Javascript
Material(包括Material Icon)在Angular2中的使用详解
Feb 11 Javascript
Electron + vue 打包桌面操作流程详解
Jun 24 Javascript
jquery树形插件zTree高级使用详解
Aug 16 jQuery
vue使用微信扫一扫功能的实现代码
Apr 11 Javascript
在antd Table中插入可编辑的单元格实例
Oct 28 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
十大催泪虐心动漫电影,有几部你还没看
2020/03/04 日漫
Eclipse中php插件安装及Xdebug配置的使用详解
2013/04/25 PHP
PHP自带方法验证邮箱是否存在
2016/02/01 PHP
php实现简单的权限管理的示例代码
2017/08/25 PHP
jquery 打开窗口返回值实现代码
2010/03/04 Javascript
jQuery EasyUI API 中文文档 - DataGrid数据表格
2011/11/17 Javascript
单击复制文字兼容各浏览器的完美解决方案
2013/07/04 Javascript
浅析document.createDocumentFragment()与js效率
2013/07/08 Javascript
JavaScript实现列表分页功能特效
2015/05/15 Javascript
谷歌Chrome浏览器扩展程序开发小记
2016/01/06 Javascript
实例详解Nodejs 保存 payload 发送过来的文件
2016/01/14 NodeJs
JS实现页面载入时随机显示图片效果
2016/09/07 Javascript
微信小程序使用npm支持踩坑
2018/11/07 Javascript
浅谈Angular7 项目开发总结
2018/12/19 Javascript
jQuery事件模型默认行为执行顺序及trigger()与 triggerHandler()比较实例分析
2020/04/30 jQuery
详解React 元素渲染
2020/07/07 Javascript
Python sys.path详细介绍
2013/10/17 Python
python3模拟百度登录并实现百度贴吧签到示例分享(百度贴吧自动签到)
2014/02/24 Python
简单介绍Python的轻便web框架Bottle
2015/04/08 Python
Python实现简单登录验证
2016/04/13 Python
Python爬虫通过替换http request header来欺骗浏览器实现登录功能
2018/01/07 Python
Python3按一定数据位数格式处理bin文件的方法
2019/01/24 Python
几行Python代码爬取3000+上市公司的信息
2019/01/24 Python
Python中typing模块与类型注解的使用方法
2019/08/05 Python
python区分不同数据类型的方法
2019/10/14 Python
泰国排名第一的家居用品中心:HomePro
2020/11/18 全球购物
物业招聘计划书
2014/01/10 职场文书
《世界多美呀》教学反思
2014/03/02 职场文书
社会实践先进工作者事迹材料
2014/05/06 职场文书
春节联欢会策划方案
2014/05/16 职场文书
大专毕业生自我鉴定范文(2篇)
2014/09/27 职场文书
2014酒店客房部工作总结
2014/12/16 职场文书
Python使用scapy模块发包收包
2021/05/07 Python
简单且有用的Python数据分析和机器学习代码
2021/07/02 Python
python接口测试返回数据为字典取值方式
2022/02/12 Python
RestTemplate如何通过HTTP Basic Auth认证示例说明
2022/03/17 Java/Android