整合Spring Data Elasticsearch
如何查看官方文档(了解)
官方文档:Java High Level REST Client | Java REST Client [6.8] | Elastic
下面是获得文档的方式(可以不用看):
1.步骤一:查询“文档”
1.步骤二:查看“客户端Client”文档
1.步骤三:查看基于REST的api
1.步骤四:确定使用的版本
1.步骤五:选择使用的API基本
- Low Level Rest Client是低级别封装,提供一些基础功能,但更灵活
- High Level Rest Client,是在Low Level Rest Client基础上进行的高级别封装,功能更丰富和完善
简介
Spring Data Elasticsearch是Spring Data项目下的一个子模块。
简化了原生的Elasticsearch的开发。
什么是spring data
查看 Spring Data的官网:http://projects.spring.io/spring-data/
Spring Data 是的使命是给各种数据访问提供统一的编程接口,不管是关系型数据库(如MySQL),还是非关系数据库(如Redis),或者类似Elasticsearch这样的索引数据库。从而简化开发人员的代码,提高开发效率。
包含很多不同数据操作的模块:
什么是spring data elasticsearch
Spring Data Elasticsearch的页面:https://projects.spring.io/spring-data-elasticsearch/
特征:
- 支持Spring的基于@Configuration的java配置方式
- 提供了用于操作ES的便捷工具类ElasticsearchTemplate。包括实现文档到POJO之间的自动智能映射。
- 利用Spring的数据转换服务实现的功能丰富的对象映射
- 基于注解的元数据映射方式,而且可扩展以支持更多不同的数据格式
- 根据持久层接口自动生成对应实现方法,无需人工编写基本操作代码(类似mybatis,根据接口自动得到实现)。当然,也支持人工定制查询
版本限定
https://docs.spring.io/spring-data/elasticsearch/docs/4.2.1/reference/html/#preface.versions
创建Demo工程
我们新建一个test-elasticsearch,学习Elasticsearch
1.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"> <parent> <artifactId>changgou4-parent-ali</artifactId> <groupId>com.czxy.changgou</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>test-elasticsearch</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies> </project>
1.配置工具类
Initialization | Java REST Client [6.8] | Elastic package com.czxy.changgou4.config; import org.elasticsearch.client.RestHighLevelClient; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.elasticsearch.client.ClientConfiguration; import org.springframework.data.elasticsearch.client.RestClients; import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration; import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories; /** * @author 桐叔 * @email liangtong@itcast.cn */ @Configuration @EnableElasticsearchRepositories public class RestClientConfig extends AbstractElasticsearchConfiguration { @Override @Bean public RestHighLevelClient elasticsearchClient() { final ClientConfiguration clientConfiguration = ClientConfiguration.builder() .connectedTo("localhost:9200") .build(); return RestClients.create(clientConfiguration).rest(); } }
1.启动类
package com.czxy.changgou4; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * @author 桐叔 * @email liangtong@itcast.cn */ @SpringBootApplication public class TestESApplication { public static void main(String[] args) { SpringApplication.run(TestESApplication.class,args); } }
1.测试类
package com.czxy.changgou4; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; /** * @author 桐叔 * @email liangtong@itcast.cn */ @RunWith(SpringRunner.class) @SpringBootTest(classes = TestESApplication.class) public class TestES { @Test public void testDemo() { System.out.println("...."); } }
1.索引操作
创建索引和映射
2.实体类:首先我们准备好实体类:
public class Item { private Long id; private String title; //标题 private String category; //分类 private String brand; //品牌 private Double price; //价格 private String images; //图片地址 }
1.映射
Spring Data通过注解来声明字段的映射属性,有下面的三个注解:
@Document 作用在类,标记实体类为文档对象,一般有两个属性
- indexName:对应索引库名称
- type:对应在索引库中的类型
- shards:分片数量,默认5
- replicas:副本数量,默认1
@Id 作用在成员变量,标记一个字段作为id主键
@Field 作用在成员变量,标记为文档的字段,并指定字段映射属性:
- type:字段类型,是是枚举:FieldType
- index:是否索引,布尔类型,默认是true
- store:是否存储,布尔类型,默认是false
- analyzer:分词器名称
示例:
@Document(indexName = "item",type = "docs", shards = 1, replicas = 0) public class Item { @Id private Long id; @Field(type = FieldType.Text, analyzer = "ik_max_word") private String title; //标题 @Field(type = FieldType.Keyword) //不分词 private String category;// 分类 @Field(type = FieldType.Keyword) private String brand; // 品牌 @Field(type = FieldType.Double) private Double price; // 价格 @Field(index = false, type = FieldType.Keyword) private String images; // 图片地址 }
创建索引
package com.czxy; import com.czxy.changgou4.TestESApplication; import com.czxy.changgou4.domain.Item; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate; import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; import org.springframework.test.context.junit4.SpringRunner; import javax.annotation.Resource; /** * @author 桐叔 * @email liangtong@itcast.cn */ @RunWith(SpringRunner.class) @SpringBootTest(classes = TestESApplication.class) public class TestES { @Resource private ElasticsearchRestTemplate elasticsearchTemplate; @Test public void testCreateIndex() { elasticsearchTemplate.createIndex(Item.class); } }
可以根据类的信息自动生成,也可以手动指定indexName和Settings
映射
映射相关的API:
一样,可以根据类的字节码信息(注解配置)来生成映射,或者手动编写映射
我们这里采用类的字节码信息创建索引并映射:
package com.czxy; import com.czxy.pojo.Item; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; import org.springframework.test.context.junit4.SpringRunner; import javax.annotation.Resource; /** * Created by liangtong. */ @RunWith(SpringRunner.class) @SpringBootTest(classes = ESApplication.class) public class TestES { @Resource private ElasticsearchTemplate elasticsearchTemplate; @Test public void createIndex(){ elasticsearchTemplate.createIndex(Item.class ); elasticsearchTemplate.putMapping(Item.class); } }
结果: