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 ...
随机推荐
- 方法的调用-JDK的JShell简单使用
方法的调用 方法在定义完毕后,方法不会自己运行,必须被调用才能执行,我们可以在主方法main中来调用我们自己定义好的方法.在 主方法中,直接写要调用的方法名字就可以调用了. public static ...
- Array list练习
Array list练习 数据添加到集合 生成6个1~33之间的随机整数,添加到集合,并遍历 public class Test01ArrayList { public static void mai ...
- 四、流程控制和break、continue、range函数的讲解
目录 一.流程控制理论和必备基础知识 理论: 必备基础知识: break.continue的用法: 二.流程控制之分支结构 if if...else if...elif...else if的嵌套使用 ...
- Redis-05持久化
1 Redis持久化 RDB(Redis DataBase) AOF(Append Only File) 2 RBD 2.1 基本说明 在指定的时间间隔内将内存中的数据集快照写入磁盘文件,它恢复时将快 ...
- 3分钟教你安装 Compressor视频转码编辑工具 V4.6.3中文破解版 小白一看就会
Comperssor 下载 下载直通车 立即下载 Mac App Store: https://apps.apple.com/cn/app/compressor/id424390742?ign-mpt ...
- Element ui&图标、按钮、超链接、单选框
ElementUI&Vant ui 基于Vue的一套桌面端的组件库,提前封装好的UI模版,方便开发者快速搭建一个网站前端界面. 官网:https://element.eleme.cn/#/zh ...
- 【雅礼联考DAY01】逃跑
#pragma GCC optimize(2) #pragma GCC optimize(3) #include<cstdio> using namespace std; const in ...
- 基于C++的OpenGL 11 之投光物
1. 引言 本文基于C++语言,描述OpenGL的投光物 前置知识可参考: 基于C++的OpenGL 10 之光照贴图 - 当时明月在曾照彩云归 - 博客园 (cnblogs.com) 笔者这里不过多 ...
- Postgresql模板数据库之template1 和 template0
一.简介 template1和template0是PostgreSQL的模板数据库.所谓模板数据库就是创建新database时,PostgreSQL会基于模板数据库制作一份副本,其中会包含所有的数据库 ...
- Angular 利用路由快照实现tab
1.定义路由快照 新建文件SimpleReuseStrategy.ts import { RouteReuseStrategy, DefaultUrlSerializer, ActivatedRout ...