spring 操作elasticsearch查询使用方法

yizhihongxing

下面我将为您介绍如何使用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. 简介 在 Spring Boot 中,我们可以使用自动配置完成很多操作,其中最重要的一个就是通过自动注入来维护 Spring 应用程序之间的依赖关系。 Spring Boot 中自动注入的原理比较复杂,但我们可以用一张图来概述它的过程。 2. 图片介绍 下面这张图片展示了自动…

    Java 2023年5月15日
    00
  • Mybatis动态SQL之if、choose、where、set、trim、foreach标记实例详解

    针对“Mybatis动态SQL之if、choose、where、set、trim、foreach标记实例详解”,我们来进行一次完整的攻略。 1. 动态SQL的概述 在Mybatis中,动态SQL用于将不同的SQL语句组合在一起,以便在运行时决定使用哪一个SQL语句。Mybatis使用了一些标记来支持动态SQL,包括if、choose、where、set、tr…

    Java 2023年5月20日
    00
  • maven导入本地仓库jar包,报:Could not find artifact的解决

    首先,出现”Could not find artifact”错误提示通常是因为Maven从中央仓库找不到对应的依赖。 要解决此问题,我们可以将需要依赖的jar包手动下载到本地,并将其安装到Maven本地仓库中。 以下是完整攻略: 第一步:下载需要的jar包 在官方网站或者其他可信赖的网站上下载需要的jar包 如果网站提供了md5或sha1值,请进行验证以确保…

    Java 2023年6月2日
    00
  • Java通过JNI 调用动态链接库DLL操作

    关于Java通过JNI调用动态链接库DLL的攻略,我来给你详细讲解一下。 1. 环境准备 在开始使用JNI进行Java调用DLL之前,需要确保以下几点: 安装并配置好Java JDK (开发包)和运行时环境(JRE); 安装Visual Studio(Windows平台)或gcc等C/C++编译器(Linux/Unix/macOS平台); 按照平台(Wind…

    Java 2023年5月26日
    00
  • SpringBoot参数校验之@Valid的使用详解

    SpringBoot参数校验之@Valid的使用详解 在Spring Boot中,参数校验是非常重要的一环,在实际开发中,我们经常会遇到需要对用户提交的数据进行校验的场景,比如注册时,我们需要校验用户名、密码、邮箱格式等数据是否符合要求。这时,我们就可以通过使用Spring Boot提供的参数校验功能来实现。 Spring Boot提供了一个非常方便的参数校…

    Java 2023年5月20日
    00
  • jsp中自定义标签用法实例分析

    下面是关于“jsp中自定义标签用法实例分析”的攻略。 一、自定义标签的基本概念和使用 自定义标签是指用户可以自行设定标签名称,通过编写自定义标签类来达到自己想要的功能,或用既有的标签库来达到相应的目的。在使用自定义标签的过程中,首先需要在jsp页面上导入标签库,然后就可以使用标签库中的标签了。具体步骤如下: 在jsp页面中引入标签库,方式如下: jsp &l…

    Java 2023年6月15日
    00
  • jsp+servlet+jdbc实现对数据库的增删改查

    首先,我们需要明确一下技术栈的概念: JSP (Java Server Pages):基于Java语言的服务器端网页开发技术; Servlet:是Java Web应用程序的核心,位于服务端,负责处理浏览器发送过来的HTTP请求并返回响应结果; JDBC (Java Database Connectivity):Java数据库连接,Java语言操作关系型数据库…

    Java 2023年5月20日
    00
  • SpringBoot Web依赖教程

    下面我将为您详细讲解“SpringBoot Web依赖教程”的完整攻略。 什么是SpringBoot Web依赖? SpringBoot是一个快速创建和开发Spring基础项目的框架,它自带了大量的依赖包,其中就包括了SpringBoot Web依赖。SpringBoot Web依赖可以让我们方便地创建Web应用程序,支持使用SpringMVC框架,并集成了…

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