elasticsearch-填坑
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-填坑的更多相关文章
- Elasticsearch 填坑记
前言 技术的发展日新月异,传统企业数据库Oracle.SqlServer.DB2,Mysql等在今日不断的被各种大厂自研数据库取代,当然也有类似Elasticsearch等优秀的满足海量数据所使用的开 ...
- Kubernetes Fluentd+Elasticsearch+Kibana统一日志管理平台搭建的填坑指南
在初步完成Kubernetes集群架构的建立后,通过搭建一些监控组件,我们已经能够实现 图形化的监控每个node,pod的状态信息和资源情况 通过scale进行replicateSet的扩展和伸缩 通 ...
- centos 7( linux )下搭建elasticsearch踩坑记
原文:https://blog.csdn.net/an88411980/article/details/83150380 概述 公司最近在做全文检索的项目,发现elasticsearch踩了不少 ...
- Android—基于微信开放平台v3SDK,开发微信支付填坑。
接触微信支付之前听说过这是一个坑,,,心里已经有了准备...我以为我没准跳坑出不来了,没有想到我填上了,调用成功之后我感觉公司所有的同事都是漂亮的,隔着北京的大雾霾我仿佛看见了太阳~~~好了,装逼结束 ...
- css 填坑常用代码分享
以下是常用的代码收集,没有任何技术含量,只是填坑的积累.转载请注明出处,谢谢. 因为提交比较麻烦,后来转置github:https://github.com/jsfront/src/blob/mast ...
- 填坑系列:通过ESXi来配置IPMI
近日西安的天气很不错,可是看到从其他地方迁移来的主机在新环境下无法远程调试怪郁闷的,这就需要填坑,要不就会给后来者挖更大的坑. 今天遇到的坑是在IPMI的网络设置里面启用了VLAN标签之后,在新环境下 ...
- Node学习笔记(四):gulp+express+io.socket部署angularJs2(填坑篇)
这篇就先暂停下上篇博客--你画我猜的进度,因为在做这个游戏的时候,想采用最新的ng2技术,奈何坑是一片又一片,这边就先介绍下环境部署和填坑史 既然要用ng2,首先要拿到资源,我这边用的是angular ...
- 【结果很简单,过程很艰辛】记阿里云Ons消息队列服务.NET接口填坑过程
Maybe 这个问题很简单,因为解决方法是非常简单,但填坑过程会把人逼疯,在阿里云ONS工作人员.同事和朋友的协助下,经过一天的调试和瞎捣鼓,终于解决了这个坑,把问题记下来,也许更多人在碰到类似问题的 ...
- 【填坑向】spoj COT/bzoj2588 Count on a tree
这题是学主席树的时候就想写的,,, 但是当时没写(懒) 现在来填坑 = =日常调半天lca(考虑以后背板) 主席树还是蛮好写的,但是代码出现重复,不太好,导致调试的时候心里没底(虽然事实证明主席树部分 ...
- windows下jenkins常见问题填坑
没有什么高深的东西,1 2天的时间大多数人都能自己摸索出来,这里将自己遇到过的问题分享出来避免其他同学再一次挖坑. 目录 1. 主从节点 2. Nuget自动包还原 3. powershell部署 4 ...
随机推荐
- POJ 3077 : Rounders
Rounders Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7827 Accepted: 5062 Description ...
- 一个基于chrome扩展的自动答题器
1.写在前面 首先感谢小茗同学的文章-[干货]Chrome插件(扩展)开发全攻略, 基于这篇入门教程和demo,我才能写出这款 基于chrome扩展的自动答题器. git地址: https://git ...
- cf 763A. Timofey and a tree
呵呵呵,直接判断是不是一个点连起来所有的特殊边(连接2不同颜色的点的边) (一开始还想各种各样奇怪的dfs...垃圾) #include<bits/stdc++.h> #define LL ...
- windows炸鸡啤酒
20170831 今天郁闷,一台windwos远处不上去,被怼了,只能说我活该,事先不弄清楚自己负责的服务运行机器的管理员. 今天尤其特别想知道这台windows跑了多久(linux:uptime), ...
- Linux_Program 前台后台 切换 查看 kill 实用 mark
有时当我们在linux 上 输入 yum repolist 或 curl www.XXX. 时程序由已 :Intel或system 原因 按下 ctrl+z .在Linux终端运行命令的 ...
- Mysql: if 结构
if结构 语法 if 条件1 then 语句1; elseif 条件2 then 语句2; ... else 语句n; # 可以不写 应用场合:应用在begin end 中 SEL ...
- 大二暑假第五周总结--开始学习Hadoop基础(四)
简单学习MapReduce并进行WordCount实践 分布式并行编程: MapReduce设计的一个理念就是“计算向数据靠拢”,将复杂的,运行于大规模集群上的并行计算过程高度地抽象到两个函数:Map ...
- springboot (2.0以上)连接mysql配置
pom <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java&l ...
- Java9,8,7中接口的内容
在Java 9+版本中,接口的内容可以有: 1:成员变量其实是常量格式:[public][static][final] 数据类型 常量名称 =数据值:注意: 常量必须进行赋值,而且一旦赋值不能改变 常 ...
- LIS是什么?【质量控制】
继续[LIS是什么?]中提到的[质量控制]. Ⅱ.质量控制要求非常专业,现在只说一说个人理解,以下仅为LIS检验中部分理解,实际上实验室质量控制还包含的报告时效,实验室温度.湿度等等一系列内容,是一个 ...