Elasticsearch 基础教程

Elasticsearch 高级教程

Elasticsearch 插件

Elasticsearch 笔记

Elasticsearch FAQ

original icon
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.knowledgedict.com/tutorial/elasticsearch-e-commerce-search.html

Elasticsearch 电商搜索


本文主要介绍用 Elasticsearch 构建电商搜索平台的经典设计。

电商数据系统数据类型

一个大型的电商平台,每天都要产生千万条原始数据,上亿条用户行为数据。一般来说,电商数据一般有3种主要类型的数据系统。

关系型数据库

大多数互联网公司会选用 MySQL 作为关系型数据库的主选,用于存储商品、用户信息等数据。关系型数据库对于事务性非常高的 OLTP 操作(比如订单、结算等)支持良好。

Hadoop生态

Hadoop 是数据仓库主要的载体,除了备份关系型数据库的所有版本,还存储用户行为、点击、曝光、互动等海量日志数据,Hadoop 对于数据分析、数据挖掘等 OLAP 的操作支持比关系型数据库更加具有扩展性和稳定性。

搜索引擎

以 Elasticsearch 和 Solr 为代表的搜索引擎。搜索引擎是获取信息最高效的途径,几乎成为各类网站及应用的基础标配设施(地位仅次于数据库)。

搜索引擎架构

目前搜索引擎技术已经有非常成熟的开源解决方案,最出名的 Elasticsearch 和 Solr 都是基于 Lucence 的。很多中小型互联网公司搜索引擎都是基于这两个开源系统搭建的,但是即便如此,一个搜索引擎团队想把搜索引擎质量做到商用标准,从系统熟悉,服务搭建,功能定制,通常需要花费较长时间。

通用搜索引擎应用在互联网商用搜索 通常会遇到如下几个问题:

  • 搜索引擎与公司现有数据系统的集成。MySQL 和 Hadoop 是电商的两个主要数据载体,搜索引擎在全量和增量建索引过程中必须和 MySQL 或 Hadoop 无缝集成,才能发挥搜索引擎自身的实时性,水平扩展性(性能与容量和机器数量成正比)等优势。
  • 商用搜索高度定制化与通用搜索引擎的矛盾。商用搜索的问题有时候超越了搜索引擎本身解决的范围,比如商品的去重,店铺的去重需要很专业的搜索引擎使用技巧;商品的权重,用户意图的识别需要算法和模型的支持。
  • 在不了解搜索引擎专业知识的前提下,很难创建对性能友好的索引。结果造成了通用搜索性能很差的假象。

技术架构

搜索引擎基于分布式实时引擎 Elasticsearch(简称 ES)。ES 构建在开源社区最稳定成熟的索引库 Lucence 上,支持多用户租用,高可用,可水平扩展,并有自动容错和自动伸缩的机制。同时实现了 ES 与 MySQL 和 Hadoop 的无缝集成。此外,开发高级搜索模块,提供灵活的相关性计算框架等功能。

索引构建

互联网索引的特点是实时性高,数据量大。时效性要求用户和客户的各种行为能够第一时间进入索引;数据量大要求一个有效分布式方案可以在常数时间内创建不断增长的TB数量级索引。

实时索引我们采用面向队列的架构,数据首先写入 DB (或文件),然后通过数据库同步机制将数据流写入 Kafka 队列。这种同步机制和数据库主从同步的原理相同,主要的开源产品有 mypipe 和阿里推出的 canal。ES 通过订阅相应的topic实现实时建立索引。

如果数据源是文件,则可以使用 Flume 或 Logstash 实时写入 Kafka。

另外一个索引问题是全量索引。有如下几个场景让 全量索引是一个必要过程:

  • 实时更新有可能会丢数据,每次很少的丢失时间长了降低搜索引擎的质量。 周期性的全量更新是解决这个问题的最直接的方法;
  • 即使能够保证实时更新,业务的发展有可能有重新建索引的需求(比如增加字段,修改属性,修改分词算法等);
  • 很多搜索引擎是在业务开始后很久才搭建的,冷启动必须全量创建索引。

可以采用 ES-Hadoop 利用 Hadoop 分布式的特性来创建索引。Elasticsearch-Hadoop (ES-Hadoop) 连接器将 Hadoop 海量的数据存储和深度加工能力与 Elasticsearch 实时搜索和分析功能进行连接。它能够让开发者快速深入了解大数据,并让其在 Hadoop 生态系统中更好地开展工作。

有了 ES-Hadoop,开发者可以轻松构建动态的嵌入式搜索应用来处理您的 Hadoop 数据,或者使用全文本、空间地理查询和聚合,执行深度的低延时分析。凭借现有 Hadoop API 的动态扩展,ES-Hadoop 让开发者能够在 Elasticsearch 和 Hadoop 之间轻松地双向移动数据,同时借助 HDFS 作为存储库,进行长期存档。分区感知、故障处理、类型转换和数据共享均可透明地完成。

一般不建议从数据库或文件系统来全量索引。主要有2点原因:

  1. 这会对业务系统造成很大的压力;
  2. 因为数据库和文件系统都不是真正分布式系统,自己写程序保证全量索引的水平扩展性很容易出问题,也没有必要这么做。

全量索引和增量索引的架构如下图所示。

另外一点是 Hadoop 也是订阅 Kafka 备份数据库和日志的。建议一个公司所有 DB 和文件都存储在 Hadoop 上,这样做起码有2个好处:

  1. Hadoop 上使用 Hive 或者 Spark 创建的数据仓库为大数据提供统一的操作接口;
  2. Hadoop 数据相对于线上更加稳定,可以作为数据恢复的最后一个防线。

高级搜索

高级搜索模块(Advanced Search,简记作AS)在商业搜索引擎中起到至关重要的作用。在各大商业搜索引擎公司里面 AS 已经成为标配,也是变更最为频繁的模块。

AS 在商业搜索引擎中主要起到如下作用:

  1. 反向代理,实现基于分片的分布式搜索(实际上 ES 有这个功能),提供必要的容灾支持;
  2. 提供插件化的相关性计算框架;
  3. 提供丰富的相关性库,比如 query 分析库、query 改写库、排序库、过滤库等;
  4. 管理不同的搜索业务。

AS 一个主要的功能是通过一个个业务插件来代表相应的搜索。一个最简单的插件只需要包含对应的 ES search API,它实际上就是一个配置项,指明 ES 的地址。这样 AS 就是一个纯代理。但是商业搜索的需求都不是ES本身就能够完全支持的,所以就需要根据需求写相应的 query rewriter,rerank 等算法插件。这样就实现了框架和业务分离,AS 具有极强的扩展性和复用性。

AS 另一个功能是提供通用算法库,实际上它只为每种算法提供编程框架。算法也是通过插件的方式加入算法库的。这种方法可以让算法工程师抽象公共算法库供业务方使用,避免重新造轮子。一个具体业务要么使用已经存在的算法(并修改参数),要么自己实现算法。

在Django中,搜索数据库的所有方法主要涉及模型管理器(ModelManager)和查询集(QuerySet)。查询集的exclude() ...
Elasticsearch 的高亮(highlight)可以让您从搜索结果中的一个或多个字段中获取突出显示的摘要,以便向用户显示查询匹配的位 ...
本章列出了搜索系统开发中常涉及的内容及常见问题的解决方案。 ...
搜索系统的排序层又称为精排层,主要是基于离线训练好的模型,结合模型所用的特征给每个 item 进行打分,然后根据分数进行降序排序。搜索排序模 ...