06 | 如何用Elasticsearch构建商品搜索系统?
06 | 如何用Elasticsearch构建商品搜索系统?
讲述:李玥
时长13:29大小12.34M
理解倒排索引机制
如何在 ES 中构建商品的索引?
小结
思考题
赞 19
提建议
精选留言(36)
- 李玥置顶2020-03-10Hi,我是李玥。 还是在这里回顾一下上节课的思考题: 2PC也有一些改进版本,比如3PC、TCC这些,它们大体的思想和2PC是差不多的,解决了2PC的一些问题,但是也会带来新的问题,实现起来也更复杂,限于篇幅我们没法每个都详细地去讲解。在理解了2PC的基础上,课后请你自行去学习一下3PC和TCC,然后对比一下,2PC、3PC和TCC分别适用于什么样的业务场景? 谈一下我的理解: 3PC相比于2PC做了两个改进,一是事务执行器也增加了超时机制,避免我们课程中提到的因为协调者宕机,导致执行器长时间卡死的问题,另外,3PC在2PC之前增加一个询问阶段,这个阶段事务执行器可以去尝试锁定资源(但不等待),这样避免像2PC那样直接去锁定资源,而资源不可用的情况下,一直等待资源而卡住事务的情况。 TCC可以理解为业务层面的2PC(也有观点主张TCC和2PC是完全不同的,我个人建议没必要在这些概念上较真,理解并正确使用才是关键),TCC同样分为Try和Confirm/Cancel 两个阶段,在Try阶段锁定资源,但不执行任何更新操作,Confirm阶段来执行所有更新操作并提交,如果失败进入Cancel阶段。Cancel阶段就是收拾烂摊子,把Confirm阶段做的数据更新都改回去,把Try阶段锁定的资源都释放。相比于2PC,TCC可以不依赖于本地事务,但是Cancel阶段的业务逻辑比较难实现。展开共 2 条评论53
- Geek_c76e2d2020-03-10因为用户每输入一个字都可能会发请求查询搜索框中的搜索推荐。所以搜索推荐的请求量远高于搜索框中的搜索。es针对这种情况提供了suggestion api,并提供的专门的数据结构应对搜索推荐,性能高于match,但它应用起来也有局限性,就是只能做前缀匹配。再结合pinyin分词器可以做到输入拼音字母就提示中文。如果想做非前缀匹配,可以考虑Ngram。不过Ngram有些复杂,需要开发者自定义分析器。比如有个网址www.geekbang.com,用户可能记不清具体网址了,只记得网址中有2个e,此时用户输入ee两个字母也是可以在搜索框提示出这个网址的。以上是我在工作中针对前缀搜索推荐和非前缀搜索推荐的实现方案。展开
作者回复: 👍👍👍
共 6 条评论178 - hello2020-03-10老师,能否来一篇加餐,讲讲ES、MySQL、MongoDB、RocketMQ/Kafka、newSQL这些存储的对比,底层是基于什么原理擅长干哪些事,不擅长干哪些事?共 2 条评论52
- 每天晒白牙2020-03-15老师,我刚刚问的那个问题,我这边找到了一个方案,但不知道是否是业界用的方案,还请老师指点一下 全文检索要把 title 的 type 设置为 text 前缀推荐要把 title 的 type 设置为 completion 想同时支持全文检索和前缀匹配推荐如何做? 用 fields mapping 文件如下 PUT sku { "mappings": { "properties": { "sku_id":{ "type": "long" }, "title":{ "type": "text", "analyzer": "ik_max_word", "search_analyzer": "ik_max_word", "fields": { "title_suggest":{ "type":"completion" } } } } } } 支持全文检索 GET sku/_search?pretty { "query": { "match": { "title": "苹果手机" } } } 支持前缀匹配 POST sku/_search?pretty { "size":0, "suggest": { "suggester": { "prefix": "烟台", "completion": { "field": "title.title_suggest" } } } }展开
作者回复: 没毛病👍
共 4 条评论29 - 划过天空阿忠2020-03-27es这个结构化mapping感觉好麻烦,另外老师三俩句就把倒排索引给我讲清楚了,厉害!11
- 黄平2020-03-19老师,es除了做搜索,还有哪些业务场景可以使用呢?能简单列举下吗?
作者回复: 另外一个常见的用法是,作为在线分析型数据库来使用,做一些海量数据的实时查询。
共 3 条评论8 - 大秦皇朝2020-03-11李sir我还想再问下,根据我们不同的业务,选分词插件有啥讲究没?虽有点跑题,但是能不能简单说下,感谢~
作者回复: 我没有专业做过搜索,我的朋友孙健(https://github.com/ansjsun)老师,他是开源分词项目ansj(https://github.com/NLPchina/ansj_seg)的作者,建议你和他讨论一下这个问题。
7 - Jax2020-03-10老师您好,是否可以做一些电商这种海量数据下,后台管理系统存储方面的最佳实践。还有对于不同系统之间的数据同步,也希望得到一些比较好的实践方案或者工具。 以下是比较具体的点: 我在上家公司也是做电商系统的,不过我负责的是后台商品数据的维护系统。前台可以用各种缓存来提速,但是对于后台系统,该如何让系统变得比较快?尤其是后台管理系统往往会涉及大批量商品的价格,库存之类的更新,并且更新后业务团队希望能实时看到他们更新成功了,而且有不少更新的操作对丢数据的容忍度比较低,这种情况下缓存也很难做,所以想得到一些对于这种大批量数据后台管理系统的实践经验。 对于数据同步,主要是有的原始数据存储在传统数据库,而为了速度,会存储到一些no sql产品做缓存,但是我们在实践中,经常会有一些丢数据,或者未能及时同步的情况发生,希望能得到这方面的一些经验分享。展开
作者回复: 你提的这些问题,我们在后面的课程中都会讲到。 比如,《11 | MySQL如何应对高并发(一):使用缓存保护MySQL》《17 | 大厂都是怎么做MySQL to Redis同步的?》这两节会讲怎么来更快更准确的更新缓存。 《19 | 跨系统实时同步数据,分布式事务是唯一的解决方案吗?》这节课会讲如何在异构数据库之间来实时同步数据。
共 2 条评论4 - 旅途2020-03-10老师 您说的二次查找是指在第一次的查找结果中继续查找吗
作者回复: 是的
共 2 条评论4 - 呦呦鹿鸣2020-04-14李老师好,请问下ES在做深度分页查询时的场景下有什么好的方案么
作者回复: 额……ES最不擅长的就是深分页了……所以,据我所知,没什么好的解决方案。
共 3 条评论3 - 王超2020-03-31老师,针对订单中心的表数据,业务库用mysql,同步到es做查询时,比如一个订单主表,关联5个子表,在es存的时候是以嵌套的形式存一个index,还是mysql一张表,对应es的一个index,然后维护父子关系?或者有更好的方案
作者回复: 这个取决于ES里面的这份订单数据服务什么业务。 比如,ES里面最常用的查询操作是查订单关联的商品,那就把订单表和订单商品表做成一张宽表。
共 2 条评论3 - yudidi2020-04-22注意type这个概念在es6之后被逐渐移除了。 https://www.elastic.co/guide/en/elasticsearch/reference/6.3/getting-started-concepts.html#_type共 2 条评论2
- 马晨阳2020-04-10对于分布式事务部分还是没太能理解,老师可否加个餐,展示一波代码看一下2pc和tcc具体的代码实战2
- 郭刚2020-03-24用ES有两个问题,1.它不适合多索引关联,就像关系数据库的多表关联,那关系数据库多表关联查询的情况是不是建一张中间表,把中间表的数据导入到es 2.要做到准实时的要求,有没有好的方式
作者回复: 其实我见到一些业务,用ES来作为在线分析的数据库,实时的进行多表联查,性能也还可以。虽然从数据结构上来说,像你说的不太适合干这个活儿。但所谓“一力降十会”,因为ES它是内存数据库,加上原生分布式,自带Map-Reduce光环,很多情况实际表现还是不错的。你可以尝试一下。
2 - 发条橙子 。2020-03-10老师 面试中经常会有问到几千万条数据列表的查询如何实现 ,本质就是考避免使用数据库而选择这种es来搜索是么 。 那几千万条数据在es中查询 “苹果” 是不是也会有性能之类的问题
作者回复: 也不能说MySQL就慢,ES就快,最终查询性能还是要取决于数据总量和存储结构,当然ES它是内存数据库,占一些优势。 后面我们会用几节课来讲,到底是什么因素影响查询快慢。
共 2 条评论2 - 每天晒白牙2020-03-15思考题需要把要支持前缀推荐的 field 的类型设置为 completion,现在只支持前缀匹配1
- 每天晒白牙2020-03-15老师,有个问题请教一下,如果用 ES 做全文检索,需要把 title 的类型设置为 text,支持分词,这样就可以像老师在专栏中介绍的一样,用 “苹果手机”进行全文检索了。 但是如果要实现思考题这种前缀推荐,需要 title 的类型为 completion。 要想实现 title 既支持前缀推荐,又支持全文检索,但一个 field 只能设置一种类型,这种该怎么实现呢?共 1 条评论1
- 大秦皇朝2020-03-11windows下测试避坑: 分词插件icu支持路径中带空格或者说是可以es放在Program Files下;如果用ik的话,建议路径不要带空格,网上很多说权限之类的,我把权限调整了也不行,路径不带空格立马OK。共 1 条评论1
- 每天晒白牙2020-03-10老师,请教个问题,比如一个商品搜索系统,给一些商品打标签,然后支持根据商品信息和标签搜索商品,有啥方案吗?
作者回复: 这个需求用ES很合适啊
共 2 条评论1 - ifelse2022-12-06 来自浙江学习打卡