Elasticsearch使用示例
简单示例
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.mxy.common.core.entity.SysEsData;
import com.mxy.common.core.utils.ServiceResult;
import com.mxy.system.entity.vo.SysEsDataVO;
import com.mxy.system.mapper.SysEsDataMapper;
import com.mxy.system.service.SysEsDataService;
import org.apache.commons.lang3.StringUtils;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.RangeQueryBuilder;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* <p>
* ES数据存储 服务实现类
* </p>
*
* @author my
* @since 2022-05-09
*/
@Service
public class SysEsDataServiceImpl extends ServiceImpl<SysEsDataMapper, SysEsData> implements SysEsDataService {
private static String INDEX_NAME = "person";
@Autowired
public RestHighLevelClient client;
@Override
public String getList(SysEsDataVO sysEsDataVO) {
List<SysEsData> list = new ArrayList<>();
Map<String, Object> map = new HashMap<>();
try {
SearchRequest searchRequest = new SearchRequest(INDEX_NAME);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder bool = new BoolQueryBuilder();
// 精确查询
if (StringUtils.isNotEmpty(sysEsDataVO.getPhone())) {
// 手机号码
bool.must(new TermQueryBuilder("phone", sysEsDataVO.getPhone()));
}
if (StringUtils.isNotEmpty(sysEsDataVO.getFieldOne())) {
// 数据id
bool.must(new TermQueryBuilder("fieldOne", sysEsDataVO.getFieldOne()));
}
if (StringUtils.isNotBlank(sysEsDataVO.getMinSalary()) || StringUtils.isNotBlank(sysEsDataVO.getMaxSalary())) {
if (StringUtils.isNotBlank(sysEsDataVO.getMinSalary()) && StringUtils.isNotBlank(sysEsDataVO.getMaxSalary())) {
// 工资范围查询
RangeQueryBuilder salaryRange = new RangeQueryBuilder("salary");
salaryRange.gte(sysEsDataVO.getMinSalary());
salaryRange.lte(sysEsDataVO.getMaxSalary());
bool.must(salaryRange);
} else if (StringUtils.isNotBlank(sysEsDataVO.getMinSalary())) {
bool.must(new TermQueryBuilder("salary", sysEsDataVO.getMinSalary()));
} else {
bool.must(new TermQueryBuilder("salary", sysEsDataVO.getMaxSalary()));
}
}
if (StringUtils.isNotBlank(sysEsDataVO.getStatus())) {
bool.must(new TermQueryBuilder("status.keyword", sysEsDataVO.getStatus()));
}
// 模糊查询
if (StringUtils.isNotBlank(sysEsDataVO.getName())) {
bool.must(QueryBuilders.wildcardQuery("name.keyword", "*" + sysEsDataVO.getName() + "*"));
}
if (StringUtils.isNotBlank(sysEsDataVO.getAddress())) {
bool.must(QueryBuilders.wildcardQuery("address.keyword", "*" + sysEsDataVO.getAddress() + "*"));
}
if (StringUtils.isNotBlank(sysEsDataVO.getCompany())) {
bool.must(QueryBuilders.wildcardQuery("company.keyword", "*" + sysEsDataVO.getCompany() + "*"));
}
//日期查询
if (StringUtils.isNotBlank(sysEsDataVO.getStartTime()) && StringUtils.isNotBlank(sysEsDataVO.getEndTime())) {
RangeQueryBuilder timeRange = new RangeQueryBuilder("createTime");
timeRange.gte(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(sysEsDataVO.getStartTime()));
timeRange.lte(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(sysEsDataVO.getEndTime()));
bool.must(timeRange);
}
searchSourceBuilder.query(bool);
// 分页
searchSourceBuilder.from(Integer.parseInt(String.valueOf((sysEsDataVO.getCurrentPage() - 1) * sysEsDataVO.getPageSize())));
searchSourceBuilder.size(Integer.parseInt(String.valueOf(sysEsDataVO.getPageSize())));
// 时间排序
searchSourceBuilder.sort("createTime", SortOrder.DESC);
// 获取超过1w条数据 需要加上 "track_total_hits":true ,不然只能显示出9999条
searchSourceBuilder.trackTotalHits(true);
searchRequest.source(searchSourceBuilder);
SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHit[] hits = search.getHits().getHits();
long count = search.getHits().getTotalHits().value;
Arrays.stream(hits).forEach(hit -> {
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
SysEsData esData = BeanUtil.mapToBean(sourceAsMap, SysEsData.class, true);
list.add(esData);
});
map.put("current", sysEsDataVO.getCurrentPage());
map.put("size", sysEsDataVO.getPageSize());
map.put("total", count);
map.put("records", list);
} catch (Exception e) {
e.printStackTrace();
}
return ServiceResult.success(map);
}
}
Elasticsearch使用示例的更多相关文章
- Spring Boot + Elasticsearch 使用示例
本文分别使用 Elasticsearch Repository 和 ElasticsearchTemplate 实现 Elasticsearch 的简单的增删改查 一.Elastic Stack El ...
- 用elasticsearch索引mongodb数据
参照网页:单机搭建elasticsearch和mongodb的river 三个步骤: 一,搭建单机replicSet二,安装mongodb-river插件三,创建meta,验证使用 第一步,搭建单机m ...
- elasticsearch基本概念与查询语法
序言 后面有大量类似于mysql的sum, group by查询 elk === elk总体架构 https://www.elastic.co/cn/products Beat 基于go语言写的轻量型 ...
- Spark 整合ElasticSearch
Spark 整合ElasticSearch 因为做资料搜索用到了ElasticSearch,最近又了解一下 Spark ML,先来演示一个Spark 读取/写入 ElasticSearch 简单示例. ...
- 日志收集之--将Kafka数据导入elasticsearch
最近需要搭建一套日志监控平台,结合系统本身的特性总结一句话也就是:需要将Kafka中的数据导入到elasticsearch中.那么如何将Kafka中的数据导入到elasticsearch中去呢,总结起 ...
- ELK之Elasticsearch
安装并运行Elasetisearch cd elasticsearch-<version> ./bin/elasticsearch 如果你想把 Elasticsearch 作为一个守护进程 ...
- 可以执行全文搜索的原因 Elasticsearch full-text search Kibana RESTful API with JSON over HTTP elasticsearch_action es 模糊查询
https://www.elastic.co/guide/en/elasticsearch/guide/current/getting-started.html Elasticsearch is a ...
- [大数据]-Elasticsearch5.3.1+Kibana5.3.1从单机到分布式的安装与使用<2>
前言:上篇[大数据]-Elasticsearch5.3.1+Kibana5.3.1从单机到分布式的安装与使用<1>中介绍了ES ,Kibana的单机到分布式的安装,这里主要是介绍Elast ...
- Elastic 技术栈之 Filebeat
Elastic 技术栈之 Filebeat 简介 Beats 是安装在服务器上的数据中转代理. Beats 可以将数据直接传输到 Elasticsearch 或传输到 Logstash . Beats ...
- 关于ELK
官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/6.0/getting-started.html 日志: https://ww ...
随机推荐
- 【学习笔记】珂朵莉树(ODT)
珂朵莉树 \(\tt 0x00\) 起源 起源于 CodeForces 的一题 CF896C,当时出题人提供了这种做法,在随机数据下均摊复杂度比较优秀. 正统名字好像叫颜色段均摊,由于题目也得名于 \ ...
- centos7笔记本使用iptables服务,将笔记本模拟成为出口路由器 PPPOE拨号+NAT+端口映射
郑州洪水,闲置在家,捣鼓捣鼓 centos7笔记本使用iptables服务,将笔记本模拟成为出口路由器 PPPOE拨号+NAT+端口映射 环境: 1.笔记本单网口,无法做路由网关,手里有个闲置的USB ...
- 【开源】libinimini:适用于单片机的极简 ini 解析库
介绍说明 最近自己基于 XR872 在做一个小作品练习练习,具备可以配置的功能,选择了使用 ini 作为配置文件.我调研了网上常见的 ini 解析库,几乎都涉及到了 fopen()/fgets().. ...
- 简述 Gin 框架如何集成swagger
https://blog.csdn.net/raogeeg/article/details/86743953 @Title 这个 API 所表达的含义,是一个文本,空格之后的内容全 ...
- Spring03-IOC-循环依赖的实现(Debug查看spring解决循环依赖的过程)
1 什么是循环依赖 如下,有类A和B,A中有一个类型为B的属性b,B中有一个类型为A的属性a,A和B相互依赖 public class A { private B b; public B getB() ...
- 详谈pytest中的xfail
详谈pytest中的xfail 原文链接: https://docs.pytest.org/en/7.2.x/how-to/skipping.html 链接中详细阐述了skip和xfail两种情况 x ...
- 微信小程序分类菜单激活状态跟随列表滚动自动切换
这里主要用到微信小程序提供的SelectorQuery获取页面节点信息实现,组件用的是微信小程序的scroll-view 逻辑就是获取右侧盒子的节点信息,获取右侧子分类的节点信息,当子分类滑动到顶部的 ...
- bat脚本登陆ftp服务器
用bat脚本登录ftp服务器,下载指定文件. 第一次脚本,有问题,你发现了么? 由于每个">>"重定向符号之前都习惯用空格(python style),导致写道ftp. ...
- ctfshow_web入门 xss
额,怎么说呢,对xss理解不深刻,虽然做了XSS-LAB,但是感觉不会用,看了群主的视频,知道了原因,用群主的话来说就是,X的是自己... 这个文章写得比较潦草... 准备一个带nc的工具: 无vps ...
- 免杀之:Python加载shellcode免杀
免杀之:Python加载shellcode免杀 目录 免杀之:Python加载shellcode免杀 1 Python 加载Shellcode免杀 使用Python可以做一些加密.混淆,但使用Pyth ...