【java_wxid项目】【第十三章】【Elasticsearch集成】

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 【java_wxid项目】【第十三章】【Elasticsearch集成】

主项目链接:https://gitee.com/java_wxid/java_wxid

项目架构及博文总结:


  • 点击:【使用Spring Boot快速构建应用】
  • 点击:【使用Spring Cloud Open Feign基于动态代理动态构造请求实现与其他系统进行交互】
  • 点击:【使用Spring Cloud Hystrix实现服务容错、熔断、降级、监控】
  • 点击:【使用Spring Cloud Ribbon以库的方式集成到服务的消费方实现客户端负载均衡】
  • 点击:【使用Spring Cloud Gateway作为API网关服务进行请求拦截、服务分发、降级、限流】
  • 点击:【使用Spring Cloud Security Oauth2作为微服务统一认证中心实现用户认证和授权访问】
  • 点击:【使用Spring Cloud Stream作为消息驱动用于动态的切换中间件】
  • 点击:【使用Spring Cloud Skywalking基于字节码注入通过探针方式进行链路追踪、分布式追踪、性能指标分析、应用和服务依赖分析】
  • 点击:【使用Spring Cloud Alibaba Nacos实现服务注册/发现/续约/剔除/下线、心跳检测、服务配置管理、基于长轮训机制实现配置动态变更】
  • 点击:【使用Spring Cloud Alibaba Seata作为对项目代码无入侵的分布式事务解决方案】
  • 点击:【使用Spring Cloud Alibaba Sentinel实现高可用流量防护】
  • 点击:【使用Apache ShardingSphere作为关系型数据库中间件实现分库分表、读写分离】
  • 点击:【使用Apache Mybatis作为持久层框架用于定制化SQL、存储过程以及高级映射】
  • 点击:【使用Redis作为高性能分布式缓存数据库】
  • 点击:【使用ElasticSearch全文搜索】
  • 点击:【使用MongoDB非关系型数据库】
  • 点击:【使用xxl-job作为分布式任务调度平台】
  • 点击:【使用Elasticsearch + Logstash + Kibana作为日志收集系统】
  • 点击:【使用Apifox作为API文档、API调试、API Mock、API自动化测试】
  • 点击:【使用Apache Spark作为基于内存计算的大数据分析引擎用于批处理、交互式查询】
  • 点击:【使用ETL工具将数据源抽取到HDFS作为高可靠、高吞吐量的分布式文件系统存储,通过Hive清洗、处理和计算原始数据,Hive清洗处理后的结果,将存入Hbase,海量数据随机查询场景从HBase查询数据】
  • 点击:【使用领域驱动DDD设计和设计模式进行开发】
  • 点击:【使用Netty基于Java NIO封装的高性能的网络通信框架】
  • 点击:【使用k8s、docker、docker-compose、宝塔面板进行环境搭建和部署】
  • 点击:【使用Vue渐进式JavaScript框架作为适用场景丰富的Web前端框架】
  • 点击:【分享人才筛选、工作分配、高效办公、项目推动等团队管理经验】


项目模块:

前期规划,实现部分


