spring 操作elasticsearch查询使用方法

下面我将为您介绍如何使用Spring来操作Elasticsearch,并提供两个示例说明。

1. 引入依赖

首先,我们需要在pom.xml文件中引入Spring Data Elasticsearch的依赖:

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-elasticsearch</artifactId>
    <version>4.0.3</version>
</dependency>

2. 配置Elasticsearch

接着,我们需要在application.properties文件中配置Elasticsearch的连接信息:

spring.data.elasticsearch.cluster-name=elasticsearch
spring.data.elasticsearch.cluster-nodes=localhost:9300

这里我们使用的是本地的Elasticsearch,所以节点为localhost:9300,对于其他环境,节点地址需要修改。

3. 定义实体类

在使用Spring Data Elasticsearch时,我们需要定义实体类,用于映射Elasticsearch中的文档。下面是一个示例:

@Document(indexName = "blog", createIndex = false)
@Data
public class Blog {
    @Id
    private Long id;
    private String title;
    private String content;
    @Field(type = FieldType.Date)
    private Date createTime;
}

在这个示例中,我们使用了@Document注解来指定对应的索引名称,同时关闭了自动创建索引;使用@Id注解指定ID属性;使用@Field注解指定字段类型为日期类型。

4. Repository接口定义

接下来,我们需要定义一个Repository接口,继承ElasticsearchRepository,用于操作Elasticsearch:

public interface BlogRepository extends ElasticsearchRepository<Blog, Long> {
}

这个示例中,我们使用了ElasticsearchRepository接口,泛型参数指定映射的实体类和ID类型。

5. 基本查询

我们可以使用Repository提供的方法来进行Elasticsearch的基础查询,例如:

  • 通过ID查询
blogRepository.findById(1L);
  • 全文搜索
blogRepository.findByTitleOrContent("spring", "elasticsearch");
  • 范围查询
blogRepository.findByCreateTimeBetween(DateUtils.parseDate("2021-01-01"), DateUtils.parseDate("2021-01-31"));

6. 自定义查询

在实际开发中,我们需要进行更加复杂的查询,一般使用@Query注解来定义自定义的查询方法。例如:

@Query("{\"match\": {\"title\": {\"query\": \"?0\"}}}")
List<Blog> searchByTitle(String keyword);

在这个示例中,我们使用JSON格式的查询语句来查询标题中包含指定关键词的文档。

示例1:实现文本高亮

下面是一个示例:实现搜索结果中的文本高亮效果。首先,在@Document注解中指定一个设置高亮显示的字段:

@Document(indexName = "blog", createIndex = false)
@Data
public class Blog {
    @Id
    private Long id;
    @Field(type = FieldType.text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart")
    private String title;
    @Field(type = FieldType.text, analyzer = "ik_max_word", searchAnalyzer = "ik_smart")
    private String content;
    @Field(type = FieldType.Date)
    private Date createTime;
    @Field(type = FieldType.Keyword)
    private String tags;
    @Field(type = FieldType.Integer)
    private Integer status;
    @Field(type = FieldType.Keyword, index = false)
    private String author;              // 设置一个不分词的字段,用于实现高亮显示
}

在这个示例中,我们使用@Field注解来指定搜索和索引的分词器类型,并在其中添加author字段用于实现高亮显示。

接着,我们在自定义查询方法中,使用org.springframework.data.elasticsearch.core.SearchHits类的map(SearchHitMapper mapper)方法,将查询结果进行映射。

@Override
public Page<Blog> search(String keyword, Integer pageNo, Integer pageSize) {
    NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();
    builder.withQuery(QueryBuilders.multiMatchQuery(keyword, "title", "content"));

    builder.withHighlightFields(new HighlightBuilder.Field("title").preTags("<em>").postTags("</em>"),
            new HighlightBuilder.Field("content").preTags("<em>").postTags("</em>"));

    SearchQuery searchQuery = builder.build();
    searchQuery.setPageable(PageRequest.of(pageNo - 1, pageSize));

    SearchHits<Blog> searchHits = elasticsearchRestTemplate.search(searchQuery, Blog.class);

    return searchHits.map(searchHit -> {
        Blog blog = searchHit.getContent();
        Map<String, List<String>> highlightFields = searchHit.getHighlightFields();
        if (highlightFields.containsKey("title")) {
            blog.setTitle(highlightFields.get("title").get(0));
        }
        if (highlightFields.containsKey("content")) {
            blog.setContent(highlightFields.get("content").get(0));
        }
        return blog;
    }).map(content -> {
        if (StringUtils.isNotBlank(content.getAuthor())) {
            content.setTitle(content.getTitle().replace(content.getAuthor(), "<em>" + content.getAuthor() + "</em>"));
        }
        return content;
    }).map(PageImpl::new).getContent();
}

在这个示例中,我们使用NativeSearchQueryBuilder类来创建查询条件,使用HighlightBuilder.Field类来指定需要高亮显示的字段。在查询结果中,我们使用org.springframework.data.elasticsearch.core.SearchHits类的getHighlightFields()方法来获取高亮显示的信息,并根据信息更新对应的字段内容。

示例2:实现聚合查询

下面是一个示例:在查询结果中,实现对标签(tags)进行聚合查询,统计出现次数前5个标签。

@Override
public Map<String, Long> getTopTags(Integer topN) {
    Aggregation aggregation = AggregationBuilders.terms("top_tags").field("tags").order(BucketOrder.count(false)).size(topN).subAggregation(AggregationBuilders.count("tag_count").field("tags"));
    AggregatedPage<Blog> aggregatedPage = elasticsearchTemplate.queryForPage(new NativeSearchQueryBuilder().withPageable(PageRequest.of(0, 1)).addAggregation(aggregation).build(), Blog.class);

    Map<String, Long> topTagsMap = new HashMap<>();
    Aggregations aggregations = aggregatedPage.getAggregations();
    if (Objects.nonNull(aggregations)) {
        Terms terms = aggregations.get("top_tags");
        if (terms != null) {
            for (Terms.Bucket bucket : terms.getBuckets()) {
                String key = bucket.getKeyAsString();
                Long count = bucket.getDocCount();
                topTagsMap.put(key, count);
            }
        }
    }
    return topTagsMap;
}

在这个示例中,我们使用AggregationBuilders类的terms()方法来创建一个聚合查询,统计标签出现次数,并取前topN个标签。在创建查询条件时,我们使用withPageable()方法指定分页信息,然后使用addAggregation()方法将聚合查询添加至查询条件中。

执行查询后,我们通过AggregatedPage对象的getAggregations()方法获取聚合结果,并遍历Terms对象中的各个Bucket,获取标签的名称和出现次数。最终将结果封装成Map类型返回给用户。

以上就是关于在Spring中操作Elasticsearch查询的使用方法的详细攻略,希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:spring 操作elasticsearch查询使用方法 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • SpringBoot 统一异常处理详解

