版本:
elasticsearch-6.2.4 elasticsearch-jdbc-2.3.2.0 elasticsearch-jdbc-2.3.2.0 jdk1.8
整体用到的文件:之后上传到下载的地方。
elasticsearch安装:
1:解压之后,进入elasticsearch-6.2.4\bin目录,执行elasticsearch.bat
不退出说明运行成功。报错的话可以在elasticsearch-6.2.4\logs中查看。
2:访问http://127.0.0.1:9200/,访问成功,显示如下:
说明安装成功。
安装elasticsearch-head-master
1:解压之后,进入elasticsearch-head-master目录,执行 grunt server 启动head
如图,在此之前需要安装一下node.js:
node.js: https://www.runoob.com/nodejs/nodejs-install-setup.html
2:重启一下elasticSearch,访问http://localhost:9100/,如下,下面的索引是我测试建的。
配置elasticsearch-analysis-ik-master分词器
1:解压,进入elasticsearch-analysis-ik-master文件夹,执行 mvn clean assembly:assembly 将项目打包成zip包,不要打成
jar包,打成jar包后续解压会出错。
2:打包成功后会在elasticsearch-analysis-ik-master\target\releases目录下生成zip包
3:将其加压到elasticsearch-6.2.4\plugins目录下,重启elasticSearch
4:测试,查看已经进行了分词。
安装logstash-6.2.4,实现与mysql的数据同步
1:解压elasticsearch-jdbc-2.3.2.0,并设置环境变量JDBC_IMPORTER_HOME,变量值为elasticsearch-jdbc-2.3.2.0存放目录
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/config/elasticsearch.yml,添加
http.cors.allow-origin: "*"
transport.host: localhost
transport.tcp.port: 9300
http.port: 9200
network.host: 0.0.0.0
springboot整合elasticSearch
1:引入依赖
<!-- elasticsearch --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </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<SysUser,Long> { }
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<Long> 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); } 可以看到发生了改变:
![](https://i-blog.csdnimg.cn/blog_migrate/53f6a6578d291fdeafebadce249ed991.png)
查询数据:也可以通过界面操作
@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<SysUser> searchResult = searchRepository.search(query); List<SysUser> list = searchResult.getContent();
for(SysUser user:list){ System.out.println(user); }}
如上查询的是满足username包含认识的,进行了分词查询。
![](https://i-blog.csdnimg.cn/blog_migrate/1043bb73f7d931712238ac08005e345d.png)
以下这种查询是查询所有字段中的关键字,只要有一个字段中包含关键字,就会返回。
@RequestMapping("/query1") public void testSearch() {
//进行分词查询,不管哪个字段里面包含,只要含有就返回 String queryString = "我不认识路";//搜索关键字 QueryStringQueryBuilder builder = new QueryStringQueryBuilder(queryString); Iterable<SysUser> sea = searchRepository.search(builder); Iterator<SysUser> iterator = sea.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); } } 可以看到,name中包含的也查出来了。
![](https://i-blog.csdnimg.cn/blog_migrate/92d415d8f4d378f06092f3b104211e4e.png)
删除数据:
searchRepository.delete(user1);