java_wxid   
├── demo                                                            // 演示模块
│     └── 模块名称:apache-mybatis-demo模块                            //Apache Mybatis集成(已实现并有博文总结)
│     └── 模块名称:apache-shardingsphere-demo模块                     //Apache ShardingSphere集成(已实现并有博文总结)
│     └── 模块名称:design-demo模块                                    //设计模式实战落地(已实现并有博文总结)
│     └── 模块名称:elasticsearch-demo模块                             //ElasticSearch集成(已实现并有博文总结)
│     └── 模块名称:mongodb-demo模块                                   //MongoDB集成(已实现并有博文总结)
│     └── 模块名称:redis-demo模块                                     //Redis集成(已实现并有博文总结)
│     └── 模块名称:spring-boot-demo模块                               //Spring Boot快速构建应用(已实现并有博文总结)
│     └── 模块名称:spring-cloud-alibaba-nacos-demo模块                //Spring Cloud Alibaba Nacos集成(已实现并有博文总结)
│     └── 模块名称:spring-cloud-alibaba-seata-demo模块                //Spring Cloud Alibaba Seata集成(已实现并有博文总结)
│     └── 模块名称:spring-cloud-alibaba-sentinel-demo模块             //Spring Cloud Alibaba Sentinel集成(已实现并有博文总结)
│     └── 模块名称:spring-cloud-gateway-demo模块                      //Spring Cloud Gateway集成(已实现并有博文总结)
│     └── 模块名称:spring-cloud-hystrix-demo模块                      //Spring Cloud Hystrix集成(已实现并有博文总结)
│     └── 模块名称:spring-cloud-open-feign-demo模块                   //Spring Cloud Open Feign集成(已实现并有博文总结)
│     └── 模块名称:spring-cloud-ribbon-demo模块                       //Spring Cloud Ribbon集成(已实现并有博文总结)
│     └── 模块名称:spring-cloud-security-oauth2-demo模块              //Spring Cloud Security Oauth2集成(已实现并有博文总结)
│     └── 模块名称:spring-cloud-security-oauth2-sso-client-demo模块   //Spring Cloud Security Oauth2集成(已实现并有博文总结)
│     └── 模块名称:spring-cloud-skywalking-demo模块                   //Spring Cloud Skywalking集成(已实现并有博文总结)
│     └── 模块名称:spring-cloud-stream-demo模块                       //Spring Cloud Stream集成(已实现并有博文总结)
│     └── 模块名称:swagger-demo模块                                   //springfox-swagger2集成(已实现并有博文总结)
│     └── 模块名称:xxl-job模块                                        //xxl-job集成(已实现并有博文总结)
│     └── 模块名称:apache-spark-demo模块                              //Apache Spark集成
│     └── 模块名称:etl-hdfs-hive-hbase-demo模块                       //ETL、HDFS、Hive、Hbase集成
│     └── 模块名称:ddd-mode-demo模块                                  //DDD领域设计
│     └── 模块名称:netty-demo模块                                     //Netty集成
│     └── 模块名称:vue-demo模块                                       //前端vue集成
├── document                                                        // 文档
│     └── JavaKnowledgeDocument                                     //java知识点
│           └── java基础知识点.md                     
│           └── mq知识点.md
│           └── mysql知识点.md
│           └── redis知识点.md
│           └── springcould知识点.md
│           └── spring知识点.md
│     └── FounderDocument                                           //创始人
│           └── 创始人.md

系列文章:快速集成各种微服务相关的技术,帮助大家可以快速集成到自己的项目中,节约开发时间。

提示:系列文章还未全部完成,后续的文章,会慢慢补充进去的。


文章目录


准备工作

安装Elasticsearch

创建普通用户

上传压缩包并解压

修改配置文件

修改elasticsearch.yml

修改jvm.option

修改系统配置,解决启动时候的问题

普通用户打开文件的最大数限制

此文件修改后需要重新登录用户,才会生效

普通用户调大虚拟内存

设置用户密码登录

启动ES服务

客户端Kibana安装

安装IK分词器

创建elasticsearch-demo项目

修改pom.xml

创建ElasticSearchController

创建ElasticsearchDao

创建Userinfo

创建ElasticsearchService

创建ElasticsearchServiceImpl

创建application.yml

校验Elasticsearch是否正常工作


准备工作


创建一个新的虚拟机,文章地址:https://blog.csdn.net/java_wxid/article/details/127132378


安装Elasticsearch

下载软件安装包:

链接:https://pan.baidu.com/s/1XRGHX9lqF21k0gaaHv8ReA?pwd=2022

提取码:2022

–来自百度网盘超级会员V2的分享

安装es可能会出现的错误解决办法:https://blog.csdn.net/ADCadc123456789/article/details/104806771


创建普通用户

ES不能使用root用户来启动,必须使用普通用户来安装启动。这里我们创建一个普通用户以及定义一些常规目录用于存放我们的数据文件以及安装包等。


创建一个es专门的用户(必须)

使用root用户在服务器执行以下命令


先创建组, 再创建用户:

1)创建 elasticsearch 用户组

groupadd elasticsearch
• 1

2)创建用户 liaozhiwei 并设置密码

useradd liaozhiwei
passwd liaozhiwei

