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解析XML的实现代码
Nov 12 Javascript
js实现的真正的iframe高度自适应(兼容IE,FF,Opera)
Mar 07 Javascript
javascript权威指南 学习笔记之变量作用域分享
Sep 28 Javascript
探讨JavaScript中声明全局变量三种方式的异同
Dec 03 Javascript
javascript实现简单的Map示例介绍
Dec 23 Javascript
分享几种比较简单实用的JavaScript tabel切换
Dec 31 Javascript
JavaScript 数组- Array的方法总结(推荐)
Jul 21 Javascript
微信小程序 循环及嵌套循环的使用总结
Sep 26 Javascript
将jquery.qqFace.js表情转换成微信的字符码
Dec 01 jQuery
postman+json+springmvc测试批量添加实例
Mar 31 Javascript
解决vue项目F5刷新mounted里的函数不执行问题
Nov 05 Javascript
js实现验证码功能
Jul 24 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 星际争霸
使用PHP导出Word文档的原理和实例
2013/10/21 PHP
PHP不用递归实现无限分级的例子分享
2014/04/18 PHP
Yii框架中jquery表单验证插件用法示例
2016/10/18 PHP
php求斐波那契数的两种实现方式【递归与递推】
2019/09/09 PHP
PHP7 安装event扩展的实现方法
2019/10/08 PHP
jQuery的写法不同导致的兼容性问题的解决方法
2010/07/29 Javascript
jQuery学习笔记之 Ajax操作篇(三) - 过程处理
2014/06/23 Javascript
浅谈JavaScript的事件
2015/02/27 Javascript
理解JavaScript中worker事件api
2015/12/25 Javascript
JS实现iframe自适应高度的方法(兼容IE与FireFox)
2016/06/24 Javascript
EasyUI中在表单提交之前进行验证
2016/07/19 Javascript
VueJS如何引入css或者less文件的一些坑
2017/04/25 Javascript
JS中定位 position 的使用实例代码
2017/08/06 Javascript
Three.js利用顶点绘制立方体的方法详解
2017/09/27 Javascript
了解javascript中let和var及const关键字的区别
2019/05/24 Javascript
JavaScript中Dom操作实例详解
2019/07/08 Javascript
解决layer图标icon不加载的问题
2019/09/04 Javascript
对Layer弹窗使用及返回数据接收的实例详解
2019/09/26 Javascript
javascript设计模式 ? 桥接模式原理与应用实例分析
2020/04/13 Javascript
封装 axios+promise通用请求函数操作
2020/08/11 Javascript
[07:01]DOTA2-DPC中国联赛正赛 Aster vs Magma 3月5日 赛后选手采访
2021/03/11 DOTA
在python2.7中用numpy.reshape 对图像进行切割的方法
2018/12/05 Python
Python创建字典的八种方式
2019/02/27 Python
如何通过50行Python代码获取公众号全部文章
2019/07/12 Python
面向新手解析python Beautiful Soup基本用法
2020/07/11 Python
详解CSS3的box-shadow属性制作边框阴影效果的方法
2016/05/10 HTML / CSS
如何在Cookie里面保存Unicode和国际化字符
2013/05/25 面试题
大学生饮食连锁店创业计划书
2014/01/17 职场文书
植树节口号
2014/06/21 职场文书
领导干部个人对照检查材料(群众路线)
2014/09/26 职场文书
2014年技术工作总结范文
2014/11/20 职场文书
大学军训心得体会800字
2016/01/11 职场文书
《赵州桥》教学反思
2016/02/17 职场文书
小程序教您怎样你零成本推广获取数万用户的方法
2019/07/30 职场文书
spring项目中切面及AOP的使用方法
2021/06/26 Java/Android