Spring Data Elasticsearch介绍
2018-07-26 11:11
1091 查看
1. 概述
在本文中,我们将以代码为中心,实战的方式探索Spring Data Elasticsearch的基础知识。我们将展示如何使用Spring Data在Spring应用程序中索引,搜索和查询Elasticsearch - String Data 模块是用于与流行的,基于Lucene的搜索引擎开源项目进行交互。
虽然Elasticsearch是无模式的,它可以使用映射顺序告诉字段的类型。当一个文档被索引,它的所有字段将会根据它的类型处理。
例如,一个文本字段将会根据映射规则进行分词和过滤。你也可以创建属于自己的filters(过滤器)和tokenizers(分词器)。
2. Spring Data
Spring Data 有助于避免编写模板代码。举个栗子,如果我们定义扩展Spring Data 提供的 ElasticsearchRepository接口的存储接口,则默认提供相应文档类的CRUD操作。此外,只需简单的使用指定格式的名称声明方法,就可以生成方法实现 - 无需编写存储库接口的实现。
你在这里可以阅读到更多Spring Data 资料.
2.1. Maven 依赖
Spring Data Elasticsearch 提供搜索引擎的Java API。为了使用它我们需要在pom.xml文件中添加新的依赖。<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-elasticsearch</artifactId> <version>2.0.1.RELEASE</version> </dependency>
2.2. 定义存储接口
下一步我们需要扩展提供的存储接口,使用我们实际的文档对象和主键类型替换泛型类型。ElasticsearchRepository 扩展了 PagingAndSortingRepository,它提供了内置的分页和排序功能。
在事例中,我们将会在自定义查询方法中使用分页的特性。
public interface ArticleRepository extends ElasticsearchRepository<Article, String> { Page<Article> findByAuthorsName(String name, Pageable pageable); @Query("{\"bool\": {\"must\": [{\"match\": {\"authors.name\": \"?0\"}}]}}") Page<Article> findByAuthorsNameUsingCustomQuery(String name, Pageable pageable); }
我们提供了2个自定方法。关于findByAuthorsName 方法,存储代理将会基于方法名称创建方法实现。解析算法将会确定它需要访问authors属性,然后搜索每个name属性。
第二个方法findByAuthorsNameUsingCustomQuery,使用Elasticsearch boolean query, 方法上定义了@Query 注解,查询参数author.name将会在传入的参数之间进行严格匹配。
2.3. Java Configuration
现在让我们来探讨下 Spring configrugation 在持久层的配置:@Configuration @EnableElasticsearchRepositories(basePackages = "com.baeldung.spring.data.es.repository") @ComponentScan(basePackages = {"com.baeldung.spring.data.es.service"}) public class Config { @Bean public NodeBuilder nodeBuilder() { return new NodeBuilder(); } @Bean public ElasticsearchOperations elasticsearchTemplate() { Settings.Builder elasticsearchSettings = Settings.settingsBuilder() .put("http.enabled", "false") // 1 .put("path.data", tmpDir.toAbsolutePath().toString()) // 2 .put("path.home", "PATH_TO_YOUR_ELASTICSEARCH_DIRECTORY"); // 3 logger.debug(tmpDir.toAbsolutePath().toString()); return new ElasticsearchTemplate(nodeBuilder() .local(true) .settings(elasticsearchSettings.build()) .node() .client()); } }
我们使用了标准的Spring enable 注解模式 - @EnableElasticsearchRepositories - 扫描包含了Spring Data 存储接口的包
具体步骤说明:
启动 Elasticsearch 节点,关闭HTTP传输支持
设置节点索引数据保存目录
从 Elasticsearch 2.x 开始,我们需要设置“path.home” 作为 Elasticsearch 根目录。
最后 ,我们也要设置 ElasticsearchOperations 操作bean - elasticsearchTemplate - 作为我们与Elasticsearch服务器交互的客户端
3. 文档映射 Mappings
现在让我们定义第一实体 - 以String 类型作为ID的 Article 文档对象@Document(indexName = "blog", type = "article") public class Article { @Id private String id; private String title; @Field(type = FieldType.Nested) private List<Author> authors; // standard getters and setters }
在@Document注解中,我们说明这个类的实例应该存储索引为“blog”到 Elasticsearch,并且文档的类型为“article”。具有不同类型的文档可以存储到同一个索引。(index相当于数据库,type相当于表)
让我看一下,authors 字段被FieldType.Nested标记。这允许我们分别定义Author类,但是在Elasticsearch构建索引的时候,可以将author的各个实例内嵌到Article中。
4. 索引文档 Indexing Documents
Spring Data Elasticsearch 会基于项目中的实体对象自动创建索引。然而,你也可以通过编程的方式创建索引,使用模板代码:
elasticsearchTemplate.createIndex(Article.class);
索引可用了,我们就可以添加文档到索引。
我们快速看下事例 - 创建拥有2个作者的文章索引:
Article article = new Article("Spring Data Elasticsearch"); article.setAuthors(asList(new Author("John Smith"), new Author("John Doe"))); articleService.save(article);
5. 查询 Querying
5.1. 基于方法名查询
在前面的存储类中我们定义了 findByAuthorsName 方法 - 我们可以通过作者名称查找文章列表。String nameToFind = "John Smith"; Page<Article> articleByAuthorName = articleService.findByAuthorName(nameToFind, new PageRequest(0, 10));
通过分页对象参数调用findByAuthorName方法,我们可以获得第一页的结果集(page 数值从0开始),结果集最多包含10条文章记录。
5.2. 自定义查询
有两种方法可以为Spring Data Elasticsearch存储库定义自定义查询。第一种是使用@Query注解,在 2.2 章节有演示。另外一种方式是使用构建器的方式创建自定义查询。
例如,我们可以使用NativeSearchQueryBuilder构建查询,查询文章标题拥有关键字“data”的文章列表。
SearchQuery searchQuery = new NativeSearchQueryBuilder() .withFilter(regexpQuery("title", ".*data.*")) .build(); List<Article> articles = elasticsearchTemplate.queryForList(searchQuery, Article.class);
6. Updating and Deleting
为了更新和删除文档,我们首先需要检索文档出来。String articleTitle = "Spring Data Elasticsearch"; SearchQuery searchQuery = new NativeSearchQueryBuilder() .withQuery(matchQuery("title", articleTitle).minimumShouldMatch("75%")) .build(); List<Article> articles = elasticsearchTemplate.queryForList(searchQuery, Article.class);
现在,我们更新文章标题 - 我们可以使用save API更新文档:
article.setTitle("Getting started with Search Engines"); articleService.save(article);
你可能已经猜想到了,也可以使用删除方法来删除文档。
articleService.delete(articles.get(0));
7. 总结
在这里我们快速实战和讨论Spring Data Elasticsearch 的基础用法。想要阅读更多关于Elasticsearch的令人印象深刻的功能特性,你可查找官网文档。
本文使用的article实例,可以在GitHub获取。
原文地址:http://www.baeldung.com/spring-data-elasticsearch-tutorial
相关文章推荐
- spring-data-elasticsearch + java 查询方法的封装
- Spring Data Elasticsearch
- Spring Data ElasticSearch
- Spring Boot + Spring Data + Elasticsearch实例
- Spring Data Elasticsearch
- spring data elasticsearch
- Spring Data Elasticsearch翻译
- Spring Data Elasticsearch 与 Elasticsearch 的关系
- Spring Boot + Spring Data + Elasticsearch实例
- How to provide highlighting with Spring data elasticsearch
- Spring Data ElasticSearch环境搭建
- springdata elasticsearch aggregation 操作
- Spring Data Elasticsearch 和 x-pack 用户名/密码验证连接
- Spring Data Elasticsearch
- Spring Boot + Spring Data + Elasticsearch example
- Spring Data ElasticSearch parnt/child search
- Elasticsearch学习(6)—— Spring Data Elasticsearch
- ElasticSearch索引的相关操作---javaEE--SpringDataElasticSearch
- spring data elasticsearch
- spring data elasticsearch 中文文档