3)# 创建es文件夹,

并修改owner为 liaozhiwei用户

mkdir -p /usr/local/es

4)用户es 添加到 elasticsearch 用户组

usermod -G elasticsearch liaozhiwei

先上传安装包elasticsearch-7.6.1-linux-x86_64.tar.gz进行解压,解压目录为/usr/local/es,然后授权

tar -zxvf elasticsearch-7.6.1-linux-x86_64.tar.gz
chown -R liaozhiwei /usr/local/es/elasticsearch-7.6.1

5)设置sudo权限

#为了让普通用户有更大的操作权限,我们一般都会给普通用户设置sudo权限,方便普通用户的操作

#三台机器使用root用户执行visudo命令然后为es用户添加权限

visudo
• 1

#在root ALL=(ALL) ALL 一行下面

#添加liaozhiwei用户 如下:

liaozhiwei ALL=(ALL) ALL

#添加成功保存后切换到liaozhiwei用户操作

[root@localhost ~]# su liaozhiwei

[liaozhiwei@localhost root]$


上传压缩包并解压


将es的安装包下载并上传到服务器的/user/local/es路径下,然后进行解压

使用liaozhiwei用户来执行以下操作,将es安装包上传到指定服务器,并使用es用户执行以下命令解压。


su root
cd /usr/local/es/
sudo chmod 777 elasticsearch-7.6.1-linux-x86_64.tar.gz 
tar -zvxf elasticsearch-7.6.1-linux-x86_64.tar.gz -C /usr/local/es/


修改配置文件


修改elasticsearch.yml


进入服务器使用baiqi用户来修改配置文件


cd /usr/local/es/elasticsearch-7.6.1/config
mkdir -p /usr/local/es/elasticsearch-7.6.1/log
mkdir -p /usr/local/es/elasticsearch-7.6.1/data
rm -rf elasticsearch.yml
vim elasticsearch.yml
cluster.name: liaozhiwei-es
node.name: node1
path.data: /usr/local/es/elasticsearch-7.6.1/data
path.logs: /usr/local/es/elasticsearch-7.6.1/log
network.host: 192.168.160.128
http.port: 9200
discovery.seed_hosts: ["192.168.160.128"]
cluster.initial_master_nodes: ["node1"]
bootstrap.system_call_filter: false
bootstrap.memory_lock: false
http.cors.enabled: true
http.cors.allow-origin: "*"
xpack.security.enabled: true
xpack.license.self_generated.type: basic
xpack.security.transport.ssl.enabled: true


修改jvm.option


修改jvm.option配置文件,调整jvm堆内存大小。

node1.liaozhiwei.cn使用liaozhiwei用户执行以下命令调整jvm堆内存大小,每个人根据自己服务器的内存大小来进行调整。


cd /usr/local/es/elasticsearch-7.6.1/config
vim jvm.options
-Xms2g
-Xmx2g


修改系统配置,解决启动时候的问题


由于现在使用普通用户来安装es服务,且es服务对服务器的资源要求比较多,包括内存大小,线程数等。所以我们需要给普通用户解开资源的束缚。


普通用户打开文件的最大数限制


问题错误信息描述:

max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]


ES因为需要大量的创建索引文件,需要大量的打开系统的文件,所以我们需要解除linux系统当中打开文件最大数目的限制,不然ES启动就会抛错,三台机器使用baiqi用户执行以下命令解除打开文件数据的限制。


sudo vi /etc/security/limits.conf


添加如下内容: 注意*不要去掉了


* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096


此文件修改后需要重新登录用户,才会生效

普通用户启动线程数限制

问题错误信息描述

max number of threads [1024] for user [es] likely too low, increase to at least [4096]


修改普通用户可以创建的最大线程数

max number of threads [1024] for user [es] likely too low, increase to at least [4096]


原因:无法创建本地线程问题,用户最大可创建线程数太小


解决方案:修改90-nproc.conf 配置文件。

三台机器使用baiqi用户执行以下命令修改配置文件


Centos6
sudo vi /etc/security/limits.d/90-nproc.conf
Centos7
sudo vi /etc/security/limits.d/20-nproc.conf


找到如下内容:


