从零开发短视频电商 电商商品全文搜索之Elasticsearch与SpringBoot集成实战

}

新增数据

Goods goods = new Goods();

goods.setId((long) i);

goods.setGoodsCode(“中国人” + i);

goods.setCreateDate(new Date());

goods.setHotScore(10);

goods.setGoodsName(“我是中国人” + i);

新增

goodsRepository.save(goods);

批量新增

goodsRepository.saveAll(goodsList);

删除数据

根据ID,删除数据

goodsRepository.deleteById(id);

根据对象删除数据,主键ID不能为空

goodsRepository.delete(bean);

根据对象集合,批量删除

goodsRepository.deleteAll(beanList);

删除所有

goodsRepository.deleteAll();

更新数据

Goods goods = new Goods();

goods.setId(id); // ID不能为空

goods.setGoodsCode(“中国人”);

goodsRepository.save(goods);// 根据主键更新 ID不能为空

更新某几个字段

查询

ElasticsearchRestTemplate的基本api

  • SearchQuery 总的查询

  • BoolQueryBuilder bool查询,可在后面加上must,mustNot,should等等

  • MatchQueryBuilder 匹配查询

  • TermQueryBuilder 倒排索引查询

  • HighlightBuilder 高亮查询,用于设置要高亮的field

查询结果

SearchHit

包含以下信息:

  • Id

  • Score

  • Sort Values

  • Highlight fields

  • The retrieved entity of type

SearchHits

包含以下信息:

  • Number of total hits

  • Total hits relation

  • Maximum score

  • A list of SearchHit<T> objects

  • Returned aggregations

SearchPage

定义一个Spring Data Page 包含一个 SearchHits<T> 元素,可以使用存储库方法进行分页访问

SearchScrollHits

ElasticsearchRestTemplate中的底层滚动API函数返回,它用Elasticsearch滚动id充实了SearchHits

SearchHitsIterator

SearchOperations接口的流函数返回的迭代器。

QueryBuilders提供了大量的静态方法,用于生成各种不同类型的查询:

  • matchQuery:词条匹配,先分词然后在调用termQuery进行匹配

  • TermQuery:词条匹配,不分词

  • wildcardQuery:通配符匹配

  • fuzzyQuery:模糊匹配

  • rangeQuery:范围匹配

  • booleanQuery:布尔查询,组合查询

// 构建查询条件

NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();

// 添加基本分词查询

queryBuilder.withQuery(QueryBuilders.matchQuery(“title”, “小米手机”));

BooleanQuery(组合查询)

加粗样式

注意点:

BooleanClause用于表示布尔查询子句关系的类,包括:BooleanClause.Occur.MUST,BooleanClause.Occur.MUST_NOT,BooleanClause.Occur.SHOULD。必须包含,不能包含,可以包含三种.有以下6种组合:

1.MUST和MUST:交集。

2.MUST和MUST_NOT:表示查询结果中不能包含MUST_NOT所对应得查询子句的检索结果。

3.SHOULD与MUST_NOT:连用时,功能同MUST和MUST_NOT。

4.SHOULD与MUST连用时,结果为MUST子句的检索结果,但是SHOULD可影响排序。

5.SHOULD与SHOULD:并集。

6.MUST_NOT和MUST_NOT:无意义,检索无结果。

