Elasticsearch

1、elasticsearch 了解多少,说说你们公司 es 的集群架构,索引数据大小,分片有多少,以及一些调优手段 。

面试官: 想 了解 应聘 者之 前公 司接 触的 ES 使用 场景 、规 模, 有没 有做 过比 较大 规模 的索 引设 计、 规划 、调 优。 解答 : 如实 结合 自己 的实 践场 景回 答即 可。

比如: ES 集群 架构 13 个节 点, 索引 根据 通道 不同 共 20+索引, 根 据日 期, 每日 递增 20+, 索 引: 10 分片, 每 日递 增 1 亿 +数据,

每个 通道 每天 索引 大小 控制: 150GB 之内 。

仅索 引层 面调 优手 段:

1.1、设 计阶 段调 优

1、根 据业 务增 量需 求, 采取 基于 日期 模板 创建 索引, 通 过 roll over API 滚动 索 引;

2、使 用别 名进 行索 引管 理;

3、每 天凌 晨定 时对 索引 做 force_merge 操作, 以 释放 空间;

4、采 取 冷 热 分 离 机 制,热 数 据 存 储 到 SSD,提 高 检 索 效 率;冷 数 据 定 期 进 行 shrink 操 作, 以 缩 减 存 储;

5、 采 取 curator 进 行 索 引 的 生 命 周 期 管 理;

6、 仅 针 对 需 要 分 词 的 字 段, 合 理 的 设 置 分 词 器;

7、Mapping 阶 段 充 分 结 合 各 个 字 段 的 属 性,是 否 需 要 检 索 、是 否 需 要 存 储 等 。… … ..

1.2、写 入调 优

1、 写 入 前 副 本 数 设 置 为 0;

2、 写 入 前 关 闭 refresh_interval 设 置 为 -1, 禁 用 刷 新 机 制;

3、 写 入 过 程 中: 采 取 bulk 批 量 写 入;

4、 写 入 后 恢 复 副 本 数 和 刷 新 间 隔;

5、 尽 量 使 用 自 动 生 成 的 id。

1.3、查 询调 优

1、 禁 用 wildcard;

2、 禁 用 批 量 terms (成 百 上 千 的 场 景) ;

3、 充 分 利 用 倒 排 索 引 机 制, 能 keyword 类 型 尽 量 keyword;

4、 数 据 量 大 时 候, 可 以 先 基 于 时 间 敲 定 索 引 再 检 索;

5 、 设 置 合 理 的 路 由 机 制 。

1.4、其 他调 优

部 署 调 优, 业 务 调 优 等 。

上 面 的 提 及 一 部 分, 面 试 者 就 基 本 对 你 之 前 的 实 践 或 者 运 维 经 验 有 所 评 估 了 。

2、 elasticsearch 的倒排索引是什么

面试官: 想 了 解 你 对 基 础 概 念 的 认 知 。

解答: 通 俗 解 释 一 下 就 可 以 。 传 统 的 我 们 的 检 索 是 通 过 文 章, 逐 个 遍 历 找 到 对 应 关 键 词 的 位 置 。 而 倒 排 索 引, 是 通 过 分 词 策 略, 形 成 了 词 和 文 章 的 映 射 关 系 表, 这 种 词 典 +映 射 表 即 为 倒 排 索 引 。 有 了 倒 排 索 引, 就 能 实 现 o (1) 时间复杂度 的 效 率 检 索 文 章 了, 极 大 的 提 高 了 检 索 效 率 。

学术 的解 答方 式:

倒排 索引, 相 反于 一篇 文章 包含 了哪 些词, 它 从词 出发, 记 载了 这个 词在 哪些 文 档中 出现 过, 由两 部分 组成 — —词典 和倒 排表 。

加分项: 倒 排索 引的 底层 实现 是基 于: FST (Finite State Transducer) 数 据结 构。

lucene 从 4+版本 后开 始大 量使 用的 数据 结构 是 FST 。 FST 有两 个优 点:

1、空 间占 用小 。通 过对 词典 中单 词前 缀和 后缀 的重 复利 用, 压缩 了存 储空 间;

2、查 询速 度快 。 O(len(str))的查 询时 间复 杂度 。

3、 elasticsearch 索引数据多了怎么办,如何调优,部署

面试官: 想 了解 大数 据量 的运 维能 力。

解答: 索 引数 据的 规划, 应 在前 期做 好规 划, 正所 谓 “ 设计 先行, 编 码在 后”, 这样 才能 有效 的避 免突 如其 来的 数据 激增 导致 集群 处理 能力 不足 引发 的线 上客 户 检索 或者 其他 业务 受到 影响 。 如何 调优, 正 如问 题 1 所说, 这 里细 化一 下:

3.1 动态 索引 层面

基于 模板+时间+rollover api 滚动创建 索引, 举 例: 设计 阶段 定义: blog 索 引的 模板 格式 为: blog_index_时间 戳的 形式, 每 天递 增数 据。

这样 做的 好处: 不 至于 数据 量激 增导 致单 个索 引数 据量 非常 大, 接近 于上 线 2 的 32 次幂 -1, 索 引存 储达 到了 TB+甚至 更大 。

一旦 单个 索引 很大, 存 储等 各种 风险 也随 之而 来, 所以 要提 前考 虑+及早 避免 。

3.2 存储 层面

冷热数据分离存储, 热数 据 (比如 最近 3 天或 者一 周的 数据) , 其余 为冷 数据 。 对于 冷数 据不 会再 写入 新数 据, 可以 考虑 定期 force_merge 加 shrink 压缩 操作 , 节省 存储 空间 和检 索效 率。

3.3 部署 层面

一旦 之前 没有 规划, 这 里就 属于 应急 策略 。

结合 ES 自身 的支 持动 态扩 展的 特点, 动态 新增 机器 的方 式可 以缓 解集 群压 力, 注 意: 如果 之前 主节 点等规划合理, 不 需要 重启 集群 也能 完成 动态 新增 的。

4、 elasticsearch 是如何实现 master 选举的

面试官: 想 了解 ES 集群 的底 层原 理, 不再 只关 注业 务层 面了 。 解答 : 前置 前提 : 1、只 有候 选主 节点 (master: true) 的 节点 才能 成为 主节 点。 2、最 小主 节点 数(min_master_nodes) 的 目的 是防 止脑 裂。 这个 我看 了各 种网 上分 析的 版本 和源 码分 析的 书籍, 云 里雾 里。 核对 了一 下代 码, 核心 入口 为 findMaster, 选择 主节 点成 功返 回对 应 Master, 否 则返 回 null。选 举流 程大 致描 述如 下:

第一 步: 确认 候选 主节 点数 达标, elasticsearch.yml 设置 的 值

discovery.zen.minimum_master_nodes;

第二 步: 比较: 先 判定 是否 具备 master 资格, 具 备候 选主 节点 资格 的优 先返 回; 若两 节点 都为 候选 主节 点, 则 id 小的 值会 主节 点 。 注意 这里 的 id 为 string 类型 。

题外 话: 获取 节点 id 的方 法。 1GET /_cat/nodes?v&h=ip,port,heapPercent,heapMax,id,name 2ip port heapPercent heapMax id name

5、详细描述一下 Elasticsearch 索引文档的过程

面试官: 想 了解 ES 的底 层原 理, 不再 只关 注业 务层 面了 。

解答:

这里 的索 引文 档应 该理 解为 文档 写入 ES, 创 建索 引的 过程 。

文档 写入 包含: 单文 档写 入和 批量 bulk 写入, 这里 只解 释一 下: 单文 档写 入流 程 。 记住 官方 文档 中的 这个 图。

第一 步: 客户 写集 群某 节点 写入 数据, 发送 请求 。 (如果 没有 指定 路由/协调 节点, 请求 的节 点扮 演路由节点的角 色。 )

第二 步: 节点 1 接受 到请 求后, 使用 文档 _id 来确 定文 档属 于分 片 0 。 请求 会被 转 到另 外的 节点, 假 定节 点 3。因 此分 片 0 的主 分片 分配 到节 点 3 上。

第三 步: 节点 3 在主 分片 上执 行写 操作, 如 果成 功, 则将 请求 并行 转发 到节 点 1 和节 点 2 的副 本分 片上, 等 待结 果返 回。 所有 的副 本分 片都 报告 成功, 节 点 3 将 向协 调节 点(节点 1) 报 告成 功, 节点 1 向请 求客 户端 报告 写入 成功 。

如果 面试 官再 问: 第二 步中 的文 档获 取分 片的 过程?

回答: 借助 路由 算法 获取, 路由 算法 就是 根据 路由 和文 档 id 计算 目标 的分 片 id 的 过程 。 1shard = hash(_routing) % (num_of_primary_shards)

6、详细描述一下 Elasticsearch 搜索的过程?

面试官: 想 了解 ES 搜索 的底 层原 理, 不再 只关 注业 务层 面了 。

解答:

搜索 拆解 为 “ query then fetch ” 两个 阶段 。

query 阶段 的目 的: 定 位到 位置, 但 不取 。 步骤 拆解 如下 : 1、假 设一 个索 引数 据有 5 主 +1 副本 共 10 分片, 一 次请 求会 命中 (主 或者 副本 分片 中) 的一 个。 2、每 个分 片在 本地 进行 查询, 结 果返 回到 本地 有序 的优 先队 列中 。 3、第 2) 步 骤的 结果 发送 到协 调节 点, 协调 节点 产生 一个 全局 的排 序列 表。

fetch 阶段 的目 的: 取 数据 。

路由 节点 获取 所有 文档, 返 回给 客户 端。

7、 Elasticsearch 在部署时,对 Linux 的设置有哪些优化方法

面试官: 想 了解 对 ES 集群 的运 维能 力。

解答:

1、关 闭缓 存 swap;

2、堆 内存 设置 为: Min (节 点内 存/2, 32GB) ;

3、设 置最 大文 件句 柄数;

4、线 程池 +队列 大小 根据 业务 需要 做调 整;

5 、磁盘 存储 raid 方式 — —存储 有条 件使 用 RAID10, 增加 单节 点性 能以 及避 免单 节点 存储 故障 。

8、 lucence 内部结构是什么?

面试官: 想 了解 你的 知识 面的 广度 和深 度。

解答:

Lucene 是 有 索 引 和 搜 索 的 两 个 过 程, 包 含 索 引 创 建, 索 引, 搜 索 三 个 要 点 。 可 以 基 于 这 个 脉 络 展 开 一 些 。

最 近 面 试 一 些 公 司, 被 问 到 的 关 于 Elasticsearch 和 搜 索 引 擎 相 关 的 问 题, 以 及 自 己 总 结 的 回 答 。

9、 Elasticsearch 是如何实现 Master 选举的?

1 、 Elasticsearch 的 选 主 是 ZenDiscovery 模 块 负 责 的, 主 要 包 含 Ping (节 点 之 间 通 过 这 个 RPC 来 发 现 彼 此) 和 Unicast (单 播 模 块 包 含 一 个 主 机 列 表 以 控 制 哪 些 节 点 需 要 ping 通) 这 两 部 分;

2、 对 所 有 可 以 成 为 master 的 节 点 (node.master: true) 根 据 nodeId 字 典 排 序, 每 次 选 举 每 个 节 点 都 把 自 己 所 知 道 节 点 排 一 次 序, 然 后 选 出 第 一 个 (第 0 位) 节 点, 暂 且 认 为 它 是 master 节 点 。

3 、 如 果 对 某 个 节 点 的 投 票 数 达 到 一 定 的 值 (可 以 成 为 master 节 点 数 n/2+1) 并 且 该 节 点 自 己 也 选 举 自 己, 那 这 个 节 点 就 是 master 。 否 则 重 新 选 举 一 直 到 满 足 上 述 条 件 。

4、 补 充: master 节 点 的 职 责 主 要 包 括 集 群 、 节 点 和 索 引 的 管 理, 不 负 责 文 档 级 别 的 管 理; data 节 点 可 以 关 闭 http 功 能 *。

10、 Elasticsearch 中的节点(比如共 20 个),其中的 10 个

选了一个 master,另外 10 个选了另一个 master,怎么办?

1、 当 集 群 master 候 选 数 量 不 小 于 3 个 时, 可 以 通 过 设 置 最 少 投 票 通 过 数 量 (discovery.zen.minimum_master_nodes) 超 过 所 有 候 选 节 点 一 半 以 上 来 解 决 脑 裂 问 题;

2、 当 候 选 数 量 为 两 个 时, 只 能 修 改 为 唯 一 的 一 个 master 候 选, 其 他 作 为 data 节 点, 避 免 脑 裂 问 题 。

