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 相关文章推荐
7个Javascript地图脚本整理
Oct 20 Javascript
基于jQuery的图片左右无缝滚动插件
May 23 Javascript
深入理解jQuery中live与bind方法的区别
Dec 18 Javascript
$(&quot;&quot;).click与onclick的区别示例介绍
Sep 25 Javascript
js中 javascript:void(0) 用法详解
Aug 11 Javascript
JS中对象与字符串的互相转换详解
May 20 Javascript
Bootstrap modal使用及点击外部不消失的解决方法
Dec 13 Javascript
JS去除字符串中空格的方法
Feb 14 Javascript
Angular中$broadcast和$emit的使用方法详解
May 22 Javascript
网页中的图片查看器viewjs使用方法
Jul 11 Javascript
React优化子组件render的使用
May 12 Javascript
Fetch超时设置与终止请求详解
May 18 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 计算两个时间戳相隔的时间的函数(小时)
2009/12/18 PHP
php加密算法之实现可逆加密算法和解密分享
2014/01/21 PHP
使用PHP函数scandir排除特定目录
2014/06/12 PHP
javascript之可拖动的iframe效果代码
2008/08/01 Javascript
扩展Jquery插件处理mouseover时内部有子元素时发生样式闪烁
2011/12/08 Javascript
javascript动态加载三
2012/08/22 Javascript
引入autocomplete组件时JS报未结束字符串常量错误
2014/03/19 Javascript
thinkphp 表名 大小写 窍门
2015/02/01 Javascript
node.js学习之交互式解释器REPL详解
2016/12/08 Javascript
BootStrap Datetimepicker 汉化的实现代码
2017/02/10 Javascript
js return返回多个值,通过对象的属性访问方法
2017/02/21 Javascript
jquery实现折叠菜单效果【推荐】
2017/03/08 Javascript
jQuery进阶实践之利用最优雅的方式如何写ajax请求
2017/12/20 jQuery
利用layer实现表单完美验证的方法
2019/09/26 Javascript
一篇超完整的Vue新手入门指导教程
2020/11/18 Vue.js
在Python中操作字典之clear()方法的使用
2015/05/21 Python
Python3中的真除和Floor除法用法分析
2016/03/16 Python
python导入csv文件出现SyntaxError问题分析
2017/12/15 Python
Python3实现的字典遍历操作详解
2018/04/18 Python
python 格式化输出百分号的方法
2019/01/20 Python
详细介绍pandas的DataFrame的append方法使用
2019/07/31 Python
python中property属性的介绍及其应用详解
2019/08/29 Python
Python 元组拆包示例(Tuple Unpacking)
2019/12/24 Python
Keras搭建自编码器操作
2020/07/03 Python
去除python中的字符串空格的简单方法
2020/12/22 Python
使用Python实现音频双通道分离
2020/12/25 Python
让IE6支持css3,让 IE7、IE8 都支持CSS3
2011/10/09 HTML / CSS
CSS3 按钮边框动画的实现
2020/11/12 HTML / CSS
英文自荐信
2013/12/19 职场文书
关于赌博的检讨书
2014/01/08 职场文书
客户服务经理岗位职责
2014/01/29 职场文书
我们的节日中秋节活动总结
2015/03/23 职场文书
2015年反洗钱工作总结
2015/04/25 职场文书
2015年“我们的节日·中秋节”活动总结
2015/07/30 职场文书
利用 SQL Server 过滤索引提高查询语句的性能分析
2021/07/15 SQL Server
SQL注入详解及防范方法
2021/12/06 MySQL