1、在使用SpringBoot整合Elasticsearch 之前,了解下它们之间的版本对应关系:
Spring Boot Version (x) | Spring Data Elasticsearch Version (y) | Elasticsearch Version (z) |
---|---|---|
x <= 1.3.5 | y <= 1.3.4 | z <= 1.7.2* |
x >= 1.4.x | 2.0.0 <=y < 5.0.0** | 2.0.0 <= z < 5.0.0** |
使用SpringBoot整合Elasticsearch,一般都是使用 SpringData 进行封装的,然后再dao层接口继承ElasticsearchRepository 类,该类实现了很多的方法,比如常用的CRUD方法。这里使用Elasticsearch 5.6.11+SpringBoot 2.0.5+JDK 1.8版本搭建开发环境。
2、pom配置
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>5.6.11</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<version>2.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>3.0.10.RELEASE</version>
</dependency>
2、application.properties的配置
spring.data.elasticsearch.repositories.enabled = true //使用elasticsearch仓库
spring.data.elasticsearch.cluster-nodes = 127.0.0.1:9300 //默认
spring.data.elasticsearch.cluster-name = my-application //要与elasticsearch.yml中使用的集群名称一致
3、索引与查询实例
entity层:
package com.exm.springmybatis.entity;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import java.io.Serializable;
import java.util.Date;
@Document(indexName ="es_article",type = "article",indexStoreType = "fs",shards = 5,replicas = 1)
public class Article implements Serializable {
@Id
private Long id;
private String title; //标题
private String abstracts; //摘要
private String content; //内容
private Date postTime; //发表时间
//set和get方法省略了
}
使用SpringData的时候,它需要在实体类中设置indexName 和type ,如果和传统型数据库比较的话,就相当于库和表。需要注意的是indexName和type都必须是小写!!!
dao层:
package com.exm.springmybatis.dao;
import com.exm.springmybatis.entity.Article;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;
public interface ArticleSearchRepository extends ElasticsearchRepository<Article,Long> {
}
dao层只需继承ElasticsearchRepository该类。其中主要的方法就是 save、delete和search,其中save方法相当如insert和update,没有就新增,有就覆盖。delete方法主要就是删除数据以及索引库。至于search就是查询了,包括一些常用的查询,如分页、权重之类的。
controller层:
package com.exm.springmybatis.controller;
import com.exm.springmybatis.dao.ArticleSearchRepository;
import com.exm.springmybatis.entity.Article;
import org.elasticsearch.index.query.QueryStringQueryBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
import java.util.Iterator;
@RestController
public class ESController {
@Autowired
ArticleSearchRepository articleSearchRepository;
@RequestMapping("/add")
public void testSaveArticleIndex() {
Article article = new Article();
article.setId(1L);
article.setTitle("springboot integreate elasticsearch");
article.setAbstracts("springboot integreate elasticsearch is very easy");
article.setContent("elasticsearch based on lucene");
article.setPostTime(new Date());
articleSearchRepository.save(article);
}
@RequestMapping("/query")
public void testSearch() {
String queryString = "springboot";//搜索关键字
QueryStringQueryBuilder builder = new QueryStringQueryBuilder(queryString);
Iterable<Article> searchResult = articleSearchRepository.search(builder);
Iterator<Article> iterator = searchResult.iterator();
while (iterator.hasNext()) {
Article article = iterator.next();
System.out.println(article.getContent());
}
}
}
Controller层注意类注释是@RestController。由于例子比较简单Server层就没有写了。
搜索:http://localhost:8090/query
head查看索引:http://localhost:9100