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实现后台左侧菜单点击上下滑动显示
Apr 11 Javascript
jQuery层次选择器选择元素使用介绍
Apr 18 Javascript
如何创建一个JavaScript弹出DIV窗口层的效果
Sep 25 Javascript
JS中引用百度地图并将百度地图的logo和信息去掉
Sep 29 Javascript
jquery操作select大全
Apr 25 Javascript
JavaScript设计模式之建造者模式介绍
Dec 28 Javascript
javascript实现鼠标移到Image上方时显示文字效果的方法
Aug 07 Javascript
JavaScript实现网站访问次数统计代码
Aug 12 Javascript
canvas实现流星雨的背景效果
Jan 13 Javascript
jQuery实现的手风琴侧边菜单效果
Mar 29 jQuery
angular学习之ngRoute路由机制
Apr 12 Javascript
解决vuex改变了state的值,但是页面没有更新的问题
Nov 12 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设计模式 php实现装饰器模式(decorator)
2015/12/07 PHP
PHP如何将XML转成数组
2016/04/04 PHP
PHP递归获取目录内所有文件的实现方法
2016/11/01 PHP
PHP中静态变量的使用方法实例分析
2016/12/01 PHP
php中try catch捕获异常实例详解
2020/08/06 PHP
用document.documentElement取代document.body的原因分析
2009/11/12 Javascript
JQuery select标签操作代码段
2010/05/16 Javascript
Extjs中TabPane如何嵌套在其他网页中实现思路及代码
2013/01/27 Javascript
js实现div闪烁原理及实现代码
2014/06/24 Javascript
jQuery/CSS3图片特效插件整理推荐
2014/12/07 Javascript
JQuery跳出each循环的方法
2015/04/16 Javascript
浅谈Python Opencv中gamma变换的使用详解
2018/04/02 Python
Python爬虫小技巧之伪造随机的User-Agent
2018/09/13 Python
python 实现数字字符串左侧补零的方法
2018/12/04 Python
python实现控制台打印的方法
2019/01/12 Python
pandas按行按列遍历Dataframe的几种方式
2019/10/23 Python
Python内置加密模块用法解析
2019/11/25 Python
深入理解Tensorflow中的masking和padding
2020/02/24 Python
python 回溯法模板详解
2020/02/26 Python
python matplotlib:plt.scatter() 大小和颜色参数详解
2020/04/14 Python
UI自动化定位常用实现方法代码示例
2020/10/27 Python
html5 更新图片颜色示例代码
2014/07/29 HTML / CSS
Boston Proper官网:美国女装品牌
2017/10/30 全球购物
教师辞职报告范文
2014/01/20 职场文书
留学推荐信中文范文三篇
2014/01/25 职场文书
日本语毕业生自荐信
2014/02/01 职场文书
优秀教师工作感言
2014/02/16 职场文书
2014新年元旦活动策划方案
2014/02/18 职场文书
我们的节日端午节活动方案
2014/03/02 职场文书
大学生活动总结怎么写
2014/04/29 职场文书
英语专业自荐书
2014/06/13 职场文书
2014年超市员工工作总结
2014/11/18 职场文书
化工生产实习心得体会
2016/01/22 职场文书
2016护理专业求职自荐书
2016/01/28 职场文书
社区结对共建协议书
2016/03/23 职场文书
如何把新闻人物写得立体、鲜活?
2019/08/14 职场文书