最近在學習elasticseach,目前來說很火的全文搜索引擎。具體的,請參考官網,這里不多闡釋,主要這里就是把自己 搭建 整合 elasticsearch和spring boot整合,來分享給大家
1.首先環境准備。docker,springboot 2.1.6.RELEASE,cent-os 虛擬機
去官網 https://hub.docker.com/ 搜索elasticsearch
回車 搜索
點進去elasticsearch找到對應的版本,我這里建議 選6.8.1,為什么,一會再說
連接 虛擬機,有很多連接虛擬機的工具,我這里用的是SecureCRT , 因為6.8.1 版本運行起來,得制定虛擬機的運行大小,如果不指定的話,會啟動不起來,啟動
日志也有記錄:
登錄root用戶:執行以下命令:
sysctl -w vm.max_map_count=262144 指定大小
查看 是否設置成功
sysctl -a|grep vm.max_map_count
如果顯示
vm.max_map_count = 262144 說明操作成功。
ok ,基本設置完畢。開始用docker 拉取下來elasticsearch的鏡像
docker pull elasticsearch:6.8.1
拉取完畢,我們來運行它
docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -p 9200:9200 -p 9300:9300 --name myes2 你的iamgeid
這樣運行可以看到 系統啟動的日志,如果想系統后台的話 加個 -d 命令 docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9200:9200 -p 9300:9300 --name myes2 更多命令參數,請自行百度
啟動好后,看是否啟動成功,
執行:docker ps
可以看到,已經分配好了端口,9200 和 9300 並且已經映射好了
我們還可以修改elasticsearch的內部文件 執行
docker exec -it myes2 /bin/bash 進入到內部
對應的config文件夾下。就是配置。同樣的logs文件夾就是log
啟動 完后,測試下,是否可以在虛擬機里連接通
curl -a localhost:9200
這樣,就啟動好了。ok,虛擬機這邊配置好了,接下來,java端。
我測試的時候,是用的 spring-data-jpa方式,ok,廢話不多說,開始,首先是pom文件
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.JDBCTest</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <!-- <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.1</version> </dependency> <!-- https://mvnrepository.com/artifact/io.druid/druid-server --> <dependency> <groupId>io.druid</groupId> <artifactId>druid-server</artifactId> <version>0.12.3</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/com.alibaba/druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.18</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>com.liqs.myconfiguration</groupId> <artifactId>myconfiguration</artifactId> <version>3.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
因為測試的時候,,引用的其他的,我們暫時不關心,核心就是
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
配置啟動的時候的一些參數,我是用yml寫的
spring: data: elasticsearch: cluster-name: docker-cluster //指定 集群的名字。不知道的話,可以 cluster-nodes: 192.168.1.5:9300 //端口是9300 9200 是客戶端訪問的
集群的名字,不知道的話可以參考上面 執行 curl以后的結果,里面會有集群名字
寫一個bean 我們叫它book
package com.bean; import org.springframework.data.elasticsearch.annotations.Document;
//用 data的注解 document 指定 索引名,和類型,這里為了測試方便,我隨便起的名字 @Document(indexName = "test",type = "a") public class Book { private String name; private String content; private Integer id; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } }
在寫一個繼承
ElasticsearchCrudRepository 的接口
SearchJPA
package com.dao; import com.bean.Book; import com.bean.User; import org.springframework.data.elasticsearch.repository.ElasticsearchCrudRepository;
//ElasticsearchCrudRepository 會有兩個泛型,一個是指定要存入對象的類型。另外一個是主鍵的類型
public interface SearchJPA extends ElasticsearchCrudRepository<Book,Integer> { }
基本的都寫好了,來測試下
package com.controler; import com.bean.Book; import com.bean.User; import com.config.MqTest; import com.dao.SearchJPA; import com.dao.UserService; import com.liqs.config.MyClassService; import org.springframework.data.domain.Sort; import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.Resource; import java.util.HashMap; import java.util.Map; @Controller public class GetUserAction { @Resource private SearchJPA searchJPA; @RequestMapping("/getsearch") public String getElastic() { Book book = new Book(); book.setId(1); book.setName("mybook"); book.setContent("mybook is written by liqs"); searchJPA.save(book); } }
我們在瀏覽器訪問 http://localhost:8080/getsearch 端口 自己的服務器是什么,填寫什么,我的是8080 默認的
ok 沒報錯,我們看下數據是不是真的進入了,這里我用的postman
可以看到 數據是已經存入了,到此結束
遇到的問題,坑,總結一下
1.首先一個是,第一次啟動es的時候,沒有指定 ES_JAVA_OPTS 導致,啟動雖然成功了,但是訪問的時候,總是失敗,后來百度了下,是因為 默認得分配4g空間大小。我這里沒這么多,就按照網上設置的 ES_JAVA_OPTS="-Xms256m -Xmx256m" 就可以了。
2.版本匹配的問題,之前為什么說建議用6.8.1 版本呢,是因為 筆者用這個版本合成功了,如果想用其他版本的話,得參照官方的版本比對
https://github.com/spring-projects/spring-data-elasticsearch
如果 你的系統報類似於找不到節點的錯誤,請檢查
1.你的es服務是否真的啟動好了。
2.你的集群的名字是否和你真正的es的集群名字一致
3.你的端口寫的是否正確