* soft nproc 1024#修改为
* soft nproc 4096


普通用户调大虚拟内存

错误信息描述:

max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]


原因:最大虚拟内存太小,解决方案:调大系统的虚拟内存,每次启动机器都手动执行下。三台机器执行以下命令


vim /etc/sysctl.conf

追加以下内容:

vm.max_map_count=262144 

保存后,执行:

sysctl -p


备注:以上三个问题解决完成之后,重新连接secureCRT或者重新连接xshell生效


设置用户密码登录
cd /usr/local/es/elasticsearch-7.6.1/bin
./elasticsearch-setup-passwords interactive


这里会设置六个账号的密码:elastic,apm_system,kibana,logstash_system,beats_system,remote_monitoring_user.

我这里统一使用liaozhiwei作为这六个账号的密码

elastic作为我直接访问es的账号


启动ES服务

三台机器使用liaozhiwei用户执行以下命令启动es服务

nohup /usr/local/es/elasticsearch-7.6.1/bin/elasticsearch 2>&1 &


后台启动ES 进入bin目录 ./elasticsearch -d

启动成功之后jsp即可看到es的服务进程,并且访问页面

http://192.168.160.128:9200/?pretty


上面配置了用户密码这里访问也需要输入

elastic
liaozhiwei


3765f4e7a57c4c88b5934eb644c8a0f7.png


能够看到es启动之后的一些信息

注意:如果哪一台机器服务启动失败,那么就到哪一台机器的

/usr/local/es/elasticsearch-7.6.1/log


这个路径下面去查看错误日志

开启Linux防火墙

systemctl start firewalld 
systemctl enable firewalld


centos开放端口宿主机访问

firewall-cmd --add-port=9200/tcp --permanent
firewall-cmd --reload


查询端口是否开启命令

firewall-cmd --query-port=9200/tcp


注意:启动ES的时候出现 Permission denied。原因:当前的用户没有对XX文件或目录的操作权限。


客户端Kibana安装

ES主流客户端Kibana,开放9200端口与图形界面客户端交互

1)下载Kibana放之/usr/local/es目录中

2)解压文件:tar -zxvf kibana-X.X.X-linux-x86_64.tar.gz

3)进入/usr/local/es/kibana-X.X.X-linux-x86_64/config目录

4)使用vi编辑器:


vi /usr/local/es/kibana-7.6.1-linux-x86_64/config/kibana.yml


server.port: 5601
server.host: "192.168.160.128"
elasticsearch.hosts: ["http://192.168.160.128:9200"]
elasticsearch.username: "kibana"
elasticsearch.password: "liaozhiwei"
i18n.locale: "zh-CN"


centos开放端口宿主机访问

firewall-cmd --add-port=5601/tcp --permanent
firewall-cmd --reload


查询端口是否开启命令

firewall-cmd --query-port=5601/tcp


切换root用户 给es用户这个文件的权限

su root
sudo chown -R liaozhiwei /usr/local/es/kibana-7.6.1-linux-x86_64


5)启动Kibana

./usr/local/es/kibana-7.6.1-linux-x86_64/bin/kibana


后台启动kibana

cd /usr/local/es/kibana-7.6.1-linux-x86_64/bin/
nohup  ./kibana &


6)访问Kibana

http://192.168.160.128:5601/app/kibana


上面配置了用户密码这里访问也需要输入

elastic
liaozhiwei


安装IK分词器


我们后续也需要使用Elasticsearch来进行中文分词,所以需要单独给Elasticsearch安装IK分词器插件。以下为具体安装步骤:

下载Elasticsearch IK分词器

https://github.com/medcl/elasticsearch-analysis-ik/releases

切换到liaozhiwei用户,并在es的安装目录下/plugins创建ik


mkdir -p /usr/local/es/elasticsearch-7.6.1/plugins/ik


将下载的ik分词器上传并解压到该目录


cd /usr/local/es/elasticsearch-7.6.1/plugins/ik
unzip  elasticsearch-analysis-ik-7.6.1.zip


重启Elasticsearch

ps -ef | grep elastic
kill -9 PID
nohup /usr/local/es/elasticsearch-7.6.1/bin/elasticsearch 2>&1 &


