您的位置:首页 > 编程语言 > Java开发

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息