前言
本章讲解Spring+Spring Data ElasticSearch的整合操作
方法
1.概念
我们知道,Spring Data 是持久层通用解决方案,支持关系型数据库 Oracle、MySQL、非关系型数据库NoSQL、Map-Reduce 框架、云基础数据服务 、搜索服务。Spring Data 包含多个子项目,其中就有我们要学习的Spring Data ElasticSearch
2.环境搭建
1)创建相应工程
我们本次创建的是spring的普通工程!
2)修改pom文件
<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>
<groupId>cn.edu.ccut</groupId>
<artifactId>spring-springdata-jpa</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<!-- 设定Java的版本 -->
<java.version>1.8</java.version>
<!-- 设定Spring的版本 -->
<spring.version>5.1.9.RELEASE</spring.version>
</properties>
<dependencies>
<!-- 引入Spring相关jar -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- springData Elasticsearch相关jar -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>3.2.0.RELEASE</version>
</dependency>
<!-- 引入spring整合JUnit测试包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
<!-- 引入JUnit测试包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- slf4j转换log4j -->
<!-- <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.26</version>
</dependency> -->
</dependencies>
</project>
3)配置applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"
xsi:schemaLocation="http://www.springframework.org/schema/data/elasticsearch https://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
<elasticsearch:repositories base-package="cn.edu.ccut" />
<elasticsearch:rest-client id="restClient"
hosts="http://localhost:9200" />
<bean name="elasticsearchRestTemplate"
class="org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate">
<constructor-arg name="client" ref="restClient" />
</bean>
</beans>
3.整合测试
1)编写实体类Person
package cn.edu.ccut.bo;
import java.io.Serializable;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
@Document(indexName="jwang01",type="_doc")
public class Person implements Serializable{
@Field(name="id")
private String id;
@Field(name="name")
private String name;
@Field(name="age")
private Integer age;
@Field(name="email")
private String email;
@Field(name="hobby")
private String hobby;
public Person() {
super();
// TODO Auto-generated constructor stub
}
public Person(String id, String name, Integer age, String email, String hobby) {
super();
this.id = id;
this.name = name;
this.age = age;
this.email = email;
this.hobby = hobby;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getHobby() {
return hobby;
}
public void setHobby(String hobby) {
this.hobby = hobby;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + ", email=" + email + ", hobby=" + hobby + "]";
}
}
2)编写整体测试代码
package cn.edu.ccut.test;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "classpath:applicationContext.xml" })
public class PersonTest {
@Autowired
private ElasticsearchRestTemplate elasticsearchRestTemplate;
@Test
public void testOK(){
System.out.println("this is good");
}
}
运行后如果没有异常,则证明我们环境配置成功。
注意:本次仅仅列举出下面示例的方法,请大家自行验证,本人已验证成功!
3)添加文档方法
@Test
public void testCreateDoc() throws Exception{
Person person = new Person("1005","陈立志",23,"2345631234@qq.com","跳舞、踢足球、下围棋");
IndexQuery indexQuery = new IndexQueryBuilder()
.withId(person.getId().toString())
.withObject(person)
.build();
String documentId = elasticsearchRestTemplate.index(indexQuery);
System.out.println(documentId);
}
4)根据id查询文档
@Test
public void testSearchDoc01() {
Person person = elasticsearchRestTemplate.queryForObject(GetQuery.getById("1001"), Person.class);
System.out.println(person);
}
5)根据id删除文档
@Test
public void testDeleteDoc() throws Exception{
String documentId = elasticsearchRestTemplate.delete(Person.class, "1005");
System.out.println(documentId);
}
6)根据id更新文档
@Test
public void testUpdateDoc() throws Exception{
Map<String, Object> jsonMap = new HashMap<>();
jsonMap.put("name", "张三");
UpdateRequest updateRequest = new UpdateRequest("jwang01", "_doc", "1001").doc(jsonMap);
UpdateQuery query = new UpdateQueryBuilder()
.withClass(Person.class)
.withId("1001")
.withUpdateRequest(updateRequest)
.build();
elasticsearchRestTemplate.update(query);
}
7)查询指定index的所有数据
@Test
public void testSearchDoc02() throws Exception{
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.matchAllQuery())
.build();
List<Person> result = elasticsearchRestTemplate.queryForList(searchQuery, Person.class);
for(Person person : result){
System.out.println(person);
}
}
8)查询爱好中包含篮球的数据
@Test
public void testSearchDoc03() throws Exception{
SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(QueryBuilders.matchQuery("hobby", "篮球"))
.build();
List<Person> result = elasticsearchRestTemplate.queryForList(searchQuery, Person.class);
for(Person person : result){
System.out.println(person);
}
}
我们可以发现,整合了之后运用ElasticsearchTemplate,操作ES会变的更加方便!