11、客户端在和集群连接时,如何选择特定的节点执行请求的?

1 、 TransportClient 利 用 transport 模 块 远 程 连 接 一 个 elasticsearch 集 群 。 它 并 不 加 入 到 集 群 中,只 是 简 单 的 获 得 一 个 或 者 多 个 初 始 化 的 transport 地 址,并 以 轮 询 的 方 式 与 这 些 地 址 进 行 通 信 。

12、详细描述一下 Elasticsearch 索引文档的过程。

协调 节点 默认 使用 文档 ID 参与 计算 (也 支持 通过 routing) , 以便 为路 由提 供合 适的 分片 。

shard = hash(document_id) % (num_of_primary_shards)

1、当 分片 所在 的节 点接 收到 来自 协调 节点 的请 求后, 会 将请 求写 入到 Memory Buffer,然后 定时 (默认 是每 隔 1 秒) 写入 到 Filesystem Cache, 这个 从 Momery Buffer 到 Filesystem Cache 的过 程就 叫做 refresh;

2 、 当然 在某 些情 况下, 存在 Momery Buffer 和 Filesystem Cache 的数 据可 能会 丢失, ES 是通 过 translog 的机 制来 保证 数据 的可 靠性 的 。其实 现机 制是 接收 到请 求后, 同时 也会 写入 到 translog 中, 当 Filesystem cache 中的 数据 写入 到磁 盘中 时, 才会 清除 掉, 这个 过程 叫做 flush;

3、在 flush 过程 中, 内存 中的 缓冲 将被 清除, 内 容被 写入 一个 新段, 段 的 fsync 将创 建一 个新 的提 交点, 并 将内 容刷 新到 磁盘, 旧 的 translog 将被 删除 并开 始一 个新 的 translog。

4 、 flush 触发 的时 机是 定时 触发 (默 认 30 分钟) 或 者 translog 变得 太大 (默 认 为 512M) 时;

补充: 关 于 Lucene 的 Segement:

1 、 Lucene 索 引 是 由 多 个 段 组 成, 段 本 身 是 一 个 功 能 齐 全 的 倒 排 索 引 。

2、 段 是 不 可 变 的, 允 许 Lucene 将 新 的 文 档 增 量 地 添 加 到 索 引 中, 而 不 用 从 头 重 建 索 引 。

3、 对 于 每 一 个 搜 索 请 求 而 言, 索 引 中 的 所 有 段 都 会 被 搜 索, 并 且 每 个 段 会 消 耗 CPU 的 时 钟 周 、 文 件 句 柄 和 内 存 。 这 意 味 着 段 的 数 量 越 多, 搜 索 性 能 会 越 低 。

4 、 为 了 解 决 这 个 问 题, Elasticsearch 会 合 并 小 段 到 一 个 较 大 的 段, 提 交 新 的 合 并 段 到 磁 盘, 并 删 除 那 些 旧 的 小 段 。

13、详细描述一下 Elasticsearch 更新和删除文档的过程。

1、 删 除 和 更 新 也 都 是 写 操 作, 但 是 Elasticsearch 中 的 文 档 是 不 可 变 的, 因 此 不 能 被 删 除 或 者 改 动 以 展 示 其 变 更;

2 、 磁 盘 上 的 每 个 段 都 有 一 个 相 应 的 .del 文 件 。 当 删 除 请 求 发 送 后, 文 档 并 没 有 真 的 被 删 除, 而 是 在 .del 文 件 中 被 标 记 为 删 除 。 该 文 档 依 然 能 匹 配 查 询, 但 是 会 在 结 果 中 被 过 滤 掉 。 当 段 合 并 时, 在 .del 文 件 中 被 标 记 为 删 除 的 文 档 将 不 会 被 写 入 新 段 。

3 、在 新 的 文 档 被 创 建 时, Elasticsearch 会 为 该 文 档 指 定 一 个 版 本 号, 当 执 行 更 新 时, 旧 版 本 的 文 档 在 .del 文 件 中 被 标 记 为 删 除, 新 版 本 的 文 档 被 索 引 到 一 个 新 段 。 旧 版 本 的 文 档 依 然 能 匹 配 查 询, 但 是 会 在 结 果 中 被 过 滤 掉 。

