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轻量级的监控组件SpringbootAdmin

    让我来为你详细讲解一下“Springboot轻量级的监控组件SpringbootAdmin”的完整攻略。 什么是SpringbootAdmin? SpringbootAdmin是一款开源的轻量级的监控组件,它可以实时监控Spring Boot应用程序的状态、指标和环境,同时还可以提供一些管理和监控功能,比如重启应用程序、查看日志等等。 如何使用Springb…

    Java 2023年5月15日
    00
  • java 输入3个数a,b,c,按大小顺序输出的实例讲解

    首先我们需要编写一个Java程序,实现输入三个数a,b,c,并按照大小顺序输出这三个数。下面是一个示例代码: import java.util.Scanner; public class SortNumbers { public static void main(String[] args) { Scanner scanner = new Scanner(S…

    Java 2023年5月26日
    00
  • Spring Security如何在Servlet中执行

    Spring Security 是 Spring 框架中的一个安全框架,可以用于保护 Web 应用程序的安全,包括身份验证、授权、防止攻击等功能。在 Servlet 中使用 Spring Security 可以有效地保护应用程序的安全,下面是详细的使用攻略。 1. 添加 Spring Security 依赖 首先,需要在项目中添加 Spring Securi…

    Java 2023年5月20日
    00
  • java & Android 格式化字符串详解

    Java & Android 格式化字符串详解 格式化字符串是一种常见的字符串处理技术,它可以让程序员在字符串中插入变量,从而方便地输出动态内容。在Java和Android编程中,格式化字符串是一个必备技能。本文将介绍Java和Android中的格式化字符串基础和高级技巧,并提供示例说明。 基础技巧 1. 字符串拼接 在Java和Android开发中…

    Java 2023年5月27日
    00
  • 如何使用GSON解析JSON数据

    下面是如何使用GSON解析JSON数据的完整攻略: 什么是 GSON GSON 是一个用于将 Java 对象序列化为 JSON 字符串或将 JSON 字符串反序列化为 Java 对象的 Java 库。它可以让开发者将 JSON 数据转换为 Java 对象,提高开发效率。 GSON 的使用步骤 导入 GSON 库 在工程的 Gradle 文件中添加以下依赖: …

    Java 2023年5月26日
    00
  • Java File类的简单使用教程(创建、删除、遍历与判断是否存在等)

    Java File类的简单使用教程 Java中的File类是用于操作文件和目录的类,可以进行文件和目录的创建、删除、遍历以及判断文件和目录是否存在等操作。下面我们将介绍如何使用File类进行这些操作。 创建文件 要创建一个文件,我们可以使用File类的构造函数,然后使用createNewFile()方法。示例代码如下: File file = new Fil…

    Java 2023年5月19日
    00
  • HttpClient实现文件上传功能

    以下是关于HttpClient实现文件上传功能的完整攻略。 简介 HttpClient是Apache的一个开源组件,它提供了高效的、简单的、简洁的编程接口,用于发送HTTP/HTTPS请求并处理响应。支持字符集转换、错误处理、重试处理、SSL连接、连接池等。 文件上传是HTTP协议中常用的一个功能,在web开发中尤为常见。HttpClient提供了完整的封装…

    Java 2023年6月15日
    00
  • jsp中sitemesh修改tagRule技术分享

    下面我将详细讲解“JSP中Sitemesh修改tagRule技术分享”的完整攻略。 简介 Sitemesh是一款用于Web页面装饰的框架,可以将公共的页面模板与动态生成的内容进行分离。在使用Sitemesh的过程中,可以通过修改tagRule来自定义标签的使用规则,并且可以根据需求进行灵活调整。 修改tagRule的步骤 1. 创建自定义的tagRule 在…

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