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. local feature和global feature的理解

    在计算机视觉方面,global feature是基于整张图像提取的特征,也就是说基于all pixels,常见的有颜色直方图.形状描述子.GIST等:local feature相对来说就是基于局部图像 ...

  2. NASA航天技术演示实验集

    为了支持太空探索NASA开起了一系列先进太空技术演示实验. 具体的实验实验地址在:https://www.nasa.gov/mission_pages/tdm/main/overview.html 通 ...

  3. Oracle 序列(查询序列的值,修改序列的值)

    1.序列的语法形式 create sequence 序列名 increment by n start with n maxvalue n | nomaxvalue minvalue n | nomin ...

  4. centos7如何修改IP地址

    步骤1:使用vi编辑 /etc/sysconfig/network-scripts/目录下的ifcfg-ens160 配置文件 [root@model ~]# [root@model ~]# vi / ...

  5. sendgrid 批量发送邮件,收件栏只显示当前用户的方案

    需求:批量发送邮件,用户可能看到其他用户的邮箱地址,之前用BBC发送,但问题是接收地址是同一个. 官方解决方案:https://sendgrid.kke.co.jp/docs/Tutorials/A_ ...

  6. HDU 3397 线段树 双懒惰标记

    这个是去年遗留历史问题,之前思路混乱,搞了好多发都是WA,就没做了 自从上次做了大白书上那个双重懒惰标记的题目,做这个就思路很清晰了 跟上次大白上那个差不多,这个也是有一个sets标记,代表这个区间全 ...

  7. Django中出现no such table: django_session

    这个错误跟Session的机制有关, 既然要从Web服务器端来记录用户信息, 那么一定要有存放用户session id对应信息的地方才行. 所以,我们需要创建django_session表. Djan ...

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

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

  9. Java中定义常量(Constant) 的几种方法

    为了方便大家交流Spark大数据,浪尖建了微信群,目前人数过多,只能通过浪尖或者在群里的朋友拉入群.纯技术交流,偶有吹水,但是打广告,不提醒,直接踢出.有兴趣加浪尖微信. 常量使用目的 1,为什么要将 ...

  10. 说说lock到底要锁谁?

    波安搬... http://www.cnblogs.com/wolf-sun/p/4209521.html ---------------------------------------------- ...