1、分页参数 ,start=(page-1)*size

2、高亮字段结果的处理方式

3、float类型参数从map中取出用double接收

4、结果封装需手动封装

package com.search.service;

import java.util.ArrayList;
import java.util.Map; import org.apache.commons.lang3.StringUtils;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.MultiMatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder.Field;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.xuecheng.framework.domain.course.CoursePub;
import com.xuecheng.framework.domain.search.CourseSearchParam;
import com.xuecheng.framework.exception.ExceptionCast;
import com.xuecheng.framework.model.response.QueryResponseResult;
import com.xuecheng.framework.model.response.QueryResult;
import com.xuecheng.framework.model.response.ResponseResult;
import com.xuecheng.framework.resultCode.EsCode;
import com.xuecheng.framework.resultCode.common.CommonCode;
import com.xuecheng.search.config.EsConfig; @Service
public class EsCourseService { @Autowired
private EsConfig config;
@Autowired
private RestHighLevelClient client; public ResponseResult list(int page,int size,CourseSearchParam params){
if(params==null){
ExceptionCast.cast(CommonCode.NULL_PARAM);
}
//关键字查询
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
if(StringUtils.isNotBlank(params.getKeyword())){
MultiMatchQueryBuilder multiMatchQuery = QueryBuilders.multiMatchQuery(params.getKeyword(), "name","teachplan","descripe")
.minimumShouldMatch("70%")
.field("name", 10);
boolQuery.must(multiMatchQuery);
}
//一节分类
if(StringUtils.isNotBlank(params.getMt())){
boolQuery.filter(QueryBuilders.termQuery("mt", params.getMt()));
}
//二级分类
if(StringUtils.isNotBlank(params.getSt())){
boolQuery.filter(QueryBuilders.termQuery("st", params.getSt()));
}
//课程难度
if(StringUtils.isNotBlank(params.getGrade())){
boolQuery.filter(QueryBuilders.termQuery("grade", params.getGrade()));
}
//高亮
HighlightBuilder hlb = new HighlightBuilder();
hlb.preTags("<font class='esClass'>")
.postTags("</font>")
.fields().add(new Field("name"));//设置name高亮 SearchSourceBuilder ssb = new SearchSourceBuilder();
if(config.getSourceFields()==null){
ExceptionCast.cast(EsCode.READ_CONFIG_PARAM_FAIL);
}
if(page<=0){
page=1;
}
if(size<=0){
size=20;
}
ssb.fetchSource(config.getSourceFields().toArray(new String[]{}), new String[]{})
.from((page-1)*size) //start计算细节需要注意
.size(size)
.query(boolQuery)
.highlighter(hlb);
//sr
SearchRequest sr = new SearchRequest(config.getIndex());
sr.types(config.getType());
sr.source(ssb);
SearchResponse response = null;
try {
response = client.search(sr);
} catch (Exception e) {
return new ResponseResult(CommonCode.SUCCESS);
}
SearchHits hits = response.getHits();
ArrayList<CoursePub> list = new ArrayList<CoursePub>();
for(SearchHit hit:hits){
CoursePub coursePub = new CoursePub();
//1、设置name
Map<String, Object> map = hit.getSourceAsMap();
//取出名称
String name = (String)map.get("name");
//取出高亮字段
Map<String, HighlightField> highLighfields = hit.getHighlightFields();
if(highLighfields!=null){
HighlightField nameField = highLighfields.get("name");
if(nameField!=null){
Text[] fragments = nameField.getFragments();
StringBuffer stringBuffer = new StringBuffer();
for(Text fragment:fragments){
stringBuffer.append(fragment.string());
}
name = stringBuffer.toString();
}
}
coursePub.setName(name); //2、设置pic
String pic = (String)map.get("pic");
coursePub.setPic(pic); //3、价格
Double price = (Double)map.get("price");
coursePub.setPrice(price); //4、原价
Double old_price = (Double)map.get("old_price");
coursePub.setPriceOld(old_price);
list.add(coursePub);
}
QueryResult<CoursePub> qr = new QueryResult<>();
qr.setList(list);
qr.setTotal(hits.getTotalHits());
return new QueryResponseResult<>(CommonCode.SUCCESS, qr);
}
}