public void testBooleanQuery(){

NativeSearchQueryBuilder builder = new NativeSearchQueryBuilder();

builder.withQuery(QueryBuilders.boolQuery().must(QueryBuilders.termQuery(“title”,“手机”))

.must(QueryBuilders.termQuery(“brand”,“小米”))

);

Page list = this.itemRepository.search(builder.build());

排序

NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();

// 添加基本分词查询

queryBuilder.withQuery…

// 排序

queryBuilder.withSort(SortBuilders.fieldSort(“price”).order(SortOrder.ASC));

普通查询

可以使用goodsRepository操作

@Repository

public interface GoodsRepository extends ElasticsearchRepository<Goods, Long> {

long countByGoodsCode(String goodsCode);

long deleteByGoodsCode(String goodsCode);

List removeByGoodsCode(String goodsCode);

List findByGoodsCode(String goodsCode);

Page findByGoodsCode(String goodsCode, Pageable pageable);

Slice findByGoodsCode(String goodsCode, Pageable pageable);

List findByGoodsCode(String goodsCode, Sort sort);

List findFirst10ByGoodsCode(String goodsCode, Pageable pageable);

@Query(“{“bool”: {“must”: [{“match”: {“tags”: “?0”}}]}}”)

Page findFirst10ByGoodsCode(String tag, Pageable pageable);

Page

findByAuthorsName(String name, Pageable pageable);

@Query(“{“bool”: {“must”: [{“match”: {“authors.name”: “?0”}}]}}”)

Page

findByAuthorsNameUsingCustomQuery(String name, Pageable pageable);

@Query(“{“bool”: {“must”: {“match_all”: {}}, “filter”: {“term”: {“tags”: “?0” }}}}”)

Page

findByFilteredTagQuery(String tag, Pageable pageable);

@Query(“{“bool”: {“must”: {“match”: {“authors.name”: “?0”}}, “filter”: {“term”: {“tags”: “?1” }}}}”)

Page

findByAuthorsNameAndFilteredTagQuery(String name, String tag, Pageable pageable);

}

API 接受SortPageable。如果您不想应用任何排序或分页,请使用Sort.unsorted()Pageable.unpaged(),不要传null。

Sort sort = Sort.by(“firstname”).ascending()

​ .and(Sort.by(“lastname”).descending());

Elasticsearch 查询字符串映射如下:https://docs.spring.io/spring-data/elasticsearch/docs/4.0.6.RELEASE/reference/html/#elasticsearch.query-methods.criterions

分页查询

Page users = repository.findAll(PageRequest.of(1, 20));

MatchQueryBuilder builder = QueryBuilders.matchQuery(field, value);

SearchQuery searchQuery = new NativeSearchQuery(builder).setPageable(PageRequest.of(0, 100));

AggregatedPage page = restTemplate.queryForPage(searchQuery, EmployeeBean.class);

long totalElements = page.getTotalElements(); // 总记录数

int totalPages = page.getTotalPages(); // 总页数

int pageNumber = page.getPageable().getPageNumber(); // 当前页号

List beanList = page.toList(); // 当前页数据集

Set beanSet = page.toSet(); // 当前页数据集

高亮查询
权重查询
聚合查询

监控管理

ElasticHQ可以作为Docker容器使用。执行以下命令以使用ElasticHQ启动容器:

$ docker run -d --name elastichq -p 5000:5000 elastichq/elasticsearch-hq

问题总结

索引映射创建

方式一 在实体类上加**@Document**,而在这个类中有一个createIndex属性,默认为true,意思是在启动应用时es中还没创建该索引,则进行初始化。

下面是默认创建的索引和映射,很明显里面的映射创建是不对不建议使用这种方式

es服务端版本为7.3.0。不知道是不是不完全匹配的原因。试了7.6.2版本也不对哈哈哈。

{

“state”: “open”,

“settings”: {

“index”: {

“refresh_interval”: “1s”,

“number_of_shards”: “1”,

“provided_name”: “goods_index”,

“creation_date”: “1640695057235”,

“store”: {

“type”: “fs”

},

“number_of_replicas”: “0”,

“uuid”: “La3XlrTTTu6-SoNtsuPl1g”,

“version”: {

“created”: “7030099”

}

}

},

“mappings”: {

“_doc”: {

“properties”: {

“hotScore”: {

“type”: “long”

},

“_class”: {

“type”: “text”,

“fields”: {

“keyword”: {

“ignore_above”: 256,

“type”: “keyword”

}

}

},

“goodsCode”: {

“type”: “text”,

“fields”: {

“keyword”: {

“ignore_above”: 256,

“type”: “keyword”

}

}

},

“id”: {

“type”: “long”

},

“goodsName”: {

“type”: “text”,

“fields”: {

“keyword”: {

“ignore_above”: 256,

“type”: “keyword”

}

}

},

“createDate”: {

“type”: “text”,

“fields”: {

“keyword”: {

“ignore_above”: 256,

“type”: “keyword”

}

}

}

}

}

}

方式二 使用postman、elasticsearch-head等提交put请求创建索引和映射。

这个就不用讲了哈,最原始的了。

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

最后

我还为大家准备了一套体系化的架构师学习资料包以及BAT面试资料,供大家参考及学习

已经将知识体系整理好(源码,笔记,PPT,学习视频)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-iGbQWzso-1711023001695)]
[外链图片转存中…(img-208HoH7U-1711023001697)]
[外链图片转存中…(img-rRnJ28ft-1711023001697)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-dZWCoqUh-1711023001698)]

最后

我还为大家准备了一套体系化的架构师学习资料包以及BAT面试资料,供大家参考及学习

已经将知识体系整理好(源码,笔记,PPT,学习视频)

[外链图片转存中…(img-dDbJbU1p-1711023001699)]

[外链图片转存中…(img-OFjEwj2L-1711023001699)]

[外链图片转存中…(img-hgDeJWYz-1711023001700)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

Elasticsearch 简介 ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。elasticSearch 的使用场景 1、在海量数据前提下,对数据进行检索。比如:京东,淘宝等电商项目课程目标: 1. 了解企业级搜索引擎2. 安装elasticsearch 课程目录: 01 课程介绍02 elasticsearch 简介03 elasticsearch 使用场景04 安装elasticsearch 之前先安装jdk05 安装elasticsearch06 测试elasticsearch是否安装成功 07 安装kibana08 elasticsearch 基本认识 以及添加索引和删除索引09 elasticsearch 添加查询数据10 elasticsearch 修改删除数据11 elasticsearch 有条件的查询12 分词子属性fuzzy查询13 elasticsearch 过滤使用14 elasticsearch 排序与分页15 elasticsearch 如何查询指定的字段16 elasticsearch 高亮显示17 elasticsearch 聚合18 elasticsearch mapping 概念19 elasticsearch 的中文词库20 elasticsearch 中文词库安装测试21 elasticsearch 中文词库的使用案例22 elasticsearch 自定义词库配置23 安装nginx 配置中文词库24 测试elasticsearch 自定义中文词库25 搭建项目父工程26 搭建项目bean-interface-common27 搭建search 的service web 项目28 测试项目是否能与elasticsearch联通29 创建数据库并搭建首页30 数据上传功能的实现类完成31 数据上传控制器完成32 dubbo 介绍以及安装zookeeper33 将数据从mysql 上传到elasticsearch 中34 elasticsearch查询功能分析35 编写业务需求的dsl 语句36 编写输入参数返回结果集的实体类37 实现类编写38 编写实现类中dsl 语句39 返回集结果转换40 结果测试41 测试通过输入查询条件并将数据显示到页面
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值