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. [ cocos2d-JS ] 创建项目命令

    cocos new HelloJS -l js -p com.neworigin.HelloJS -d D:\0-Game\cocosJS-project

  2. 获取指定进程号,并kill掉

    直接上案例: 例子:获取nginx进程 方法:$ps -aux |grep nginx |grep -v grep |awk '{print $2}'  或者 $ps -ef |grep nginx ...

  3. http请求的过程及潜在的性能优化点

    web前端的看富于部署过程 开发者将开发的代码发布到远程的服务器(webserver/cdn),用户通过访问浏览器输入相应的网址,浏览器向远程服务器发送请求,动态的增量式的加载资源 web前端就是一个 ...

  4. Django——优美的Path()函数

    path( )作用:解析URL地址 path( ) 标准语法: (<>为必须的参数,[]为可选参数) path(<route>, <view>, [name=Non ...

  5. 十四、JavaScript之不同类型变量相加

    一.代码如下 二.效果如下 <!DOCTYPE html> <html> <meta http-equiv="Content-Type" conten ...

  6. 042-PHP使用闭包函数递归无限级分类

    <?php //使用闭包函数递归无限级分类 function demo($array){ # 用于存储递归后的队列 $data = []; # 递归函数 $func = function (&a ...

  7. crontab 实现Linux系统上定时任务的关键命令

    附上原文链接 https://www.cnblogs.com/ftl1012/p/crontab.html 原文真是写得非常好,所谓他山之石可以攻玉~,我就不客气啦,哈哈

  8. Elasticsearch 更新文档

    章节 Elasticsearch 基本概念 Elasticsearch 安装 Elasticsearch 使用集群 Elasticsearch 健康检查 Elasticsearch 列出索引 Elas ...

  9. T_SQL 获取系统当前时间与明天时间的两种格式

    --获取系统明天的时间 select CONVERT(nvarchar(20),dateadd(d,1,getdate()),120)         2017-01-21 15:04:10 sele ...

  10. vue学习(四)插槽

    一 匿名插槽 // 语法 Vue.component('MBtn', { template: ` <button> <slot></slot> </butto ...