ElasticsearchRestTemplate客户端使用

简介: ElasticsearchRestTemplate客户端使用

一、基本概念

1、 ElasticsearchTemplate 原生api模板

ElasticsearchTemplate 封装ES客户端的一些原生api模板,方便实现一些查询

elasticsearchTemplate.queryForPage   #是查询一个分页列表,用的就是一个对象实例
    NativeSearchQuery                #是springdata中的查询条件
    NativeSearchQueryBuilder         #用于建造一个NativeSearchQuery查询对象
    QueryBuilders                    #设置查询条件,是ES中的类
    SortBuilders                     #设置排序条件
    HighlightBuilder                 #设置高亮显示


2、SearchRequestBuilder

SearchRequestBuilder常用方法说明

SearchRequestBuilder常用方法说明
   (1) setIndices(String... indices):上文中描述过,参数可为一个或多个字符串,表示要进行检索的index;
  (2) setTypes(String... types):参数可为一个或多个字符串,表示要进行检索的type,当参数为0个或者不调用此方法时,表示查询所有的type;
  (3)setSearchType(SearchType searchType):执行检索的类别,值为org.elasticsearch.action.search.SearchType的元素,SearchType是一个枚举类型的类,
其值如下所示:
  QUERY_THEN_FETCH:查询是针对所有的块执行的,但返回的是足够的信息,而不是文档内容(Document)。结果会被排序和分级,基于此,只有相关的块的文档对象会被返回。由于被取到的仅仅是这些,故而返回的hit的大小正好等于指定的size。这对于有许多块的index来说是很便利的(返回结果不会有重复的,因为块被分组了)
  QUERY_AND_FETCH:最原始(也可能是最快的)实现就是简单的在所有相关的shard上执行检索并返回结果。每个shard返回一定尺寸的结果。由于每个shard已经返回了一定尺寸的hit,这种类型实际上是返回多个shard的一定尺寸的结果给调用者。
  DFS_QUERY_THEN_FETCH:与QUERY_THEN_FETCH相同,预期一个初始的散射相伴用来为更准确的score计算分配了的term频率。
  DFS_QUERY_AND_FETCH:与QUERY_AND_FETCH相同,预期一个初始的散射相伴用来为更准确的score计算分配了的term频率。
  SCAN:在执行了没有进行任何排序的检索时执行浏览。此时将会自动的开始滚动结果集。
  COUNT:只计算结果的数量,也会执行facet。
  (4) setSearchType(String searchType),与setSearchType(SearchType searchType)类似,区别在于其值为字符串型的SearchType,值可为dfs_query_then_fetch、dfsQueryThenFetch、dfs_query_and_fetch、dfsQueryAndFetch、query_then_fetch、queryThenFetch、query_and_fetch或queryAndFetch;
  (5) setScroll(Scroll scroll)、setScroll(TimeValue keepAlive)和setScroll(String keepAlive),设置滚动,参数为Scroll时,直接用new Scroll(TimeValue)构造一个Scroll,为TimeValue或String时需要将TimeValue和String转化为Scroll;
  (6) setTimeout(TimeValue timeout)和setTimeout(String timeout),设置搜索的超时时间;
  (7) setQuery,设置查询使用的Query;
  (8) setFilter,设置过滤器;
  (9) setMinScore,设置Score的最小数量;
  (10) setFrom,从哪一个Score开始查;
  (11) setSize,需要查询出多少条结果;

3、QueryBuilders、NativeSearchQuery

springboot中使用QueryBuilders、NativeSearchQuery实现复杂查询

1) QueryBuilders

QueryBuilders是ES中的查询条件构造器
QueryBuilders.boolQuery          #子方法must可多条件联查
QueryBuilders.termQuery          #精确查询指定字段
QueryBuilders.matchQuery         #按分词器进行模糊查询
QueryBuilders.rangeQuery         #按指定字段进行区间范围查询

2) NativeSearchQuery

原生的查询条件类,用来和ES的一些原生查询方法进行搭配,实现一些比较复杂的查询,最终进行构建.build 可作为ElasticsearchTemplate. queryForPage的参数使用

//构建Search对象
        NativeSearchQuery build = new NativeSearchQueryBuilder()
                //条件
                .withQuery(queryBuilder)
                //排序
                .withSort(SortBuilders.fieldSort("id").order(SortOrder.ASC))
                //高亮
                .withHighlightFields(name, ms)
                //分页
                .withPageable(PageRequest.of(pageNum - 1, pageSize))
                //构建
                .build();
        AggregatedPage<Goods> aggregatedPage = elasticsearchTemplate.queryForPage(build, Goods.class,new Hig());
//queryForPage 参数一: NativeSearchQuery 封装的查询数据对象
               参数二: es对应索引实体类
               参数三: 调用高亮工具类
 大于等于      .from    .gte   
 小于等于      .to      .lte   


