一、ElasticSearch简介
我们的应用经常需要添加检索功能,开源的 ElasticSearch 是目前全文搜索引擎的首选。它可以快速的存储、搜索和分析海量数据。
Spring Boot通过整合Spring Data ElasticSearch为我们提供了非常便捷的检索功能支持;
Elasticsearch是一个分布式搜索服务,提供Restful API,底层基于Lucene,采用多shard(分片)的方式保证数据安全,并且提供自动resharding的功能,github等大型的站点也是采用了ElasticSearch作为其搜索服务。
二、安装ElasticSearch
使用docker在Linux虚拟机上安装elasticsearch。
1、下载命令(下载时如果不指定版本,默认下载lastest,但是下载时找不到,这里指定版本6.5.0)
docker pull docker.io/elasticsearch:6.5.0
2、启动命令
注意:由于elasticsearch是用java写的,启动时会占用2个G的堆内存,所以启动时需要使用 -e 命令指定堆内存大小。
docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9200:9200 -p 9300:9300 --name ES01 ff171d17e77c
-e:指定堆内存大小
-d:表示后台运行
-p:映射端口,9200:默认进行web通信端口,9300:分布式情况下,ES各个节点之间通信的接口
–name:指定名称
ff171d17e77c:镜像ID
3、查看是否启动成功
在浏览器中输入:192.168.199.220:9200
(192.168.199.220为虚拟主机的地址)
发现访问失败,
4、为什么会失败,我们可以查看该容器的日志
①查看所有的容器
docker ps -a
②查看elasticsearch对应容器的日志
docker logs 47ca4faf916c
5、找到错误日志
可以看出:空间内存的问题
6、解决办法
①在 /etc/sysctl.conf 追加最大虚拟空间限制 vm.max_map_count=655360
使用vi /etc/sysctl.conf 命令进入编辑页面
②让新增配置生效
sysctl -p
③重新启动elasticsearch容器
docker start 47ca4faf916c
7、验证是否成功
还是输入:192.168.199.220:9200
当看到这个表示成功!!!
三、SpringBoot整合ElasticSearch
1、引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
2、application.properties配置
#cluster-name,需要在浏览器中输入192.168.199.220:9200,来获取
spring.data.elasticsearch.cluster-name=docker-cluster
#es访问路径
spring.data.elasticsearch.cluster-nodes=192.168.199.220:9200
3、使用ElasticsearchRepository实现
①创建接口继承ElasticsearchRepository
public interface BookRepository extends ElasticsearchRepository<Book,Integer> {
public List<Book> findbyBookName(String bookName);
}
②创建实体类
@Document(indexName = "pyf",type = "book")
public class Book implements Serializable
{
private static final long serialVersionUID = -7976701701859021216L;
private Integer id;
private String bookName;
private String author;
}
③测试代码
@SpringBootTest
class SpringbootElasticApplicationTests {
@Autowired
private BookRepository bookRepository;
@Test
public void saveIndex(){
Book book = new Book();
book.setId(1);
book.setBookName("斗破");
book.setAuthor("土豆");
bookRepository.index(book);
}
@Test
public void searchIndex(){
// Iterable<Book> all = bookRepository.findAll();
List<Book> bookList = bookRepository.findbyBookName("破");
}
}
4、使用ElasticsearchTemplate实现
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
@Test
public void saveIndex02(){
Book book = new Book();
book.setId(2);
book.setBookName("遮天");
book.setAuthor("辰东");
boolean index = elasticsearchTemplate.createIndex("index",book);
}