本地安装单机ElasticSearch,elasticsearch-head,logstash,并整合springboot

版本:

elasticsearch-6.2.4   elasticsearch-jdbc-2.3.2.0   elasticsearch-jdbc-2.3.2.0  jdk1.8

整体用到的文件:之后上传到下载的地方。

本地安装单机ElasticSearch,elasticsearch-head,logstash,并整合springboot_第1张图片

elasticsearch安装:

1:解压之后,进入elasticsearch-6.2.4\bin目录,执行elasticsearch.bat

     不退出说明运行成功。报错的话可以在elasticsearch-6.2.4\logs中查看。

2:访问http://127.0.0.1:9200/,访问成功,显示如下:

本地安装单机ElasticSearch,elasticsearch-head,logstash,并整合springboot_第2张图片

说明安装成功。

安装elasticsearch-head-master

1:解压之后,进入elasticsearch-head-master目录,执行 grunt server 启动head

如图,在此之前需要安装一下node.js:

node.js:      https://www.runoob.com/nodejs/nodejs-install-setup.html

本地安装单机ElasticSearch,elasticsearch-head,logstash,并整合springboot_第3张图片

2:重启一下elasticSearch,访问http://localhost:9100/,如下,下面的索引是我测试建的。

本地安装单机ElasticSearch,elasticsearch-head,logstash,并整合springboot_第4张图片

配置elasticsearch-analysis-ik-master分词器

1:解压,进入elasticsearch-analysis-ik-master文件夹,执行 mvn clean assembly:assembly 将项目打包成zip包,不要打成

jar包,打成jar包后续解压会出错。

本地安装单机ElasticSearch,elasticsearch-head,logstash,并整合springboot_第5张图片

2:打包成功后会在elasticsearch-analysis-ik-master\target\releases目录下生成zip包

3:将其加压到elasticsearch-6.2.4\plugins目录下,重启elasticSearch

4:测试,查看已经进行了分词。


本地安装单机ElasticSearch,elasticsearch-head,logstash,并整合springboot_第6张图片

安装logstash-6.2.4,实现与mysql的数据同步

1:解压elasticsearch-jdbc-2.3.2.0并设置环境变量JDBC_IMPORTER_HOME,变量值为elasticsearch-jdbc-2.3.2.0存放目录

本地安装单机ElasticSearch,elasticsearch-head,logstash,并整合springboot_第7张图片

2:解压logstash-6.2.4,进入logstash-6.2.4\bin目录,新建mysql-pipelines.yml文件,输入

input {
  jdbc {
    jdbc_driver_library => "C:\Users\rongji\Desktop\springboot\all\ES6\mysql-connector-java-5.1.6.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/mysql"
    jdbc_user => "root"
    jdbc_password => "123456"
    jdbc_paging_enabled => true
    connection_retry_attempts => 3
    connection_retry_attempts_wait_time => 1
    jdbc_pool_timeout => 5
    lowercase_column_names => true
    schedule => "* * * * *"
    statement => "SELECT * from sys_user where gmt_modified  > :sql_last_value"
    type => "sysuser"
  }
}
output {
    elasticsearch {
        index => "myindex1"
        document_type => "%{type}"
        hosts => "127.0.0.1:9200"
        template_overwrite => true
    }

}

需要修改的地方:

jdbc_driver_library :修改为自己的mysql驱动所在的位置

jdbc_connection_string :修改为自己的数据库地址

jdbc_user:连接数据库用户名

jdbc_password :连接数据库的密码

schedule :定时任务,多久执行一次,这里设置的是每分钟

statement :sql语句,这里的sql_last_value指的是最后一次同步的时间,不然会一直重复增加。

elasticsearch :这里设置的就是自己的elasticsearch的安装地址和端口,以及输出的索引和类型。

3:运行,在logstash-6.2.4\bin目录下执行logstash -f mysql-pipelines.yml命令。


此时运行,如果报找不到或者无法加载jdk主类,修改logstash-6.2.4\bin文件下的logstash.bat,

找到并修改为:      %JAVA% %JAVA_OPTS% -cp "%CLASSPATH%" org.logstash.Logstash %*

区别就是%CLASSPATH%加了双引号。

重新启动,成功。

4:测试,打开http://localhost:9100/,可以看到索引处多了刚才新建的myindex1.数据也都全部同步。

本地安装单机ElasticSearch,elasticsearch-head,logstash,并整合springboot_第8张图片


问题: 无法远程连接,默认只允许本机连接,可以修改配置文件 elasticsearch/config/elasticsearch.yml,添加

http.cors.enabled: true
http.cors.allow-origin: "*"
transport.host: localhost
transport.tcp.port: 9300
http.port: 9200

network.host: 0.0.0.0


springboot整合elasticSearch

1:引入依赖


<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-data-elasticsearchartifactId>
dependency>

