Elasticsearch实现复合查询高亮结果功能

所属分类: 网络编程 / JavaScript 阅读数: 1746
收藏 0 赞 0 分享

一.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实现复合查询高亮结果功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

更多精彩内容其他人还在看

基于jquery封装的一个js分页

基于jquery封装的一个js分页代码,需要的朋友可以参考下。
收藏 0 赞 0 分享

关于js datetime的那点事

关于js datetime的一些使用经验分享,想要了解datetime日期操作的朋友可以参考下。
收藏 0 赞 0 分享

js 关于=+与+=日期函数使用说明(赋值运算符)

js 关于=+与+=日期函数使用说明(赋值运算符),可以看下,就是一些运算符的使用,看哪个更适合你。
收藏 0 赞 0 分享

JS 操作符整理[推荐收藏]

JS 操作符主要包括算术运算符,赋值运算符,比较(关系)运算符,逻辑运算符,串符(连接作用),条件运算符等
收藏 0 赞 0 分享

让html的text输入框只能输入数字和1个小数点(0-59之间可改)

今天有同事需要这个功能,主要是限制用户输入不符合规范的数字与小数点导致不好计算价格问题,特整理了下面的代码,需要的朋友可以参考下。
收藏 0 赞 0 分享

Jquery 获取checkbox的checked问题

这个郁闷了,今天写这个功能的时候发现了问题,上网找了好多资料对照,更加纠结
收藏 0 赞 0 分享

jQuery EasyUI API 中文文档 - DataGrid数据表格

jQuery EasyUI API 中文文档 - DataGrid数据表格使用说明,需要的朋友可以参考下。
收藏 0 赞 0 分享

jQuery EasyUI API 中文文档 - PropertyGrid属性表格

jQuery EasyUI API 中文文档 - PropertyGrid属性表格使用介绍,需要的朋友可以参考下。
收藏 0 赞 0 分享

20款效果非常棒的 jQuery 插件小结分享

这篇文章向大家推荐20款效果非常棒的 jQuery 插件。jQuery 是一个非常优秀的JavaScript库,它简化了 HTML 文档遍历,事件处理,动画以及 Ajax 交互,同时也改变了很多人编写 JavaScript 代码的方式
收藏 0 赞 0 分享

基于Jquery插件开发之图片放大镜效果(仿淘宝)

公司某个网站,需要实现图片预览效果,并能像淘宝一样实现局部分大,使用jquery的朋友可以参考下。
收藏 0 赞 0 分享
查看更多