elasticsearch学习二
第二章Spring Data ElasticSearch
1.Spring Data ElasticSearch简介
1.1什么是Spring Data
Spring Data是一个用于简化数据库访问,并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务。 Spring Data可以极大的简化JPA的写法,可以在几乎不用写实现的情况下,实现对数据的访问和操作。除了CRUD外,还包括如分页、排序等一些常用的功能。
Spring Data的官网:http://projects.spring.io/spring-data/
Spring Data常用的功能模块如下:
1.2什么是Spring Data ElasticSearch
Spring Data ElasticSearch 基于 spring data API 简化 elasticSearch操作,将原始操作elasticSearch的客户端API 进
行封装 。Spring Data为Elasticsearch项目提供集成搜索引擎。Spring Data Elasticsearch POJO的关键功能区域为
中心的模型与Elastichsearch交互文档和轻松地编写一个存储库数据访问层。
官方网站:http://projects.spring.io/spring-data-elasticsearch/
2.Spring Data ElasticSearch入门
2.1需求
需求: 保存Article
步骤:
- 创建Maven工程(jar),在pom文件导入坐标
- 创建pojo, 添加注解
- 创建Dao接口继承ElasticsearchRepository
- 创建配置文件进行配置
- 测试
2.2代码实现
- 创建Maven工程(jar),导入坐标
<dependencies>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>5.6.8</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>5.6.8</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-to-slf4j</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.24</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>3.0.7.RELEASE</version>
</dependency>
</dependencies>
- 创建pojo, 添加注解
/** * @Document:放置到类上 * indexName = "blog1":表示索引的名称,(小写) * type = "article":表示类型 * @Id:放置到字段id上 * 表示该字段的值存放到索引库的_id字段上,表示主键 * @Field:放置到字段上 * store = true:表示该字段的值存储到索引库 * index = true:表示该字段的值要建立索引用于搜索 * analyzer = "ik_smart":建立索引的时候使用什么分词器 * searchAnalyzer = "ik_smart":数据搜索的时候使用什么分词器(可以不写) * type = FieldType.Text:存放字段的数据类型 */ @Document(indexName = "blog03",type = "article") public class Article implements Serializable { @Id private Long id; @Field(index = true,searchAnalyzer = "ik_smart",analyzer = "ik_smart",store = true,type = FieldType.Text) private String title; @Field(index = true,searchAnalyzer = "ik_smart",analyzer = "ik_smart",store = true,type = FieldType.Text) private String content; public Article() { } public Article(long id, String title, String content) { this.id = id; this.title = title; this.content = content; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } @Override public String toString() { return "Article{" + "id=" + id + ", title='" + title + '\'' + ", content='" + content + '\'' + '}'; } }
- 创建Dao接口继承ElasticsearchRepository
public interface ArticleDao extends ElasticsearchRepository<Article,Long>{ }
- 创建配置文件进行配置
<?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" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/data/elasticsearch http://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="com.itheima"></context:component-scan> <!-- 1:扫描Dao包,自动创建实例,扫描所有继承ElasticsearchRepository接口的接口 --> <elasticsearch:repositories base-package="com.itheima.dao"></elasticsearch:repositories> <!--2.配置elasticSearch的连接--> <elasticsearch:transport-client id="client" cluster-nodes="127.0.0.1:9300" cluster-name="elasticsearch"></elasticsearch:transport-client> <!--3.注册模版--> <bean id="elasticsearchTemplate" class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate"> <constructor-arg name="client" ref="client"></constructor-arg> </bean> </beans>
- 测试
@RunWith(value = SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:applicationContext.xml") public class EsTest { @Autowired private ElasticsearchTemplate elasticsearchTemplate; @Autowired private ArticleDao articleDao; @Test //创建索引和映射 public void fun01(){ elasticsearchTemplate.createIndex(Article.class); elasticsearchTemplate.putMapping(Article.class); } @Test //保存文章 public void fun02(){ Article article = new Article(1, "测试title", "测试内容"); articleDao.save(article); } }
3.Spring Data ElasticSearch常见操作
3.1CRUD
- 新增,
@Test //保存文章 public void fun02(){ Article article = new Article(1, "测试title", "测试内容"); articleDao.save(article); }
- 删除
@Test //删除 public void fun03(){ articleDao.deleteById(4L); }
- 更新; 没有id对应的数据,就是新增; 有当前id对应的数据,就是更新
@Test //修改 public void fun04(){ Article article = new Article(4, "测试标题4", "测试内容4"); articleDao.save(article); }
- 根据id查询
@Test //根据id查询 public void fun05(){ Article article = articleDao.findById(1L).get(); System.out.println(article); }
- 查询所有
@Test //根据所有 public void fun06(){ Iterable<Article> iterable = articleDao.findAll(); for (Article article : iterable) { System.out.println(article); } }
- 排序查询
@Test //排序 public void fun07(){ Iterable<Article> iterable = articleDao.findAll( Sort.by(Sort.Order.asc("id"))); for (Article article : iterable) { System.out.println(article); } }
- 分页查询
@Test //分页查询 public void fun08(){ Pageable pageable = PageRequest.of(0,2); Page<Article> page = articleDao.findAll(pageable); System.out.println("总数量="+page.getTotalPages()); System.out.println("结果="+page.getContent()); }
3.2自定义查询
- 常用查询命名规则
关键字 | 命名规则 | 解释 | 示例 |
---|---|---|---|
and | findByField1AndField2 | 根据Field1和Field2获得数据 | findByTitleAndContent |
or | findByField1OrField2 | 根据Field1或Field2获得数据 | findByTitleOrContent |
is | findByField | 根据Field获得数据 | findByTitle |
not | findByFieldNot | 根据Field获得补集数据 | findByTitleNot |
between | findByFieldBetween | 获得指定范围的数据 | findByPriceBetween |
lessThanEqual | findByFieldLessThan | 获得小于等于指定值的数据 | findByPriceLessThan |
- 测试
public interface ArticleDao extends ElasticsearchRepository<Article,Long>{ //根据title模糊查询 List<Article> findByTitleLike(String title); //根据title模糊查询,根据id降序 List<Article> findByTitleLikeOrderByIdAsc(String title); //模块查询,排序加分页 Page<Article> findByTitleLikeOrderByIdAsc(String title,Pageable pageable); }