elasticsearch-填坑的更多相关文章

  1. Elasticsearch 填坑记

    前言 技术的发展日新月异,传统企业数据库Oracle.SqlServer.DB2,Mysql等在今日不断的被各种大厂自研数据库取代,当然也有类似Elasticsearch等优秀的满足海量数据所使用的开 ...

  2. Kubernetes Fluentd+Elasticsearch+Kibana统一日志管理平台搭建的填坑指南

    在初步完成Kubernetes集群架构的建立后,通过搭建一些监控组件,我们已经能够实现 图形化的监控每个node,pod的状态信息和资源情况 通过scale进行replicateSet的扩展和伸缩 通 ...

  3. centos 7( linux )下搭建elasticsearch踩坑记

    原文:https://blog.csdn.net/an88411980/article/details/83150380 概述    公司最近在做全文检索的项目,发现elasticsearch踩了不少 ...

  4. Android—基于微信开放平台v3SDK,开发微信支付填坑。

    接触微信支付之前听说过这是一个坑,,,心里已经有了准备...我以为我没准跳坑出不来了,没有想到我填上了,调用成功之后我感觉公司所有的同事都是漂亮的,隔着北京的大雾霾我仿佛看见了太阳~~~好了,装逼结束 ...

  5. css 填坑常用代码分享

    以下是常用的代码收集,没有任何技术含量,只是填坑的积累.转载请注明出处,谢谢. 因为提交比较麻烦,后来转置github:https://github.com/jsfront/src/blob/mast ...

  6. 填坑系列:通过ESXi来配置IPMI

    近日西安的天气很不错,可是看到从其他地方迁移来的主机在新环境下无法远程调试怪郁闷的,这就需要填坑,要不就会给后来者挖更大的坑. 今天遇到的坑是在IPMI的网络设置里面启用了VLAN标签之后,在新环境下 ...

  7. Node学习笔记(四):gulp+express+io.socket部署angularJs2(填坑篇)

    这篇就先暂停下上篇博客--你画我猜的进度,因为在做这个游戏的时候,想采用最新的ng2技术,奈何坑是一片又一片,这边就先介绍下环境部署和填坑史 既然要用ng2,首先要拿到资源,我这边用的是angular ...

  8. 【结果很简单,过程很艰辛】记阿里云Ons消息队列服务.NET接口填坑过程

    Maybe 这个问题很简单,因为解决方法是非常简单,但填坑过程会把人逼疯,在阿里云ONS工作人员.同事和朋友的协助下,经过一天的调试和瞎捣鼓,终于解决了这个坑,把问题记下来,也许更多人在碰到类似问题的 ...

  9. 【填坑向】spoj COT/bzoj2588 Count on a tree

    这题是学主席树的时候就想写的,,, 但是当时没写(懒) 现在来填坑 = =日常调半天lca(考虑以后背板) 主席树还是蛮好写的,但是代码出现重复,不太好,导致调试的时候心里没底(虽然事实证明主席树部分 ...

  10. windows下jenkins常见问题填坑

    没有什么高深的东西,1 2天的时间大多数人都能自己摸索出来,这里将自己遇到过的问题分享出来避免其他同学再一次挖坑. 目录 1. 主从节点 2. Nuget自动包还原 3. powershell部署 4 ...

随机推荐

  1. Python 列表/元组/字典总结

    序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推. Python有6个序列的内置类型,但最常见的是列表和元组. 序列 ...

  2. matlab和fortran混合编程

    matlab2016b+vs2010+ivf2013+f90 其实默认是f77语法,但通过配置可以改变为自由格式. 默认只能f77代码,怎样修改: https://ww2.mathworks.cn/m ...

  3. 四十六、SAP的Message中E和W区别

    一.如果写的是E,则报红色的信息,如图 效果如下 二.如果是写的是W,则报黄色的信息 效果如下

  4. 137-PHP static修饰的类属性

    <?php class test{ //定义一个类 public static $num=0; //定义static修饰的类属性 public function __construct(){ / ...

  5. torch.cuda.FloatTensor

    Pytorch中的tensor又包括CPU上的数据类型和GPU上的数据类型,一般GPU上的Tensor是CPU上的Tensor加cuda()函数得到. 一般系统默认是torch.FloatTensor ...

  6. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-refresh

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  7. 打包|zip

    原始:gzip zip -r ./gzip.zip ./gzip/* adding: gzip/split_10.gz (deflated 2%) adding: gzip/split_11.gz ( ...

  8. es6 part 1 //const let

    1. let 命令 ES6 新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. { let a = 10; var b = 1; } a // ...

  9. Egret Engine 2D - 项目配置

      todo 看三个示例项目的完整源码和资源     <e:Group name="Button" height = "300" verticalCent ...

  10. 关于jquery js读取excel文件内容 xls xlsx格式 纯前端

    附带参考:http://blog.csdn.net/gongzhongnian/article/details/76438555 更详细导入导出:https://www.jianshu.com/p/7 ...