简单示例

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使用示例的更多相关文章

  1. Spring Boot + Elasticsearch 使用示例

    本文分别使用 Elasticsearch Repository 和 ElasticsearchTemplate 实现 Elasticsearch 的简单的增删改查 一.Elastic Stack El ...

  2. 用elasticsearch索引mongodb数据

    参照网页:单机搭建elasticsearch和mongodb的river 三个步骤: 一,搭建单机replicSet二,安装mongodb-river插件三,创建meta,验证使用 第一步,搭建单机m ...

  3. elasticsearch基本概念与查询语法

    序言 后面有大量类似于mysql的sum, group by查询 elk === elk总体架构 https://www.elastic.co/cn/products Beat 基于go语言写的轻量型 ...

  4. Spark 整合ElasticSearch

    Spark 整合ElasticSearch 因为做资料搜索用到了ElasticSearch,最近又了解一下 Spark ML,先来演示一个Spark 读取/写入 ElasticSearch 简单示例. ...

  5. 日志收集之--将Kafka数据导入elasticsearch

    最近需要搭建一套日志监控平台,结合系统本身的特性总结一句话也就是:需要将Kafka中的数据导入到elasticsearch中.那么如何将Kafka中的数据导入到elasticsearch中去呢,总结起 ...

  6. ELK之Elasticsearch

    安装并运行Elasetisearch cd elasticsearch-<version> ./bin/elasticsearch 如果你想把 Elasticsearch 作为一个守护进程 ...

  7. 可以执行全文搜索的原因 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 ...

  8. [大数据]-Elasticsearch5.3.1+Kibana5.3.1从单机到分布式的安装与使用<2>

    前言:上篇[大数据]-Elasticsearch5.3.1+Kibana5.3.1从单机到分布式的安装与使用<1>中介绍了ES ,Kibana的单机到分布式的安装,这里主要是介绍Elast ...

  9. Elastic 技术栈之 Filebeat

    Elastic 技术栈之 Filebeat 简介 Beats 是安装在服务器上的数据中转代理. Beats 可以将数据直接传输到 Elasticsearch 或传输到 Logstash . Beats ...

  10. 关于ELK

    官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/6.0/getting-started.html 日志: https://ww ...

随机推荐

  1. Xmake v2.7.6 发布,新增 Verilog 和 C++ Modules 分发支持

    Xmake 是一个基于 Lua 的轻量级跨平台构建工具. 它非常的轻量,没有任何依赖,因为它内置了 Lua 运行时. 它使用 xmake.lua 维护项目构建,相比 makefile/CMakeLis ...

  2. Python从零到壹丨图像增强及运算:图像掩膜直方图和HS直方图

    摘要:本章主要讲解图像直方图相关知识点,包括掩膜直方图和HS直方图,并通过直方图判断黑夜与白天,通过案例分享直方图的实际应用. 本文分享自华为云社区<[Python从零到壹] 五十二.图像增强及 ...

  3. 基于Docker安装的Stable Diffusion使用CPU进行AI绘画

    基于Docker安装的Stable Diffusion使用CPU进行AI绘画 由于博主的电脑是为了敲代码考虑买的,所以专门买的高U低显,i9配核显,用Stable Diffusion进行AI绘画的话倒 ...

  4. 【学习笔记】C/C++ 设计模式 - 工厂模式(下)

    介绍说明 这篇笔记承接<[学习笔记]C/C++ 设计模式 - 工厂模式(上)>文章,主要记录 "抽象工厂设计模式" 的学习笔记,上一次是以音频播放器来作为例子,主要是想 ...

  5. Linux服务器硬件及RAID配置

    Linux服务器硬件及RAID配置 一.RAID磁盘阵列介绍 独立冗余磁盘阵列(Redundant Array of Independent Disks) 作用: 把多块独立的物理硬盘按不同的方式组合 ...

  6. c++ stl 详解 csp备考

    最近在准备csp认证考试,打算使用c++语言,以下是关于c++ stl库的内容: algorithm概览(作者:当格子衫爱上Helloworld) stl库详解(作者:c语言中文网) https:// ...

  7. 力扣---167. 两数之和 II - 输入有序数组

    给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列  ,请你从数组中找出满足相加之和等于目标数 target 的两个数.如果设这两个数分别是 numbers[index1 ...

  8. MQ 消息队列 比较

    为什么需要消息队列 削峰 业务系统在超高并发场景中,由于后端服务来不及同步处理过多.过快的请求,可能导致请求堵塞,严重时可能由于高负荷拖垮Web服务器. 为了能支持最高峰流量,我们通常采取短平快的方式 ...

  9. OpenMP Sections Construct 实现原理以及源码分析

    OpenMP Sections Construct 实现原理以及源码分析 前言 在本篇文章当中主要给大家介绍 OpenMP 当中主要给大家介绍 OpenMP 当中 sections construct ...

  10. vscode + vim 快捷键

    多行编辑 按V选中行,按大写I即可进入编辑模式 撤销恢复 CTRL + z 撤销 CTRL + shift + z 恢复 代码自动对齐 Alt + shift + f