创建elasticsearch-demo项目


项目代码:https://gitee.com/java_wxid/java_wxid/tree/master/demo/elasticsearch-demo


项目结构如下(示例):


ed8c88ad7f6f49a5961af9ddfd6db3ad.png


修改pom.xml


代码如下(示例):


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>elasticsearch-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>elasticsearch-demo</name>
    <description>Demo project for Spring Boot</description>
    <!--    属性配置-->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <!--引入 Spring Boot、Spring Cloud、Spring Cloud Alibaba 三者 BOM 文件,进行依赖版本的管理,防止不兼容。
        在 https://dwz.cn/mcLIfNKt 文章中,Spring Cloud Alibaba 开发团队推荐了三者的依赖关系-->
        <spring.boot.version>2.3.12.RELEASE</spring.boot.version>
        <spring.cloud.version>Hoxton.SR12</spring.cloud.version>
        <spring.cloud.alibaba.version>2.2.7.RELEASE</spring.cloud.alibaba.version>
        <elasticsearch.version>7.12.0</elasticsearch.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--        代表web模块,在这个模块中含了许多JAR包,有spring相关的jar,内置tomcat服务器,jackson等,这些web项目中常用的的功能都会自动引入-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--        在SpringBoot 2.4.x的版本之后,对于bootstrap.properties/bootstrap.yaml配置文件(我们合起来成为Bootstrap配置文件)的支持,其实这个jar包里什么都没有,就只有一个标识类Marker,用来标识要开启Bootstrap配置文件的支持,由于父类用了2.5.6版本需要导入如下的依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
            <version>3.1.0</version>
        </dependency>
        <!-- 重写覆盖 spring-boot-dependencies 中的依赖版本  -->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-elasticsearch</artifactId>
            <version>4.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>${elasticsearch.version}</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>${elasticsearch.version}</version>
        </dependency>
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-client</artifactId>
            <version>${elasticsearch.version}</version>
        </dependency>
        <!--        lombok插件-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>RELEASE</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>
    <!--
    引入 Spring Boot、Spring Cloud、Spring Cloud Alibaba 三者 BOM 文件,进行依赖版本的管理,防止不兼容。
    在 https://dwz.cn/mcLIfNKt 文章中,Spring Cloud Alibaba 开发团队推荐了三者的依赖关系
 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-parent</artifactId>
                <version>${spring.boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring.cloud.alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>


创建ElasticSearchController


代码如下(示例):


package com.example.elasticsearchdemo.controller;
import com.example.elasticsearchdemo.model.Userinfo;
import com.example.elasticsearchdemo.service.ElasticsearchService;
import org.springframework.data.elasticsearch.core.SearchPage;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.Iterator;
/**
 * @author zhiwei Liao
 * @Description
 * @Date create in 2022/9/12 0012 21:03
 */
@RestController
public class ElasticSearchController {
    @Autowired
    private ElasticsearchService elasticsearchService;
    @GetMapping("/importData")
    public void importData() {
        elasticsearchService.importData();
    }
    @GetMapping("/search")
    public SearchPage<Userinfo> search(){
        return elasticsearchService.search();
    }
    @GetMapping("/findAll")
    public Iterator<Userinfo> findAll(){
        return elasticsearchService.findAll();
    }
}


创建ElasticsearchDao


代码如下(示例):


package com.example.elasticsearchdemo.dao;
/**
 * @author zhiwei Liao
 * @Description
 * @Date create in 2022/9/12 0012 21:03
 */
import com.example.elasticsearchdemo.model.Userinfo;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;
@Repository
//Userinfo对应实体 Long对应主键
public interface ElasticsearchDao extends ElasticsearchRepository<Userinfo,Long> {
}


创建Userinfo


代码如下(示例):


package com.example.elasticsearchdemo.model;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import java.io.Serializable;
/**
 * @author zhiwei Liao
 * @Description
 * @Date create in 2022/9/12 0012 21:03
 */
@Data
@Document(indexName = "user", shards = 2, replicas = 2)  //对应索引库和类型
public class Userinfo implements Serializable {
    @Id
    @Field(store = false, type = FieldType.Long)
    private long id;
    @Field(store = false, type = FieldType.Text,analyzer = "ik_smart",searchAnalyzer = "ik_smart")
    private String name;
    @Field(store = false, type = FieldType.Text,analyzer = "ik_smart",searchAnalyzer = "ik_smart")
    private String city;
    @Field(store = false, type = FieldType.Long)
    private Integer age;
    @Field(store = false, type = FieldType.Text,analyzer = "ik_smart",searchAnalyzer = "ik_smart")
    private String remark;
}


创建ElasticsearchService


代码如下(示例):


package com.example.elasticsearchdemo.service;
import com.example.elasticsearchdemo.model.Userinfo;
import org.springframework.data.elasticsearch.core.SearchPage;
import java.util.Iterator;
/**
 * @author zhiwei Liao
 * @Description
 * @Date create in 2022/9/12 0012 21:03
 */
public interface ElasticsearchService {
    void importData();
    SearchPage<Userinfo> search();
    Iterator<Userinfo> findAll();
}


创建ElasticsearchServiceImpl


代码如下(示例):


package com.example.elasticsearchdemo.service.impl;
import com.example.elasticsearchdemo.dao.ElasticsearchDao;
import com.example.elasticsearchdemo.model.Userinfo;
import com.example.elasticsearchdemo.service.ElasticsearchService;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.Aggregations;
import org.elasticsearch.search.aggregations.bucket.terms.ParsedLongTerms;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHitSupport;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.SearchPage;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
 * @author zhiwei Liao
 * @Description
 * @Date create in 2022/9/12 0012 21:03
 */
@Service
public class ElasticsearchServiceImpl implements ElasticsearchService {
    @Autowired
    private ElasticsearchDao dao;
    @Resource
    private ElasticsearchDao elasticsearchDao;
    @Resource
    private ElasticsearchRestTemplate elasticsearchTemplate;
    /** @description 导入数据
     * @params []
     * @return void
     * @author lxy
     * @date 2020/9/29 11:06
     **/
    @Override
    public void importData(){
        //从mysql查出所有数据 一般来说可以先查出来是一个对象javabean,然后转换成索引对象Userinfo就行,我这里是直接用的userinfo对象
        List<Userinfo> user = new ArrayList<>();
        Userinfo userinfo = new Userinfo();
        userinfo.setAge(25);
        userinfo.setCity("上海");
        userinfo.setName("廖志伟");
        userinfo.setRemark("remark");
        userinfo.setId(1);
        user.add(userinfo);
        //导入到es
        dao.saveAll(user);
    }
    /** @description es搜索
     * @params [parm]
     * @return java.util.List<com.bwwl.hive.model.Userinfo>
     * @author lxy
     * @date 2020/9/29 11:32
     **/
    @Override
    public SearchPage<Userinfo> search() {
        //TODO 构建查询对象用于封装各种查询条件  NativeSearchQueryBuilder
        //1.构建查询对象
        NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
        nativeSearchQueryBuilder.addAggregation(AggregationBuilders.terms("name")
                .field("age").size(30));
        SearchHits<Userinfo> search = elasticsearchTemplate.search(nativeSearchQueryBuilder.build(), Userinfo.class);
        int pageNo = 1;
        int pageSize = 5;
        Pageable pageable = PageRequest.of(pageNo - 1, pageSize);
        //7.获取分页数据
        SearchPage<Userinfo> searchPageResult = SearchHitSupport.searchPageFor(search, pageable);
        System.out.println(String.format("totalPages:%d, pageNo:%d, size:%d", searchPageResult.getTotalPages(), pageNo, pageSize));
        return searchPageResult;
    }
    @Override
    public Iterator<Userinfo> findAll() {
        return elasticsearchDao.findAll().iterator();
    }
}


创建application.yml


代码如下(示例):


server:
  port: 8098
spring:
  application:
    name: elasticsearch-demo
  elasticsearch:
    rest:
      username: elastic
      password: liaozhiwei
      uris: http://192.168.160.128:9200
      connection-timeout: 1000
      read-timeout: 1000


校验Elasticsearch是否正常工作


如下图(示例):


e6cc66c04d314aefa6019cfe5a32d850.png


6170f23e784d490fbafaad44bcd77f00.png

c7ace250246f42eaa56b12b1bb882769.png

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
16天前
|
Java
使用IDEA创建项目运行我的第一个JAVA文件输出Helloword
本文介绍了如何使用IDEA(IntelliJ IDEA)创建一个新的Java项目,并运行一个简单的Java程序输出"Hello Word"。文章详细展示了创建项目的步骤,包括选择JDK版本、设置项目名称和路径、创建包和类,以及编写和运行代码。最后,还展示了如何通过IDEA的运行功能来执行程序并查看输出结果。
40 4
使用IDEA创建项目运行我的第一个JAVA文件输出Helloword
|
27天前
|
缓存 Java 关系型数据库
【Java面试题汇总】ElasticSearch篇(2023版)
倒排索引、MySQL和ES一致性、ES近实时、ES集群的节点、分片、搭建、脑裂、调优。
【Java面试题汇总】ElasticSearch篇(2023版)
|
2天前
|
缓存 Java Maven
java: 警告: 源发行版 11 需要目标发行版 11 无效的目标发行版: 11 jdk版本不符,项目jdk版本为其他版本
如何解决Java项目中因JDK版本不匹配导致的编译错误,包括修改`pom.xml`文件、调整项目结构、设置Maven和JDK版本,以及清理缓存和重启IDEA。
7 1
java: 警告: 源发行版 11 需要目标发行版 11 无效的目标发行版: 11 jdk版本不符,项目jdk版本为其他版本
|
13天前
|
网络协议 Java Maven
多模块项目使用ElasticSearch报错
多模块项目使用ElasticSearch报错
19 6
|
16天前
|
算法 Java
Java项目不使用框架如何实现限流?
Java项目不使用框架如何实现限流?
23 2
|
1天前
|
jenkins Shell 持续交付
Jenkins持续集成GitLab项目 GitLab提交分支后触发Jenkis任务 持续集成 CI/CD 超级详细 超多图(一)
Jenkins持续集成GitLab项目 GitLab提交分支后触发Jenkis任务 持续集成 CI/CD 超级详细 超多图(一)
11 0
|
1天前
|
jenkins Shell 持续交付
Jenkins持续集成GitLab项目 GitLab提交分支后触发Jenkis任务 持续集成 CI/CD 超级详细 超多图(二)
Jenkins持续集成GitLab项目 GitLab提交分支后触发Jenkis任务 持续集成 CI/CD 超级详细 超多图(二)
10 0
|
28天前
|
JSON 自然语言处理 算法
ElasticSearch基础2——DSL查询文档,黑马旅游项目查询功能
DSL查询文档、RestClient查询文档、全文检索查询、精准查询、复合查询、地理坐标查询、分页、排序、高亮、黑马旅游案例
ElasticSearch基础2——DSL查询文档,黑马旅游项目查询功能
|
1月前
|
存储 NoSQL 数据处理
组合和继承怎么集成一个性能较好的项目
组合与继承是面向对象编程的核心概念,前者通过对象间关联实现高效解耦,后者则重用代码以节省空间和内存。组合常用于现代项目,利用代理与依赖注入简化代码管理;而继承简化了子模块对父模块资源的应用,但修改会影响整体。随着分层解耦及微服务架构如SpringCloud的出现,这些技术进一步优化了数据处理效率和服务响应性能,尤其在分布式存储与高并发场景下。同步异步调用、Redis分布式应用等也广泛运用组合与继承,实现代码和内存空间的有效复用。
|
1月前
|
机器学习/深度学习 存储 数据采集
Elasticsearch 与机器学习的集成
【9月更文第3天】Elasticsearch 不仅仅是一个强大的分布式搜索和分析引擎,它还是一个完整的数据平台,通过与 Kibana、Logstash 等工具结合使用,能够提供从数据采集、存储到分析的一站式解决方案。特别是,Elasticsearch 集成了机器学习(ML)功能,使得在实时数据流中进行异常检测和趋势预测成为可能。本文将详细介绍如何利用 Elasticsearch 的 ML 功能来检测异常行为或预测趋势。
34 4