4、 @Document 和 @Field 注解详解

首先在用法上的区别,@Document 一般用在类上,引起其他类。而 @Field 注解一般用在参数上,比如定义一个es操作的VO:

1、创建 ArticleEsDto

import java.io.Serializable;
import java.util.Date;
import lombok.Data;
import lombok.ToString;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
/**
 * @author nandao 2021/7/27
 */
@Data
@Document(indexName = "#{esAttribute.indexArticleType}", type = "#{esAttribute.indexArticleType}")
@ToString
public class ArticleEsDto implements Serializable {
    private static final long serialVersionUID = 7118858963867439527L;
    /**
     * es id
     */
    @Id
    private String id;
    /**
     * 原始ID
     */
    @Field(type = FieldType.Long)
    private Long jid;
    /**
     * 文章ID
     */
    @Field(type = FieldType.Long)
    private Long articleId;
    /**
     * 文章标题
     */
    @Field(type = FieldType.Text)
    private String title;
    /**
     * 内容
     */
    @ToString.Exclude
    @Field(type = FieldType.Text)
    private String content;
    /**
     * 摘要
     */
    @ToString.Exclude
    @Field(type = FieldType.Text)
    private String summary;
    /**
     * 列表图
     */
    @Field(type = FieldType.Text)
    private String listPicturePath;
    /**
     * 文章来源
     */
    @Field(type = FieldType.Text)
    private String source;
    /**
     * 发布时间
     */
    @Field(type = FieldType.Long)
    private Date publishTime;
}


2、分析:@Document注解:

@Document(indexName = "#{esAttribute.indexArticleType}", type = "#{esAttribute.indexArticleType}")


2.1、点开@Document 进入:

@Persistent
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface Document {
  String indexName();//索引库的名称,个人建议以项目的名称命名
  String type() default "";//类型,个人建议以实体的名称命名
  boolean useServerConfiguration() default false;
  short shards() default 5;//默认分区数
  short replicas() default 1;//每个分区默认的备份数
  String refreshInterval() default "1s";//刷新间隔
  String indexStoreType() default "fs";//索引文件存储类型
  boolean createIndex() default true;//创建新数据接口
  VersionType versionType() default VersionType.EXTERNAL;//版本类型参数
}

2.2、esAttribute.indexArticleType 指一个类中的参数:

import lombok.Data;
import lombok.ToString;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
 * @author nandao
 * @version 1.0
 * @description 初始化索引配置
 * @date 2021/07/27 
 **/
@Component
@Data
@ToString
public class EsAttribute {
  /**
   * 文章索引名字
   */
  @Value("${spring.data.index.articleType}")//对应配置文件中的articleType
  private String indexArticleType;
}


3、@Field注解分析,点击进入:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
@Inherited
public @interface Field {
  FieldType type() default FieldType.Auto; //自动检测属性的类型,可以根据实际情况自己设置
    FieldIndex index() default FieldIndex.analyzed; //默认情况下分词,一般默认分词就好,除非这个字段你确定查询时不会用到
    DateFormat format() default DateFormat.none; //时间类型的格式化
    String pattern() default ""; 
    boolean store() default false; //默认情况下不存储原文
  boolean fielddata() default false;
  String searchAnalyzer() default "";//指定字段搜索时使用的分词器
  String analyzer() default "";
  String normalizer() default "";
  String[] ignoreFields() default {};//如果某个字段需要被忽略
  boolean includeInParent() default false;
  String[] copyTo() default {};
}


3.1、FieldType类型有多种:

@Field(type = FieldType.Text)
@Field(type = FieldType.Long)
点击进入该枚举类:
public enum FieldType {
  Text,
  Integer,
  Long,
  Date,
  Float,
  Double,
  Boolean,
  Object,
  Auto,
  Nested,
  Ip,
  Attachment,
  Keyword
}


Text类型:索引全文字段,如电子邮件正文的描述或者产品描述。这些字段被分析器将字符串转换为单个术语列表。分析过程允许es在每个的全文域中搜索单个单词。文本字段不用于排序,也很少用于聚合。


Object类型:Json文档本质上是分层的,文档可能包含内部对象,而这些对象又可能包含内部对象本身。


Nested类型:嵌套类型是对象数据类型的一个专门的版本,他允许对象数组以一种彼此独立查询的方式进行索引。


Ip类型:ip字段可以索引和存储IPV4和IPv6地址。


Keyword类型:用于索引结构化内容(如电子邮件地址,主机名,状态码,邮政编码等)的字段。他们通常用于过滤、排序、聚合。关键字字段只能根据期确切的值进行搜索。

二、整合springboot

1、导入依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
        <!--elasticsearch -->
