Spring Data Elasticsearch介绍

原创
2018/07/26 11:11
阅读数 6.1K

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 存储接口的包

具体步骤说明:

  1. 启动 Elasticsearch 节点,关闭HTTP传输支持
  2. 设置节点索引数据保存目录
  3. 从 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

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
7 收藏
0
分享
返回顶部
顶部