14、详细描述一下 Elasticsearch 搜索的过程。

1、 搜 索 被 执 行 成 一 个 两 阶 段 过 程, 我 们 称 之 为 Query Then Fetch;

2 、 在 初 始 查询 阶段 时, 查 询 会 广 播 到 索 引 中 每 一 个 分 片 拷 贝 (主 分 片 或 者 副 本 分 片) 。 每 个 分 片 在 本 地 执 行 搜 索 并 构 建 一 个 匹 配 文 档 的 大 小 为 from + size 的 优 先 队 列 。

PS: 在 搜 索 的 时 候 是 会 查 询 Filesystem Cache 的, 但 是 有 部 分 数 据 还 在 Memory Buffer, 所 以 搜 索 是 近 实 时 的 。

3 、每 个 分 片 返 回 各 自 优 先 队 列 中 所有 文档 的 ID 和排 序值 给 协 调 节 点, 它 合 并 这 些 值 到 自 己 的 优 先 队 列 中 来 产 生 一 个 全 局 排 序 后 的 结 果 列 表 。

4、 接 下 来 就 是 取回 阶段, 协 调 节 点 辨 别 出 哪 些 文 档 需 要 被 取 回 并 向 相 关 的 分 片 提 交 多 个 GET 请 求 。 每 个 分 片 加 载 并 丰富 文 档, 如 果 有 需 要 的 话, 接 着 返 回 文 档 给 协 调 节 点 。 一 旦 所 有 的 文 档 都 被 取 回 了, 协 调 节 点 返 回 结 果 给 客 户 端 。

5、 补 充: Query Then Fetch 的 搜 索 类 型 在 文 档 相 关 性 打 分 的 时 候 参 考 的 是 本 分 片 的 数 据, 这 样 在 文 档 数 量 较 少 的 时 候 可 能 不 够 准 确, DFS Query Then Fetch 增 加 了 一 个 预 查 询 的 处 理, 询 问 Term 和 Document frequency, 这 个 评 分 更 准 确, 但 是 性 能 会 变 差 。 *

15、在 Elasticsearch 中,是怎么根据一个词找到对应的倒排索

引的?

SEE:

Lucene 的索引文件格式(1)

Lucene 的索引文件格式(2)

16、 Elasticsearch 在部署时,对 Linux 的设置有哪些优化方

法?

1 、64 GB 内 存 的 机 器 是 非 常 理 想 的, 但 是 32 GB 和 16 GB 机 器 也 是 很 常 见 的 。

少 于 8 GB 会 适 得 其 反 。

2、 如 果 你 要 在 更 快 的 CPUs 和 更 多 的 核 心 之 间 选 择, 选 择 更 多 的 核 心 更 好 。 多 个 内 核 提 供 的 额 外 并 发 远 胜 过 稍 微 快 一 点 点 的 时 钟 频 率 。

3 、 如 果 你 负 担 得 起 SSD, 它 将 远 远 超 出 任 何 旋 转 介 质 。 基 于 SSD 的 节 点, 查 询 和 索 引 性 能 都 有 提 升 。 如 果 你 负 担 得 起, SSD 是 一 个 好 的 选 择 。

4 、 即 使 数 据 中 心 们 近 在 咫 尺, 也 要 避 免 集 群 跨 越 多 个 数 据 中 心 。 绝 对 要 避 免 集 群 跨 越 大 的 地 理 距 离 。

5、 请 确 保 运 行 你 应 用 程 序 的 JVM 和 服 务 器 的 JVM 是 完 全 一 样 的 。 在

Elasticsearch 的 几 个 地 方, 使 用 Java 的 本 地 序 列 化 。

6、 通 过 设 置 gateway.recover_after_nodes 、 gateway.expected_nodes 、 gateway.recover_after_time 可 以 在 集 群 重 启 的 时 候 避 免 过 多 的 分 片 交 换, 这 可 能 会 让 数 据 恢 复 从 数 个 小 时 缩 短 为 几 秒 钟 。

7 、 Elasticsearch 默 认 被 配 置 为 使 用 单 播 发 现, 以 防 止 节 点 无 意 中 加 入 集 群 。 只 有 在 同 一 台 机 器 上 运 行 的 节 点 才 会 自 动 组 成 集 群 。 最 好 使 用 单 播 代 替 组 播 。