<!--        <dependency>-->
<!--            <groupId>org.elasticsearch</groupId>-->
<!--            <artifactId>elasticsearch</artifactId>-->
<!--        </dependency>-->
<!--        &lt;!&ndash; https://mvnrepository.com/artifact/org.elasticsearch.client/transport &ndash;&gt;-->
<!--        <dependency>-->
<!--            <groupId>org.elasticsearch.client</groupId>-->
<!--            <artifactId>transport</artifactId>-->
<!--        </dependency>-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>3.0.0</version>
        </dependency>
    </dependencies>


2、properties文件

server.port=8080
spring.application.name=psas-server
server.tomcat.uri-encoding=UTF-8
# es
spring.data.elasticsearch.repositories.enabled=true
spring.elasticsearch.rest.uris=192.168.60.181:9200
#spring.elasticsearch.rest.username=elastic
#spring.elasticsearch.rest.password=nE7jA%5m
# ???
#elasticsearch.cluster.name=${ELASTICSEARCH_NAME:tmxmall_cluster}
#elasticsearch.master.address=${ELASTICSEARCH_HOST:elasticsearch}
#elasticsearch.cluster.tcp-port=${ELASTICSEARCH_PORT:9300}


三、基本操作

SpringBoot2.3+ ElasticsearchRestTemplate es7.x增删改查、修改别名、自定义索引名称新增索引

ElasticsearchRestTemplate来简单操作Elasticsearch的增删改查等功能~

ElasticsearchRestTemplate的使用示例,(增删改查、高亮查询、id查询、分页查询、时间范围查询、多条件查询)

springboot中使用QueryBuilders、NativeSearchQuery实现复杂查询

ElasticSearch ES(二)DocumentOperation SpringBoot 集成 ElasticsearchRestTemplate JavaClientApi

https://blog.csdn.net/u014494148/article/details/123669514

1、判断索引是否存在

elasticsearchRestTemplate.indexExists(indexName);
• 1

2、ElasticsearchRestTemplate Java聚合查询+操作索引+查询时10000条上限


参考笔记


四、批量操作


1、批量保存


2、全量查询

五、聚合查询


1、按时间聚合统计

ElasticSearch按时间聚合统计

六、ES-分片路由(routing)

七、使用ElasticsearchRepository完成数据的操作


视频教程和笔记

  • 尚硅谷
相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。 &nbsp;
相关文章
|
存储 JSON API
SpringBoot3集成ElasticSearch
SpringBoot3集成ElasticSearchElasticsearch是一个分布式、RESTful风格的搜索和数据分析引擎,适用于各种数据类型,数字、文本、地理位置、结构化数据、非结构化数据;
2113 0
|
存储 搜索推荐 Java
|
搜索推荐 Java 索引
Spring Boot中的ElasticsearchRepository
Spring Boot中的ElasticsearchRepository
|
存储 Java 索引
Elastic实战:彻底解决spring-data-elasticsearch日期、时间类型数据读取报错问题
在使用spring-data-elasticsearch读取es中时间类型的数据时出现了日期转换报错,不少初学者会在这里困惑很久,所以今天我们专门来解读该问题的几种解决方案。
3040 0
Elastic实战:彻底解决spring-data-elasticsearch日期、时间类型数据读取报错问题
|
9月前
|
监控 数据可视化 Java
Spring Boot 整合 Elasticsearch 及实战应用
这次内容详细介绍如何使用 Spring Boot 整合 Elasticsearch,并提供几个实际应用案例。内容涵盖 Elasticsearch 的基本概念、Spring Boot 整合步骤、实战应用示例以及优化建议。
805 0
|
存储 Java 数据库
SpringBoot整合Spring Data Elasticsearch
Spring Data Elasticsearch提供了ElasticsearchTemplate工具类,实现了POJO与elasticsearch文档之间的映射
901 0
|
SQL Java 关系型数据库
spring data elasticsearch 打印sql(DSL)语句
spring data elasticsearch 打印sql(DSL)语句
1336 0
|
网络协议 Java API
SpringBoot整合Elasticsearch-Rest-Client、测试保存、复杂检索
这篇文章介绍了如何在SpringBoot中整合Elasticsearch-Rest-Client,并提供了保存数据和进行复杂检索的测试示例。
SpringBoot整合Elasticsearch-Rest-Client、测试保存、复杂检索
|
消息中间件 Java 关系型数据库
【二十】springboot整合ElasticSearch实战(万字篇)
【二十】springboot整合ElasticSearch实战(万字篇)
4125 47
Springboot整合Elasticsearch 7.X 复杂查询
这里使用Springboot 2.7.12版本,Elasticsearch为7.15.0。
941 1
Springboot整合Elasticsearch 7.X 复杂查询