2:在application.yml中添加elasticSearch的相关配置

spring:
  data:
    elasticsearch:
          cluster-name: elasticsearch           #配置集群名称
          cluster-nodes: 127.0.0.1:9300         #配置es的ip和端口号,更多加逗号隔开

3:在dao层定义一个接口继承ElasticsearchRepository,其中实现了操作elasticSearch的基本操作方法。有需要可以自己扩展。

import org.apache.ibatis.annotations.Mapper;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Component;

@Component
@Mapper
public interface UserSearchRepository extends ElasticsearchRepository {
}

4:建立SysUser对象

import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

/**
 * index相当于数据库的名字,type相当于数据库中的表,Document相当于数据库中的一行
 * indexStoreType:索引文件的存储类型
 * shards:分区数
 * replicas:分区的备份数
 * refreshInterval:刷新的间隔数
 */
@Document(indexName="demo",type="sysuser",indexStoreType="fs",shards=5,replicas=1,refreshInterval="-1")
public class SysUser implements Serializable{
    private static final long serialVersionUID = 1L;
    //指定对象的id,也就是主键
    @Id
    private Long userId;
    // 用户名
    private String username;
    // 用户真实姓名
    private String name;
    // 密码
    private String password;
    // 部门
    private Long deptId;
    private String deptName;
    // 邮箱
    private String email;
    // 手机号
    private String mobile;
    // 状态 0:禁用,1:正常
    private Integer status;
    // 创建用户id
    private Long userIdCreate;
    // 创建时间
    private Date gmtCreate;
    // 修改时间
    private Date gmtModified;
    //角色
    private List roleIds;
    //性别
    private Long sex;
    //出身日期
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date birth;
    //图片ID
    private Long picId;
    //现居住地
    private String liveAddress;
    //爱好
    private String hobby;
    //省份
    private String province;
    //所在城市
    private String city;
    //所在地区
    private String district;

set,get方法等省略。

5:测试使用:

注入:

@Autowired
private UserSearchRepository searchRepository;

保存数据:

/**
 * 添加
 */
@RequestMapping("/add")
public void testSaveArticleIndex() {
    SysUser user = new SysUser();
    user.setUserId(new Long(111));
    user.setUsername("我不");
    user.setPassword("123");
    user.setEmail("345.com");
    SysUser user1 = new SysUser();
    user1.setUserId(new Long(222));
    user1.setUsername("不认");
    user1.setPassword("123");
    user1.setEmail("345.com");
    SysUser user2 = new SysUser();
    user2.setUserId(new Long(333));
    user2.setUsername("认识");
    user2.setPassword("123");
    user2.setEmail("345.com");
    //不存在添加,存在更新
    searchRepository.save(user1);
    searchRepository.save(user2);
    searchRepository.save(user);
}

执行成功后,查询可以看到保存成功。
数据如果存在的话,更新数据,不存在,保存数据。



更新数据:

@RequestMapping("/update")
public void testSaveArticleIndex() {
    SysUser user2 = new SysUser();
    user2.setUserId(new Long(333));
    user2.setUsername("测试");
    user2.setPassword("123");
    user2.setEmail("345.com");
    user2.setName("认识路");
    //不存在添加,存在更新
    searchRepository.save(user2);
}

可以看到发生了改变:
本地安装单机ElasticSearch,elasticsearch-head,logstash,并整合springboot_第9张图片


查询数据:也可以通过界面操作
@RequestMapping("/query")
public void testSearch() {
    //String queryString = "ce";//搜索关键字
    // 根据地址值过滤
    Pageable page = new PageRequest(0,10);
    BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();

    queryBuilder.filter(QueryBuilders.matchQuery("username","我不认识路"));
    SearchQuery query =
            new NativeSearchQueryBuilder().withQuery(queryBuilder).withPageable(page).build();
    Page searchResult = searchRepository.search(query);
    List list =  searchResult.getContent();
    
for(SysUser user:list){
    System.out.println(user); 
}


如上查询的是满足username包含认识的,进行了分词查询。


以下这种查询是查询所有字段中的关键字,只要有一个字段中包含关键字,就会返回。

@RequestMapping("/query1")
public void testSearch() {
 //进行分词查询,不管哪个字段里面包含,只要含有就返回
    String queryString = "我不认识路";//搜索关键字
    QueryStringQueryBuilder builder = new QueryStringQueryBuilder(queryString);
    Iterable sea = searchRepository.search(builder);
    Iterator iterator = sea.iterator();
    while (iterator.hasNext()) {
        System.out.println(iterator.next());
    }
}
可以看到,name中包含的也查出来了。
本地安装单机ElasticSearch,elasticsearch-head,logstash,并整合springboot_第10张图片
删除数据:
searchRepository.delete(user1);

你可能感兴趣的:(elasticSearch,elasticSearch,mysql,head,ik,springboot)