8、 不 要 随 意 修 改 垃 圾 回 收 器 (CMS) 和 各 个 线 程 池 的 大 小 。

9、 把 你 的 内 存 的 (少 于) 一 半 给 Lucene (但 不 要 超 过 32 GB! ) , 通 过 ES_HEAP_SIZE 环 境 变 量 设 置 。

10、 内 存 交 换 到 磁 盘 对 服 务 器 性 能 来 说 是 致 命 的 。 如 果 内 存 交 换 到 磁 盘 上, 一 个 100 微 秒 的 操 作 可 能 变 成 10 毫 秒 。 再 想 想 那 么 多 10 微 秒 的 操 作 时 延 累 加 起 来 。 不 难 看 出 swapping 对 于 性 能 是 多 么 可 怕 。

11 、 Lucene 使 用 了 大量的文 件 。 同 时, Elasticsearch 在 节 点 和 HTTP 客 户 端 之 间 进 行 通 信 也 使 用 了 大 量 的 套 接 字 。 所 有 这 一 切 都 需 要 足 够 的 文 件 描 述 符 。 你 应 该 增 加 你 的 文 件 描 述 符, 设 置 一 个 很 大 的 值, 如 64,000。

补充: 索 引阶 段性 能提 升方 法

1、 使 用 批 量 请 求 并 调 整 其 大 小: 每 次 批 量 数 据 5– 15 MB 大 是 个 不 错 的 起 始 点 。

2、 存 储: 使 用 SSD

3 、 段 和 合 并: Elasticsearch 默 认 值 是 20 MB/s, 对 机 械 磁 盘 应 该 是 个 不 错 的 设 置 。如 果 你 用 的 是 SSD, 可 以 考 虑 提 高 到 100 – 200 MB/s。如 果 你 在 做 批 量 导 入, 完 全 不 在 意 搜 索, 你 可 以 彻 底 关 掉 合 并 限 流 。 另 外 还 可 以 增 加

index.translog.flush_threshold_size 设 置, 从 默 认 的 512 MB 到 更 大 一 些 的 值, 比 如 1 GB, 这 可 以 在 一 次 清 空 触 发 的 时 候 在 事 务 日 志 里 积 累 出 更 大 的 段 。

4、 如 果 你 的 搜 索 结 果 不 需 要 近 实 时 的 准 确 度, 考 虑 把 每 个 索 引 的 index.refresh_interval 改 到 30s。

5 、 如 果 你 在 做 大 批 量 导 入, 考 虑 通 过 设 置 index.number_of_replicas: 0 关 闭 副 本 。

17、对于 GC 方面,在使用 Elasticsearch 时要注意什么?

1 、 SEE: Day19 ES内存那点事 - 搜索客,搜索人自己的社区

2、 倒 排 词 典 的 索 引 需 要 常 驻 内 存, 无 法 GC, 需 要 监 控 data node 上 segment memory 增 长 趋 势 。

3 、 各 类 缓 存, field cache, filter cache, indexing cache, bulk queue 等 等, 要 设 置 合 理 的 大 小, 并 且 要 应 该 根 据 最 坏 的 情 况 来 看 heap 是 否 够 用, 也 就 是 各 类 缓 存 全 部 占 满 的 时 候,还 有 heap 空 间 可 以 分 配 给 其 他 任 务 吗? 避 免 采 用clear cache 等 “ 自 欺 欺 人 ”的 方 式 来 释 放 内 存 。

4 、 避 免 返 回 大 量 结 果 集 的 搜 索 与 聚 合 。 确 实 需 要 大 量 拉 取 数 据 的 场 景, 可 以 采 用 scan & scroll api 来 实 现 。

5 、 cluster stats 驻 留 内 存 并 无 法 水 平 扩 展, 超 大 规 模 集 群 可 以 考 虑 分 拆 成 多 个 集 群 通 过 tribe node 连 接 。

6、 想 知 道 heap 够 不 够, 必 须 结 合 实 际 应 用 场 景, 并 对 集 群 的 heap 使 用 情 况 做 持 续 的 监 控 。

18、Elasticsearch 对于大数据量(上亿量级)的聚合如何实现?