    让我来详细讲解“SpringBoot 统一异常处理详解”的完整攻略。 1. 异常处理的意义 在我们的应用程序中,异常是不可避免的。这些异常可能是由于用户输入不正确、服务器错误、网络问题等各种原因引起的。当这些异常不被处理时,它们将会导致应用程序无法继续正常运行,严重时甚至会引起系统崩溃。 因此,在我们的应用程序中,为了保证程序的安全性和稳定性,必须对这些异常…

    Java 2023年5月27日
    00
  • springboot启动后卡住无日志的几种情况小结

    下面是关于“SpringBoot启动后卡住无日志的几种情况小结”完整攻略: 问题背景 在使用SpringBoot开发JavaWeb应用时,有时候可能会遇到启动后卡住无日志的情况,导致我们无法知道整个启动过程的具体信息。这种情况通常有以下几种原因: 应用启动卡在某个点,等待某个线程执行完成 应用启动时出现了未捕获的异常 应用启动时依赖的外部服务出现了故障 接下…

    Java 2023年6月2日
    00
  • 解决spring data jpa saveAll() 保存过慢问题

    解决 Spring Data JPA saveAll() 保存过慢问题需要从以下两个方面入手: 批量操作 对于需要批量插入的数据,如果使用 JPA 的 saveAll() 方法,会对每个实体执行一次数据库操作,这样的效率会非常低下。因此,需要使用批量操作。在 Spring Data JPA 中,可以使用 JPA 提供的批量操作接口 Batch批量操作,方法为…

    Java 2023年5月20日
    00
  • SpringBoot配置嵌入式Servlet容器和使用外置Servlet容器的教程图解

    下面是详细讲解 SpringBoot 配置嵌入式 Servlet 容器和使用外置 Servlet 容器的教程图解。 嵌入式Servlet容器 Spring Boot 内置了常用的嵌入式 Servlet 容器,如 Tomcat、Jetty、Undertow 等。开发者不需要手动配置这些容器,只需要在项目中添加相应的依赖即可。 配置 Tomcat 添加 Tomc…

    Java 2023年6月15日
    00
  • 如何使用Java操作Zookeeper

    如何使用Java操作Zookeeper 1. 前言 Zookeeper是一个分布式应用程序协调服务,可以用作分布式系统中的协调服务,它是分布式系统中非常重要的一部分,许多的大型分布式系统都会使用Zookeeper作为协调服务。 在Java中操作Zookeeper可以使用ZooKeeper Java API,本文将介绍如何使用Java操作Zookeeper,并…

    Java 2023年5月26日
    00
  • jsvascript图像处理—(计算机视觉应用)图像金字塔

    JavaScript图像处理-图像金字塔 简介 图像金字塔是一种由同一图像的多个分辨率构成的数据结构。每一层的大小是前一层的一半,高频信息(细节)被过滤,低频信息(谐波)被保留。 图像金字塔的主要应用包括: 缩放图片 图像分割 特征提取 增强图像 处理流程 对于每一层的金字塔图像,可以通过下采样(up-sampling)和高斯卷积(Gauss blur)来实…

    Java 2023年6月15日
    00
  • Spring Boot Admin的使用详解(Actuator监控接口)

    当我们在使用 Spring Boot 构建 web 应用时,使用 Actuator 来监控应用程序状态和执行度量非常有用。但 Actuator 提供的 JSON API 数据对于非技术人员来说很难直接理解。此时,Spring Boot Admin 就是一个非常好的选择,它提供了一个图形化的用户界面,用于监控 Spring Boot 应用程序。 本文将介绍如何…

    Java 2023年5月20日
    00
  • 使用IntelliJ IDEA2020.2.2 x64 新建java项目并且输出Hello World

    下面我会详细讲解使用IntelliJ IDEA 2020.2.2 x64新建Java项目并输出”Hello World”的完整攻略。 步骤1:下载和安装IntelliJ IDEA 首先你需要在官网https://www.jetbrains.com/idea/下载IntelliJ IDEA的最新版本并安装。 步骤2:新建Java项目 安装完成之后,启动Inte…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部