一、基本概念
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>--> <!-- <!– https://mvnrepository.com/artifact/org.elasticsearch.client/transport –>--> <!-- <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、批量保存
- transportClient.prepareBulk()批量保存
- Java TransportClient.prepareBulk方法代码示例
- 初识ElasticSearch(5) -批量操作之bulk | 条件查询 | 其它查询
2、全量查询
五、聚合查询
- ElasticSearch+SpringBoot聚合、分组、排序、分页、10000条查询限制及遇到的问题
- ES的指标聚合有哪些呢?
- 你知道25种(桶聚合)Bucket Aggs 类型各自的使用场景么?
1、按时间聚合统计
六、ES-分片路由(routing)
七、使用ElasticsearchRepository完成数据的操作
视频教程和笔记
- 尚硅谷