Elasticsearch 提 供 的 首 个 近 似 聚 合 是 cardinality 度 量 。它 提 供 一 个 字 段 的 基 数, 即 该 字 段 的 distinct或 者 unique值 的 数 目 。 它 是 基 于 HLL 算 法 的 。 HLL 会 先 对 我 们 的 输 入 作 哈 希 运 算,然 后 根 据 哈 希 运 算 的 结 果 中 的 bits 做 概 率 估 算 从 而 得 到 基 数 。 其 特 点 是: 可 配 置 的 精 度, 用 来 控 制 内 存 的 使 用 (更 精 确 = 更 多 内 存) ; 小 的 数 据 集 精 度 是 非 常 高 的; 我 们 可 以 通 过 配 置 参 数, 来 设 置 去 重 需 要 的 固 定 内 存 使 用 量 。 无 论 数 千 还 是 数 十 亿 的 唯 一 值, 内 存 使 用 量 只 与 你 配 置 的 精 确 度 相 关 。

19、在并发情况下, Elasticsearch 如果保证读写一致?

1 、 可 以 通 过 版 本 号 使 用 乐 观 并 发 控 制, 以 确 保 新 版 本 不 会 被 旧 版 本 覆 盖, 由 应 用 层 来 处 理 具 体 的 冲 突;

2、 另 外 对 于 写 操 作, 一 致 性 级 别 支 持 quorum/one/all, 默 认 为 quorum, 即 只

有 当 大 多 数 分 片 可 用 时 才 允 许 写 操 作 。 但 即 使 大 多 数 可 用, 也 可 能 存 在 因 为 网 络 等 原 因 导 致 写 入 副 本 失 败, 这 样 该 副 本 被 认 为 故 障, 分 片 将 会 在 一 个 不 同 的 节 点

上 重 建 。

3、 对 于 读 操 作, 可 以 设 置 replication 为 sync(默 认 ), 这 使 得 操 作 在 主 分 片 和 副 本 分 片 都 完 成 后 才 会 返 回; 如 果 设 置 replication 为 async 时, 也 可 以 通 过 设 置 搜 索 请 求 参 数 _preference 为 primary 来 查 询 主 分 片, 确 保 文 档 是 最 新 版 本 。

20、如何监控 Elasticsearch 集群状态?

Marvel 让 你 可 以 很 简 单 的 通 过 Kibana 监 控 Elasticsearch。你 可 以 实 时 查 看 你 的 集 群 健 康 状 态 和 性 能, 也 可 以 分 析 过 去 的 集 群 、 索 引 和 节 点 指 标 。

21、介绍下你们电商搜索的整体技术架构。

22、介绍一下你们的个性化搜索方案?

SEE 基 于 word2vec 和 Elasticsearch 实 现 个 性 化 搜 索

23、是否了解字典树?

常 用 字 典 数 据 结 构 如 下 所 示:

Trie 的 核 心 思 想 是 空 间 换 时 间, 利 用 字 符 串 的 公 共 前 缀 来 降 低 查 询 时 间 的 开 销 以 达 到 提 高 效 率 的 目 的 。 它 有 3 个 基 本 性 质:

1 、 根 节 点 不 包 含 字 符, 除 根 节 点 外 每 一 个 节 点 都 只 包 含 一 个 字 符 。

2、 从 根 节 点 到 某 一 节 点, 路 径 上 经 过 的 字 符 连 接 起 来, 为 该 节 点 对 应 的 字 符 串 。

3 、 每 个 节 点 的 所 有 子 节 点 包 含 的 字 符 都 不 相 同 。

1 、 可 以 看 到, trie 树 每 一 层 的 节 点 数 是 26^i 级 别 的 。 所 以 为 了 节 省 空 间, 我 们 还 可 以 用 动 态 链 表, 或 者 用 数 组 来 模 拟 动 态 。 而 空 间 的 花 费, 不 会 超 过 单 词 数 × 单 词 长 度 。

2 、 实 现: 对 每 个 结 点 开 一 个 字 母 集 大 小 的 数 组, 每 个 结 点 挂 一 个 链 表, 使 用 左 儿 子 右 兄 弟 表 示 法 记 录 这 棵 树;

3 、 对 于 中 文 的 字 典 树, 每 个 节 点 的 子 节 点 用 一 个 哈 希 表 存 储, 这 样 就 不 用 浪 费 太 大 的 空 间, 而 且 查 询 速 度 上 可 以 保 留 哈 希 的 复 杂 度 O(1)。

24、拼写纠错是如何实现的?

1 、 拼 写 纠 错 是 基 于 编 辑 距 离 来 实 现; 编 辑 距 离 是 一 种 标 准 的 方 法, 它 用 来 表 示 经 过 插 入 、 删 除 和 替 换 操 作 从 一 个 字 符 串 转 换 到 另 外 一 个 字 符 串 的 最 小 操 作 步 数;

2 、 编 辑 距 离 的 计 算 过 程: 比 如 要 计 算 batyu 和 beauty 的 编 辑 距 离, 先 创 建 一 个 7 × 8 的 表 (batyu 长 度 为 5, coffee 长 度 为 6, 各 加 2) , 接 着, 在 如 下 位 置 填 入 黑 色 数 字 。 其 他 格 的 计 算 过 程 是 取 以 下 三 个 值 的 最 小 值:

如 果 最 上 方 的 字 符 等 于 最 左 方 的 字 符, 则 为 左 上 方 的 数 字 。 否 则 为 左 上 方 的 数 字

+1 。 (对 于 3,3 来 说 为 0)

左 方 数 字 +1 (对 于 3,3 格 来 说 为 2)

上 方 数 字 +1 (对 于 3,3 格 来 说 为 2)

最 终 取 右 下 角 的 值 即 为 编 辑 距 离 的 值 3。

对于 拼写 纠错, 我 们考 虑构 造一 个度 量空 间( Metric Space) , 该空 间内 任何 关 系满 足以 下三 条基 本条 件:

d(x,y) = 0 -- 假如 x 与 y 的距 离为 0, 则 x=y

d(x,y) = d(y,x) -- x 到 y 的距 离等 同于 y 到 x 的距 离

d(x,y) + d(y,z) >= d(x,z) -- 三角 不等 式

1 、 根据 三角 不等 式, 则满 足与 query 距离 在 n 范围 内的 另一 个字 符转 B, 其与 A 的距 离最 大为 d+n, 最 小为 d-n。

2 、 BK 树的 构造 就过 程如 下: 每个 节点 有任 意个 子节 点, 每条 边有 个值 表示 编辑 距离 。所有 子节 点到 父节 点的 边上 标注 n 表示 编辑 距离 恰好 为 n 。 比如, 我们 有棵

树父 节点 是”book ”和两 个子 节点 ”cake ”和 ”books ”, ” book ”到 ”books ” 的边 标号 1, ” book ” 到”cake ” 的边 上标 号 4。从 字典 里构 造好 树后, 无 论何 时你 想插 入新 单词 时, 计算 该单 词与 根节 点的 编辑 距离, 并 且查 找数 值为 d(neweord, root)的边 。递 归得 与各 子节 点进 行比 较, 直到 没有 子节 点, 你就 可 以创 建新 的子 节点 并将 新单 词保 存在 那 。 比如, 插入 ”boo ”到刚 才上 述例 子的 树 中, 我们 先检 查根 节点, 查找 d( “ book ” , “ boo ” ) = 1 的边, 然后 检查 标号 为 1 的边 的子 节点,得到 单词 ”books ”。我们 再计 算距 离 d(“ books ”, “ boo ”)=2 , 则将 新单 词插 在”books ” 之后, 边 标号 为 2。

3、查 询相 似词 如下: 计 算单 词与 根节 点的 编辑 距离 d, 然 后递 归查 找每 个子 节点 标号 为 d-n 到 d+n (包含) 的边 。 假如 被检 查的 节点 与搜 索单 词的 距离 d 小于 n, 则返 回该 节点 并继 续查 询 。 比如 输入 cape 且最 大容 忍距 离为 1, 则先 计算 和根 的 编辑 距离 d( “ book ” , “ cape ” )=4, 然 后接 着找 和根 节点 之间 编辑 距离 为 3 到 5 的, 这个 就找 到了 cake 这个 节点, 计算 d( “ cake ” , “ cape ” )=1, 满足 条件 所以 返回 cake, 然 后再 找和 cake 节点 编辑 距离 是 0 到 2 的, 分别 找到 cape 和 cart 节点, 这 样就 得到 cape 这个 满足 条件 的结 果。

  • 18
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值