作者:微信小助手
<section data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="margin-bottom: 0px;padding-left: 10px;padding-right: 10px;background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;font-family: Optima, " microsoft yahei, pingfangsc-regular, serif;font-size: 16px;color: rgb(0, 0, 0);line-height: 1.5em;word-spacing: 0em;letter-spacing: 0em;word-break: break-word;text-align: left;> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><br></p> <ul style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;" class="list-paddingleft-1"> <li><p>1 导读</p></li> <li><p>2 背景介绍</p></li> <ul style="list-style-type: square;margin-top: 8px;margin-bottom: 8px;padding-left: 25px;" class="list-paddingleft-1"> <li><p>2.1 为什么搭建数仓评估体系</p></li> <li><p>2.2 需要解决的技术问题</p></li> </ul> <li><p>3 设计思路</p></li> <ul style="list-style-type: square;margin-top: 8px;margin-bottom: 8px;padding-left: 25px;" class="list-paddingleft-1"> <li><p>3.1 整体架构设计</p></li> <li><p>3.2 产品形态设计</p></li> <li><p>3.2 指标体系搭建</p></li> </ul> <li><p>4 结果呈现</p></li> <ul style="list-style-type: square;margin-top: 8px;margin-bottom: 8px;padding-left: 25px;" class="list-paddingleft-1"> <li><p>4.1 结果评估模块展示</p></li> <li><p>4.2 过程评估模块展示</p></li> <li><p>4.3 阶段性治理收益</p></li> </ul> <li><p>5 未来规划</p></li> </ul> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><br></p> <h2 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;"><span style="display: none;"></span><span style="font-size: 22px;line-height: 1.5em;letter-spacing: 0em;font-weight: bold;display: block;">1 导读</span><span style="display: none;"></span></h2> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"> 本次分享偏向于面向数仓建设、业务交付等过程中遇到的效率、质量、成本、研发等相关问题的系统性评估和治理,着重于设计思路和实践成果的展示,不涉及太多的技术细节。读者朋友可以根据自身业务场景和实际面临的问题,选择性参考并应用到实际工作中。</p> <h2 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;"><span style="display: none;"></span><span style="font-size: 22px;line-height: 1.5em;letter-spacing: 0em;font-weight: bold;display: block;">2 背景介绍</span><span style="display: none;"></span></h2> <h3 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;"><span style="display: none;"></span><span style="font-size: 20px;line-height: 1.5em;letter-spacing: 0em;font-weight: bold;display: block;">2.1 为什么搭建数仓评估体系</span><span style="display: none;"></span></h3> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"> <code style="color: rgb(255, 124, 5);line-height: 1.8em;letter-spacing: 0em;background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(240, 170, 12, 0.02);width: auto;height: auto;margin-left: 2px;margin-right: 2px;padding: 2px 4px;border-style: none;border-width: 3px;border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4);border-radius: 4px;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;">数仓评估体系起源于23年底,作为转转数据治理的评价层,是非常重要的一环。</code>过去很长一段时间里,转转数仓团队服务于快速发展和变化的业务,为了能够高效响应业务的数据需求,一方面存在烟囱式建设的情况,指标管理也较为粗放;另一方面对于线上的表和任务往往是只做加法不做减法,带来额外的计算和存储成本。<br> 基于上述现状,衍生出如下问题:</p> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><strong style="background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">管理者视角:</strong></p> <ul data-tool="mdnice编辑器" style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);line-height: 1.8em;letter-spacing: 0em;"> 看不清数仓整体建设情况 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);line-height: 1.8em;letter-spacing: 0em;"> 看不清成本增长和分布 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);line-height: 1.8em;letter-spacing: 0em;"> 内外部用数效率和数据质量提升难 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);line-height: 1.8em;letter-spacing: 0em;"> 看不清研发规范落地效果 </section></li> </ul> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><strong style="background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">数仓RD视角:</strong></p> <ul data-tool="mdnice编辑器" style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);line-height: 1.8em;letter-spacing: 0em;"> 名下哪些资产有问题,有什么问题 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);line-height: 1.8em;letter-spacing: 0em;"> 模型完备度如何,哪些业务过程建设较薄弱 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);line-height: 1.8em;letter-spacing: 0em;"> 模型复用率如何,哪些模型没人用 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);line-height: 1.8em;letter-spacing: 0em;"> 哪些规范没有执行好 </section></li> </ul> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><strong style="background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">外部用户视角:</strong></p> <ul data-tool="mdnice编辑器" style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);line-height: 1.8em;letter-spacing: 0em;"> 找数、用数难,用户效率低 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);line-height: 1.8em;letter-spacing: 0em;"> 准确性、及时性、一致性等问题频出 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);line-height: 1.8em;letter-spacing: 0em;"> 报表、邮件、播报权限难管控 </section></li> </ul> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"> 为了能够系统性解决上述问题,我们在24年将数据治理规划成年度重点项目。我们通过制定标准、夯实基建、搭建指标库和数仓地图等手段来进行事前预防和事中监控以及辅助提效,<code style="color: rgb(255, 124, 5);line-height: 1.8em;letter-spacing: 0em;background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(240, 170, 12, 0.02);width: auto;height: auto;margin-left: 2px;margin-right: 2px;padding: 2px 4px;border-style: none;border-width: 3px;border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4);border-radius: 4px;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;">数仓评估体系作为事后的评价和复盘工具,则是贯穿整体治理过程。</code></p> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100018122" data-ratio="0.5361111111111111" src="/upload/3f271de32d463f3ce7c26d7021c1c022.png" data-type="png" data-w="1080" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"> 以上是数据治理的整体规划及数仓评估体系所处的位置,我们对数仓评估体系的定位是:<code style="color: rgb(255, 124, 5);line-height: 1.8em;letter-spacing: 0em;background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(240, 170, 12, 0.02);width: auto;height: auto;margin-left: 2px;margin-right: 2px;padding: 2px 4px;border-style: none;border-width: 3px;border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4);border-radius: 4px;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;">基于客观事实进行数仓现状及问题的量化分析及横纵向对比,实现基于结果指标和治理项驱动的数据治理及效果回收。</code></p> <h3 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;"><span style="display: none;"></span><span style="font-size: 20px;line-height: 1.5em;letter-spacing: 0em;font-weight: bold;display: block;">2.2 需要解决的技术问题</span><span style="display: none;"></span></h3> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">✓数仓评估指标的设计与落地<br>✓“客观事实”数据的获取与处理<br>✓存量的问题怎么治理<br>✓增量的问题怎么管控<br>✓如何不断完善和健壮评估体系</p> <h2 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;"><span style="display: none;"></span><span style="font-size: 22px;line-height: 1.5em;letter-spacing: 0em;font-weight: bold;display: block;">3 设计思路</span><span style="display: none;"></span></h2> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"> 整个评估体系分为结果评估和过程评估两大模块。我们通过结果评估中关于效率、质量、成本、模型相关的结果指标,观测数仓治理目标达成情况;通过过程评估的治理项驱动数仓RD进行具体问题的治理。</p> <h3 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;"><span style="display: none;"></span><span style="font-size: 20px;line-height: 1.5em;letter-spacing: 0em;font-weight: bold;display: block;">3.1 整体架构设计</span><span style="display: none;"></span></h3> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"> 整个数仓评估体系大致上可以分为三层:</p> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100018121" data-ratio="0.643661971830986" src="/upload/d7126d8717102513eeb8900703cc3d52.png" data-type="png" data-w="710" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <ul data-tool="mdnice编辑器" style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);line-height: 1.8em;letter-spacing: 0em;"> <strong style="color: rgb(0, 0, 0);background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">指标层:</strong> 以数据处理层产出的数据模型为基础、结果指标和过程指标体系为目标进行指标加工,产出相应的指标结果表,支持趋势分析和横向的对比分析 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);line-height: 1.8em;letter-spacing: 0em;"> <strong style="color: rgb(0, 0, 0);background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">数据处理层:</strong> 对数据源层获取到的数据为基础,进行数据清洗和建模 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);line-height: 1.8em;letter-spacing: 0em;"> <strong style="color: rgb(0, 0, 0);background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">数据源层:</strong> 整合数据源,包括Hive元数据、平台查询日志、告警日志、账单数据、治理项规则、组织架构等 </section></li> </ul> <h3 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;"><span style="display: none;"></span><span style="font-size: 20px;line-height: 1.5em;letter-spacing: 0em;font-weight: bold;display: block;">3.2 产品形态设计</span><span style="display: none;"></span></h3> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"> 整个评估体系规划为结果评估、过程评估两大模块,分别对应结果指标和治理项两套指标体系。结果评估用于观测当前现状及趋势,看的是整体表现;过程评估驱动日常的数据治理,直击各RD的问题资产及具体的问题明细。</p> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img data-imgfileid="100018124" data-ratio="0.14489311163895488" src="/upload/fd732f6c615f6864968368d62a06d55a.jpg" data-type="jpeg" data-w="842" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <h4 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;"><span style="display: none;"></span><span style="font-size: 18px;line-height: 1.5em;letter-spacing: 0em;font-weight: bold;display: block;">结果评估</span><span style="display: none;"></span></h4> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"> 用于呈现当前在效率、质量、成本、模型相关的指标现状,并进行横纵向的量化分析,支持组织、组件、人等粒度的下钻分析。数据主要来自于分析师和产品运营等数据使用方的数据查询日志进行统计分析、对数据质量监控服务日志的统计分析、以及人工打标线上问题或事故的统计分析。</p> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100018125" data-ratio="0.32963374028856823" src="/upload/358a97b0eed95982a5b5f1df6c5b611f.jpg" data-type="jpeg" data-w="901" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <h4 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;"><span style="display: none;"></span><span style="font-size: 18px;line-height: 1.5em;letter-spacing: 0em;font-weight: bold;display: block;">过程评估</span><span style="display: none;"></span></h4> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"> 通过对日常问题、规范的抽象总结,形成各类治理项。目前包含效率、质量、研发、成本四大类治理项,汇集成治理工作台。通过治理项驱动数仓RD进行数据治理。</p> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img data-imgfileid="100018123" data-ratio="0.48956158663883087" src="/upload/8f3e76dfb9730bbad48430bc63e6f104.jpg" data-type="jpeg" data-w="958" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <h3 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;"><span style="display: none;"></span><span style="font-size: 20px;line-height: 1.5em;letter-spacing: 0em;font-weight: bold;display: block;">3.2 指标体系搭建</span><span style="display: none;"></span></h3> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"> 数仓评估体系的指标体系大致上可以两层。第一层是过程评估关注的每个具体问题对应的治理项;第二层是结果评估关注的结果指标。<br> <code style="color: rgb(255, 124, 5);line-height: 1.8em;letter-spacing: 0em;background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(240, 170, 12, 0.02);width: auto;height: auto;margin-left: 2px;margin-right: 2px;padding: 2px 4px;border-style: none;border-width: 3px;border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4);border-radius: 4px;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;">治理项</code>,来自于对日常规范的抽象,是每一个具体的问题的检查项,是数据治理的最细粒度。我们一期围绕效率、质量、研发、成本四方面一共设置了24个治理项。</p> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img data-imgfileid="100018130" data-ratio="0.7657407407407407" src="/upload/f79404061f34efe6cce7eb342a2bb38c.png" data-type="png" data-w="1080" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"> <code style="color: rgb(255, 124, 5);line-height: 1.8em;letter-spacing: 0em;background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(240, 170, 12, 0.02);width: auto;height: auto;margin-left: 2px;margin-right: 2px;padding: 2px 4px;border-style: none;border-width: 3px;border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4);border-radius: 4px;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;">结果指标</code>,是各类问题的聚合结果,是某一类问题或者单个核心问题的当前现状表现。我们对管理者视角、RD视角、用户视角所存在的问题进行了抽象和归类成具体的治理项,设置如下指标体系:</p> <ul data-tool="mdnice编辑器" style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);line-height: 1.8em;letter-spacing: 0em;"> <strong style="color: rgb(0, 0, 0);background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">效率上:</strong> 我们会关注效率分,这是一个基于平均运行时长、ODS穿透率、复杂SQL占比加权统计出来的复合指标,用来观测评估业务侧通过即席查询使用数据时的效率情况。 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);line-height: 1.8em;letter-spacing: 0em;"> <strong style="color: rgb(0, 0, 0);background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">质量上:</strong> 我们关注线上问题次数 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);line-height: 1.8em;letter-spacing: 0em;"> <strong style="color: rgb(0, 0, 0);background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">成本上:</strong> 我们关注成本整体的增长率、分组件的成本分布和增长情况,并且关注具体到业务和个人的成本分布。 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);line-height: 1.8em;letter-spacing: 0em;"> <strong style="color: rgb(0, 0, 0);background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">模型上:</strong> 我们关注整体的完备度、复用率、稳定性、规范性等。 </section></li> </ul> <h2 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;"><span style="display: none;"></span><span style="font-size: 22px;line-height: 1.5em;letter-spacing: 0em;font-weight: bold;display: block;">4 结果呈现</span><span style="display: none;"></span></h2> <h3 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;"><span style="display: none;"></span><span style="font-size: 20px;line-height: 1.5em;letter-spacing: 0em;font-weight: bold;display: block;">4.1 结果评估模块展示</span><span style="display: none;"></span></h3> <h4 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;"><span style="display: none;"></span><span style="font-size: 18px;line-height: 1.5em;letter-spacing: 0em;font-weight: bold;display: block;">效率评估</span><span style="display: none;"></span></h4> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"> 实现效率分的横向和纵向对比,支持分业务下钻至具体的个人以及具体的某次查询。通过内部模型完备、宣导加提效工具的赋能,辅助业务侧的运营、产品、分析师等同事,提升日常查询数据的效率。</p> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img data-imgfileid="100018128" data-ratio="0.42685185185185187" src="/upload/69076903932054de5d9e56fcac75004d.png" data-type="png" data-w="1080" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <h4 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;"><span style="display: none;"></span><span style="font-size: 18px;line-height: 1.5em;letter-spacing: 0em;font-weight: bold;display: block;">质量评估</span><span style="display: none;"></span></h4> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"> 实现线上质量问题的趋势分析。这块目前以手动填报为主,后续会引入质量监控、任务告警等数据,作为质量问题的评估依据。当前还是侧重于业务感知问题记录和复盘。</p> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img data-imgfileid="100018126" data-ratio="0.42314814814814816" src="/upload/adcc5c9632657f3036778d1037bb1679.png" data-type="png" data-w="1080" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <h4 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;"><span style="display: none;"></span><span style="font-size: 18px;line-height: 1.5em;letter-spacing: 0em;font-weight: bold;display: block;">成本评估</span><span style="display: none;"></span></h4> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"> 成本这块,我们重点关注月度增长趋势是否在可控的范围内,后续会通过任务及存储的系统性治理,驱动成本的下降,今年的重心还是在内部模型相关治理上。</p> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100018127" data-ratio="0.22314814814814815" src="/upload/ee2689bc1660959c217f2fdf29ef426b.png" data-type="png" data-w="1080" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"> 成本拆解至组件、组织和个人:</p> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100018129" data-ratio="0.5064814814814815" src="/upload/74756394ccdbdbff7e4d748d07a1b742.png" data-type="png" data-w="1080" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <h4 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;"><span style="display: none;"></span><span style="font-size: 18px;line-height: 1.5em;letter-spacing: 0em;font-weight: bold;display: block;">模型评估</span><span style="display: none;"></span></h4> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"> 这块是今年投入时间最多的部分。我们通过完备度、复用率、稳定性、规范性指标,观测治理的成果。通过目标驱动RD使用治理工作台进行各类问题下具体治理项的治理。</p> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100018134" data-ratio="0.5064814814814815" src="/upload/4c9d4d07993f413cd637e074583c75ff.png" data-type="png" data-w="1080" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <h3 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;"><span style="display: none;"></span><span style="font-size: 20px;line-height: 1.5em;letter-spacing: 0em;font-weight: bold;display: block;">4.2 过程评估模块展示</span><span style="display: none;"></span></h3> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"> 本模块呈现各RD当前存在问题的资产明细,通过点击资产名称,可跳转查看具体问题项。也可通过控件筛选查询当前关注的治理项。</p> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100018135" data-ratio="0.4787037037037037" src="/upload/78152ff4dec47f7e02363ae533d1a431.png" data-type="png" data-w="1080" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"> 资产问题治理项明细:</p> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100018131" data-ratio="0.17222222222222222" src="/upload/01264bf4593d4acf563efdc6aba0e6e3.png" data-type="png" data-w="1080" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"> 通过治理报告可观测当前目标的达成情况,及本周或本月的治理进展。并且通过新增资产监控实现增量问题的管控。</p> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100018133" data-ratio="0.5287037037037037" src="/upload/46e117e321ce9e26765e417b60c1caf6.png" data-type="png" data-w="1080" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <h3 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;"><span style="display: none;"></span><span style="font-size: 20px;line-height: 1.5em;letter-spacing: 0em;font-weight: bold;display: block;">4.3 阶段性治理收益</span><span style="display: none;"></span></h3> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"> 过去一年,我们通过数仓评估体系驱动的数据治理,重点还是在于数仓内部的治理。偏向于完备度、复用率、稳定性和规范性。<code style="color: rgb(255, 124, 5);line-height: 1.8em;letter-spacing: 0em;background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(240, 170, 12, 0.02);width: auto;height: auto;margin-left: 2px;margin-right: 2px;padding: 2px 4px;border-style: none;border-width: 3px;border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4);border-radius: 4px;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;">磨刀不误砍柴工,勤修炼内功,为后续的效率和质量治理奠定基础。</code></p> <h4 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;"><span style="display: none;"></span><span style="font-size: 18px;line-height: 1.5em;letter-spacing: 0em;font-weight: bold;display: block;">治理收益如下:</span><span style="display: none;"></span></h4> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-imgfileid="100018132" data-ratio="0.2462962962962963" src="/upload/49021acaad1f33ba5bce81d63d9ecd69.png" data-type="png" data-w="1080" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;"> </figure> <ul data-tool="mdnice编辑器" style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);line-height: 1.8em;letter-spacing: 0em;"> 驱动完备度从年初的50.2%<code style="color: rgb(255, 124, 5);line-height: 1.8em;letter-spacing: 0em;background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(240, 170, 12, 0.02);width: auto;margin-left: 2px;margin-right: 2px;padding: 2px 4px;border-style: none;border-width: 3px;border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4);border-radius: 4px;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;">提升至93.97%,净提升43.77%</code> </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);line-height: 1.8em;letter-spacing: 0em;"> 驱动复用率从年初的51.65%<code style="color: rgb(255, 124, 5);line-height: 1.8em;letter-spacing: 0em;background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(240, 170, 12, 0.02);width: auto;margin-left: 2px;margin-right: 2px;padding: 2px 4px;border-style: none;border-width: 3px;border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4);border-radius: 4px;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;">提升至88.61%,净提升36.96%</code> </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);line-height: 1.8em;letter-spacing: 0em;"> 驱动稳定性从年初的76.27%<code style="color: rgb(255, 124, 5);line-height: 1.8em;letter-spacing: 0em;background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(240, 170, 12, 0.02);width: auto;margin-left: 2px;margin-right: 2px;padding: 2px 4px;border-style: none;border-width: 3px;border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4);border-radius: 4px;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;">提升至94.45%,净提升18.18%</code> </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);line-height: 1.8em;letter-spacing: 0em;"> 驱动规范性从年初的76.56%<code style="color: rgb(255, 124, 5);line-height: 1.8em;letter-spacing: 0em;background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(240, 170, 12, 0.02);width: auto;margin-left: 2px;margin-right: 2px;padding: 2px 4px;border-style: none;border-width: 3px;border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4);border-radius: 4px;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;">提升至94.61%,净提升18.05%</code> </section></li> </ul> <h4 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;"><span style="display: none;"></span><span style="font-size: 18px;line-height: 1.5em;letter-spacing: 0em;font-weight: bold;display: block;">给数仓带来的核心变化是:</span><span style="display: none;"></span></h4> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"> 完备度治理驱动24年新上线模型达到上一年<code style="color: rgb(255, 124, 5);line-height: 1.8em;letter-spacing: 0em;background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(240, 170, 12, 0.02);width: auto;height: auto;margin-left: 2px;margin-right: 2px;padding: 2px 4px;border-style: none;border-width: 3px;border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4);border-radius: 4px;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;">2.6倍,增长161%</code>,对应的符合复用标准的模型数不降反升,<code style="color: rgb(255, 124, 5);line-height: 1.8em;letter-spacing: 0em;background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(240, 170, 12, 0.02);width: auto;height: auto;margin-left: 2px;margin-right: 2px;padding: 2px 4px;border-style: none;border-width: 3px;border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4);border-radius: 4px;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;">说明模型更贴合当前的业务场景及业务过程且复用程度更高</code>,另外治理过程整合下线无用模型,一定程度上减少了存储空间占用。<br> 最终完备度达到95%,则说明内部承接的需求,95%都可以通过模型层满足,过往只能满足50%左右。<br> 在规范性上,之前一直存在的<code style="color: rgb(255, 124, 5);line-height: 1.8em;letter-spacing: 0em;background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(240, 170, 12, 0.02);width: auto;height: auto;margin-left: 2px;margin-right: 2px;padding: 2px 4px;border-style: none;border-width: 3px;border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4);border-radius: 4px;font-family: Consolas, Monaco, Menlo, monospace;word-break: break-all;">跨层穿透问题、回流引用问题、引用外部门表问题、注释缺失问题、缺依赖问题等存量问题基本治理完毕并得到了控制</code>,后续持续观测即可。</p> <h2 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;"><span style="display: none;"></span><span style="font-size: 22px;line-height: 1.5em;letter-spacing: 0em;font-weight: bold;display: block;">5 未来规划</span><span style="display: none;"></span></h2> <ul data-tool="mdnice编辑器" style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);line-height: 1.8em;letter-spacing: 0em;"> 通过定期复盘,持续迭代和完善治理项,使评估更准确、更全面 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);line-height: 1.8em;letter-spacing: 0em;"> 慢慢由内部的治理,转向外部效率&质量治理提升 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);line-height: 1.8em;letter-spacing: 0em;"> 挖掘成本存在浪费的业务或个人,通过治理驱动降本增效 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;color: rgb(1, 1, 1);line-height: 1.8em;letter-spacing: 0em;"> 逐步推广至仓外评估和治理 </section></li> </ul> <hr data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;border-style: solid none none;border-bottom-width: 3px;border-left-width: 3px;border-right-width: 3px;border-color: rgb(0, 0, 0) rgba(0, 0, 0, 0.4) rgba(0, 0, 0, 0.4);border-radius: 0px;background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: 1px;"> <blockquote data-tool="mdnice编辑器" style="margin-top: 20px;margin-bottom: 20px;padding: 10px 10px 10px 20px;border-top: 3px none rgba(0, 0, 0, 0.4);border-bottom: 3px none rgba(0, 0, 0, 0.4);border-right: 3px none rgba(0, 0, 0, 0.4);border-left-color: rgba(0, 0, 0, 0.4);border-radius: 0px;background: none 0% 0% / auto no-repeat scroll padding-box border-box rgba(0, 0, 0, 0.05);width: auto;height: auto;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;overflow: auto;"> <span style="display: none;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.5em;letter-spacing: 0em;"></span> <p style="text-indent: 0em;padding-top: 8px;padding-bottom: 8px;color: rgb(0, 0, 0);font-size: 16px;line-height: 1.8em;letter-spacing: 0em;">关于作者</p> </blockquote> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;">邱狄凡,转转大数据开发工程师,C2&新媒体数仓负责人,数据治理数仓主R。</p> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="letter-spacing: 0em;text-indent: 0em;background-color: rgba(0, 0, 0, 0.05);word-spacing: 0em;"><br></span></p> <p style="text-align: left;margin-bottom: 0px;"><span style="text-align: left;">想了解更多转转公司的业务实践,欢迎点击关注下方公众号:</span></p> <section class="mp_profile_iframe_wrp"> <mp-common-profile class="js_uneditable custom_select_card mp_profile_iframe" data-id="MzU0OTExNzYwNg==" data-pluginname="mpprofile" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/T81bAV0NNNic0ML4zU2J1rQjcSGup0pfw0feOGibOibN90LoE5BEauYhW8jzaz3RdP9icWED8JwI6jsU6nTPhaNibnw/0?wx_fmt=png" data-nickname="大转转FE" data-alias="zhuanzhuanfe" data-signature="定期分享一些团队对前端的想法与沉淀" data-from="0" data-is_biz_ban="0"></mp-common-profile> </section> <section class="mp_profile_iframe_wrp"> <mp-common-profile class="js_uneditable custom_select_card mp_profile_iframe" data-id="MzI1OTQ1NjA1OA==" data-pluginname="mpprofile" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/DicJKAuVt0L6kxKJp3xVon3ic7GCs3M62nmZiaFegJ4KXnGDncRZrsMxKuoxNpaAzwDCZyYiaTxzVjJA0Jxu2xl9MA/0?wx_fmt=png" data-nickname="转转QA" data-alias="" data-signature="转转QA伐木累" data-from="0" data-is_biz_ban="0"></mp-common-profile> </section> <p style="margin-bottom: 0px;"><br></p> </section> <p style="display: none;"> <mp-style-type data-value="3"></mp-style-type></p>
作者:微信小助手
<section style="margin-bottom: 0px;letter-spacing: 0.578px;text-wrap: wrap;font-size: 16px;" data-mpa-powered-by="yiban.io"> <section style="text-align: unset;"> <section style="margin-right: 8px;margin-left: 8px;line-height: 2em;"> <img class="rich_pages wxw-img" data-backh="181" data-backw="562" data-imgfileid="100023288" data-ratio="0.3220338983050847" data-w="708" style="width: 100%;height: auto !important;" src="/upload/dbfa5b2bde05964abe135c00d33dee88.png"><span style="text-align: center;letter-spacing: 0.578px;"></span> </section> <section data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="margin-bottom: 0px;padding-left: 10px;padding-right: 10px;background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;font-family: Optima, " microsoft yahei, pingfangsc-regular, serif;font-size: 16px;color: rgb(0, 0, 0);line-height: 1.5em;word-spacing: 0em;letter-spacing: 0em;word-break: break-word;text-align: left;> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-backh="313" data-backw="558" data-imgfileid="100023282" data-ratio="0.560546875" data-type="png" data-w="1024" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;width: 100%;height: auto !important;" src="/upload/ff5db6bfff7d976e79711a6bef456873.png"> </figure> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;color: rgb(136, 136, 136);font-size: 14px;><em style="background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">图片来自Shutterstock上的Bakhtiar Zein</em></span></p> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>多年来,以Elasticsearch为代表的基于全文检索的搜索方案,一直是搜索和推荐引擎等信息检索系统的默认选择。但</span><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>传统的全文搜索</span><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>只能提供基于关键字匹配的精确结果,例如找到包含特殊名词“Python3.9”的文档,或是找到带“花”字,“雨”字,“雪”字的古诗词。</span></p> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>但在实际需求中,我们有时候需要的,不只是古诗词中带“雪”字,还要找到表示雪很大这样意向的古诗词。比如,初高中语文课里学到的“忽如一夜春风来,千树万树梨花开”这句诗,虽然没有雪字,却精准表达了雪很大这样的意向。</span></p> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>再以照片检索为例,我们不仅需要1:1精准搜索出图像对应的原图,往往也需要对图像的特征、关键信息提取后,去检索具备类似特征的图像,完成以图搜图或者内容推荐等任务。</span></p> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>如何通过检索得到以上结果?</span></p> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>基于稠密向量打造的</span><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>语义搜索</span><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>就发挥了作用。通常来说,语义检索,通过将我们输入的词汇、图片、语音等原始数据转化为向量,进而捕捉不同数据之间的语义关系(例如知道“老师”和“教师”其实是一个意思),可以更精准的理解用户的搜索意图,从而提供更准确、更相关的搜索结果。</span></p> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>但如何实现语义检索?Embedding模型和</span><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>向量数据库</span><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>在其中的作用至关重要。前者主要完成原始信息的向量化,后者则提供对向量化信息的存储、检索等服务。目前,</span><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>检索增强生成</span><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>(RAG)与</span><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>多模态搜索</span><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>,是语义检索的核心应用场景之一。</span></p> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>但通常来说,在实践中,全文检索与语义检索不是非此即彼的关系。我们需要同时兼顾语义理解和精确的关键字匹配。比如学术论文的写作中,用户不仅希望在搜索结果看到与搜索查询相关的概念,同时也希望保留查询中使用的原始信息返回搜索结果,比如基于一些特殊术语和名称。</span></p> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;><strong style="background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">因此,许多搜索应用正在采用混合搜索方法,结合两种方法的优势,以平衡灵活的语义相关性和可预测的精确关键字匹配。</strong></span></p> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;font-size: 24px;color: rgb(2, 30, 170);><strong style="background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">01.</strong></span></p> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;font-size: 18px;color: rgb(2, 30, 170);><strong style="background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">混合搜索挑战</strong></span></p> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>实现混合搜索的常见方法如下:</span></p> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>先使用像开源</span><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>Milvus</span><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>这样的专用向量数据库,进行高效和可扩展的语义搜索;</span></p> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>然后使用像Elasticsearch或OpenSearch这样的传统搜索引擎进行全文搜索。</span></p> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>两两搭配虽然效果不错,但也引入了新的复杂性:首先,搭配两套不同的搜索系统,也就意味着我们要同时管理不同的基础设施、配置和维护任务。这会造成更重的运营负担并增加潜在的集成问题。</span></p> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-backh="403" data-backw="558" data-imgfileid="100023283" data-ratio="0.7216796875" data-type="png" data-w="1024" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;width: 100%;height: auto !important;" src="/upload/861d64133d509aa5bfcdb7f3dd36a240.png"> </figure> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;><strong style="background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">在此基础上,混合检索统一解决方案横空出世。</strong></span></p> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>混合搜索的统一解决方案将提供许多好处:</span></p> <ul class="list-paddingleft-1" style="list-style-type: disc;"> <li><p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;><strong style="background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">减少基础设施维护:</strong>管理一个系统而不是两个系统大大降低了操作复杂性,节省了时间和资源。这也意味着更少的上下文切换和掌握两组不同API的算力开销。</span></p></li> <li><p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;><strong style="background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">合并数据管理:</strong>统一的表结构允许用户将</span><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>密集</span><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>(基于向量)和</span><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>稀疏</span><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>(基于关键字)数据与共享元数据标签一起存储。使用两个单独的系统,则需要将元数据标签存储两次,以便双方能够进行元数据过滤。</span></p></li> <li><p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;><strong style="background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">简化查询</strong>:单个请求可以执行语义和全文搜索任务,无需对单独的系统进行两次API调用。</span></p></li> <li><p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;><strong style="background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">增强的安全性和权限改造</strong>:统一的方法可以实现</span><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>更直接和更强大的安全管理</span><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>,因为所有访问控制都可以在向量数据库中集中管理,从而提高安全性合规性和一致性。</span></p></li> </ul> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;font-size: 24px;color: rgb(2, 30, 170);><strong style="background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">02.</strong></span></p> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;font-size: 18px;color: rgb(2, 30, 170);><strong style="background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">如何使用统一的向量方法简化混合搜索</strong></span></p> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>在语义搜索中,</span><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>机器学习模型</span><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>会根据文本的含义将文本“嵌入”为高维空间中的点(称为密集向量) 。具有相似语义的文本在此空间中,彼此的距离会更接近。例如,“苹果”和“水果”就比“苹果”和“汽车”更接近。这使得我们能够通过使用</span><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>近似最近邻 (ANN)</span><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>算法计算每个点之间的距离来快速找到语义相关的文本。</span></p> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>这种方法也可以通过将文档和查询编码为稀疏向量,进而应用于全文搜索。</span></p> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>在稀疏向量中,每个维度代表一个术语,值表示每个术语在文档中的重要性。</span></p> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>文档中不存在的术语的值为零。由于任何给定的文档通常只使用词汇表中所有可能术语的一小部分,因此,大多数术语不会出现在文档中。这也就意味着生成的向量是稀疏的——因为它们的大多数值为零。例如,在通常用于</span><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>评估信息检索</span><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>任务的MS-MARCO数据集中,虽然大约有 900 万个文档,100 万个词,但大多数文档只覆盖不足几百个词,生成的向量中绝大多数维度值为零。</span></p> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;><strong style="background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">这种极端稀疏性对于我们高效存储和处理这些向量具有重要意义。比如,我们可以将其用于优化搜索性能,同时保持准确性</strong>。</span></p> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>最初为密集向量设计的向量数据库,其实也可以高效处理这些稀疏向量。例如,开源向量数据库Milvus刚刚发布了使用Sparse-BM25的原生全文搜索功能。</span></p> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>Sparse-BM25 由 Milvus提出,其原理类似 Elasticsearch 和其他全文搜索系统中常用的BM25算法,但针对稀疏向量设计,可以实现相同效果的全文搜索功能:</span></p> <ul class="list-paddingleft-1" style="list-style-type: disc;"> <li><p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;><strong style="background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">具有数据剪枝功能的高效检索算法:</strong>通过剪枝来丢弃搜索查询中的低值稀疏向量,向量数据库可以显著减小索引大小并以最小的质量损失达成最优的性能。</span></p></li> <li><p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;><strong style="background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">带来进一步的性能优化:</strong>将词频表示为稀疏向量而不是倒排索引,可以实现其他基于向量的优化。比如:用图索引替代暴力扫描,实现更有效的搜索;</span><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>乘积量化(PQ)/标量量化(SQ)</span><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>,进一步减少内存占用。</span></p></li> </ul> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>除了这些优化之外,Sparse-BM25还继承了高性能向量数据库Milvus的几个系统级优势:</span></p> <ul class="list-paddingleft-1" style="list-style-type: disc;"> <li><p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;><strong style="background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">高效的底层实现和内存管理:</strong></span><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>Milvus 的</span><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>核心向量索引引擎采用 C++ 实现,可以提供比基于Java的系统(如Elasticsearch)更高效的内存管理。与基于JVM的方法相比,仅此一项就节省了数 GB 的内存占用。</span></p></li> <li><p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;><strong style="background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">对MMap的支持:</strong>与Elasticsearch在内存和磁盘中使用page-cache进行索引存储类似,Milvus支持</span><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>内存映射(MMap)</span><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>以在索引超过可用内存时扩展内存容量。</span></p></li> </ul> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;font-size: 24px;color: rgb(2, 30, 170);><strong style="background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">03.</strong></span></p> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;font-size: 18px;color: rgb(2, 30, 170);><strong style="background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">为什么传统搜索引擎在向量搜索方面有先天不足</strong></span></p> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>Elasticsearch是为传统的倒排索引构建的,在不根本改变架构的情况下,支持向量索引具有非常大的挑战。这导致其相比于专用向量数据库有非常大的性能差异:即使只有100万个向量,Elasticsearch也需要200毫秒(在全托管的 Elastic Cloud 上测试)才能返回搜索结果,而在Milvus上(在全托管的Zilliz Cloud上测试)需要6毫秒——性能差异超过30倍。</span></p> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>每秒查询率(QPS)测量的吞吐量也有3倍的差异,Zilliz Cloud上性能最高的实例运行在6,000QPS,而Elastic Cloud最多为1,900QPS。此外,Zilliz Cloud在加载向量数据和构建索引方面比Elastic Cloud快15倍。</span></p> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>此外,Elasticsearch的Java/JVM实现导致其性能的可扩展性也弱于基于 C++/Go 实现的向量数据库。而且,Elasticsearch缺乏高级的向量搜索功能,如基于磁盘的索引(DiskANN、MMap)、优化的元数据过滤和range search。</span></p> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-backh="690" data-backw="558" data-imgfileid="100023284" data-ratio="1.2361111111111112" data-type="png" data-w="1080" style="display: block;margin-right: auto;margin-left: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;object-fit: fill;box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px;width: 100%;height: auto !important;" src="/upload/29692218fa084a8c0c5064ae91a111e4.png"> </figure> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;font-size: 24px;color: rgb(2, 30, 170);><strong style="background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">04.</strong></span></p> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;font-size: 18px;color: rgb(2, 30, 170);><strong style="background-attachment: scroll;background-clip: border-box;background-image: none;background-origin: padding-box;background-position: 0% 0%;background-repeat: no-repeat;background-size: auto;width: auto;height: auto;border-style: none;border-width: 3px;border-color: rgba(0, 0, 0, 0.4);border-radius: 0px;">结论</strong></span></p> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>Milvus 作为性能领先的向量数据库,通过无缝结合语义搜索和全文搜索,将稠密向量搜索与优化的稀疏向量技术相结合,提供了卓越的性能、可扩展性和效率,并简化了基础设施的部署难度,降低成本的同时还增强了搜索能力。</span></p> <p data-tool="mdnice编辑器" style="line-height: 1.8em;letter-spacing: 0em;text-indent: 0em;padding-top: 8px;padding-bottom: 8px;"><span style="font-family: mp-quote, -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;letter-spacing: 1px;>展望未来,我们相信基于向量数据库的新型基础设施,将有望超越Elasticsearch成为混合搜索的标准解决方案。</span></p> </section> </section> </section>
作者:微信小助手
<section data-tool="markdown编辑器" data-website="https://markdown.com.cn/editor" style="padding: 25px 30px;line-height: 1.6;word-spacing: 0px;word-break: break-word;word-wrap: break-word;text-align: justify;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, 'PingFang SC', Cambria, Cochin, Georgia, Times, 'Times New Roman', serif;margin-top: -10px;font-size: 15px;letter-spacing: 0.05em;color: #595959;"> <h1 data-tool="markdown.com.cn编辑器" style="padding: 25px 30px;line-height: 1.6;word-spacing: 0px;word-break: break-word;word-wrap: break-word;text-align: justify;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, 'PingFang SC', Cambria, Cochin, Georgia, Times, 'Times New Roman', serif;margin-top: -10px;font-size: 15px;letter-spacing: 0.05em;color: #595959;"><span leaf="">在 B 端管理类系统中,企业经常面临大量文档附件的预览需求,例如合同、方案、报告等。一个好用的在线文档预览解决方案,能够大幅提升系统的用户体验和文档管理效率。这篇文章将为大家介绍一款基于 Vue 的文档预览工具——</span><code style="font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: #35b378;"><span leaf="">vue-office</span></code><span leaf="">。vue-office</span><span leaf=""> 专注于文档预览功能,支持多种常见格式,如 PDF 和 Word,基于成熟的底层库构建,提供稳定可靠的预览体验。</span></h1> <hr style="height: 1px;margin-top: 10px;margin-bottom: 10px;border-top: 1px solid black;border: 1px solid #35b378;margin: 1.5em auto;"> <h2 data-tool="markdown.com.cn编辑器" style="margin-top: 30px;margin-bottom: 15px;bmin-height: 32px;line-height: 32px;border-bottom: solid 1px #000000;color: #35b378;display: inline-block;border-bottom-width: 0px;border-bottom-style: solid;border-color: #35b378;padding-top: 5px;padding-right: 0.5em;padding-left: 0.5em;font-size: 23px;margin: 1em 0 0rem 0;padding: 0.5em 0;text-align: leftt;font-weight: bold;"><span style="display: none;"></span><span><strong style="font-weight: bold;color: #35b378;"><span leaf="">1. 什么是</span><code><span leaf="">vue-office</span></code><span leaf="">?</span></strong></span><span></span></h2> <p data-tool="markdown.com.cn编辑器" style="font-size: 16px;padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: black;margin: 1em 4px;"><code style="font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: #35b378;"><span leaf="">vue-office</span></code><span leaf=""> 是一个 Vue 组件库,旨在解决文档预览在 Web 应用中的集成难题。通过它,开发者可以轻松在管理系统中添加文档在线预览功能,避免用户频繁下载文件,提高工作效率。</span></p> <h3 data-tool="markdown.com.cn编辑器" style="margin-top: 30px;margin-bottom: 15px;font-size: 20px;margin: 1.2em 0 1em;padding: 0;font-weight: bold;color: #35b378;"><span style="display: none;"></span><span><strong style="font-weight: bold;color: #35b378;"><span leaf="">核心功能特点</span></strong></span><span style="display: none;"></span></h3> <ul style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;color: black;list-style-type: disc;" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;margin: 10px 0;"> <strong style="font-weight: bold;color: #35b378;"><span leaf="">多格式支持:</span></strong><span leaf=""> 支持</span><code style="font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: #35b378;"><span leaf="">.pdf</span></code><span leaf="">、</span><code style="font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: #35b378;"><span leaf="">.docx</span></code><span leaf=""> 等主流办公文档格式的预览。</span> </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;margin: 10px 0;"> <strong style="font-weight: bold;color: #35b378;"><span leaf="">基于成熟库:</span></strong><span leaf=""> PDF 预览基于</span><code style="font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: #35b378;"><span leaf="">pdf.js</span></code><span leaf="">,Word 预览基于</span><code style="font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: #35b378;"><span leaf="">docx-preview</span></code><span leaf="">,提供稳定和高质量的渲染效果。</span> </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;margin: 10px 0;"> <strong style="font-weight: bold;color: #35b378;"><span leaf="">轻量化集成:</span></strong><span leaf=""> 提供 Vue 组件,开箱即用,配置简单。</span> </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;margin: 10px 0;"> <strong style="font-weight: bold;color: #35b378;"><span leaf="">性能优化:</span></strong><span leaf=""> 针对大文件的加载和预览进行了性能优化,确保流畅的用户体验。</span> </section></li> </ul> <hr style="height: 1px;margin-top: 10px;margin-bottom: 10px;border-top: 1px solid black;border: 1px solid #35b378;margin: 1.5em auto;"> <h2 data-tool="markdown.com.cn编辑器" style="margin-top: 30px;margin-bottom: 15px;bmin-height: 32px;line-height: 32px;border-bottom: solid 1px #000000;color: #35b378;display: inline-block;border-bottom-width: 0px;border-bottom-style: solid;border-color: #35b378;padding-top: 5px;padding-right: 0.5em;padding-left: 0.5em;font-size: 23px;margin: 1em 0 0rem 0;padding: 0.5em 0;text-align: leftt;font-weight: bold;"><span style="display: none;"></span><span><strong style="font-weight: bold;color: #35b378;"><span leaf="">2. vue-office 的功能亮点</span></strong></span><span></span></h2> <h3 data-tool="markdown.com.cn编辑器" style="margin-top: 30px;margin-bottom: 15px;font-size: 20px;margin: 1.2em 0 1em;padding: 0;font-weight: bold;color: #35b378;"><span style="display: none;"></span><span><strong style="font-weight: bold;color: #35b378;"><span leaf="">2.1 支持多种文档格式的预览</span></strong></span><span style="display: none;"></span></h3> <ol style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;color: black;list-style-type: decimal;" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;margin: 10px 0;"> <strong style="font-weight: bold;color: #35b378;"><span leaf="">PDF 文件预览:</span></strong> </section></li> <ul style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;color: black;list-style-type: disc;" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;margin: 10px 0;"> <span leaf="">基于 Mozilla 的</span><code style="font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: #35b378;"><span leaf="">pdf.js</span></code><span leaf=""> 库,渲染效果接近原生。</span> </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;margin: 10px 0;"> <span leaf="">支持分页浏览、缩放、跳转页面等操作。</span> </section></li> </ul> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;margin: 10px 0;"> <strong style="font-weight: bold;color: #35b378;"><span leaf="">Word 文档预览:</span></strong> </section></li> <ul style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;color: black;list-style-type: disc;" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;margin: 10px 0;"> <span leaf="">使用</span><code style="font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: #35b378;"><span leaf="">docx-preview</span></code><span leaf=""> 进行渲染,支持常见的</span><code style="font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: #35b378;"><span leaf="">.docx</span></code><span leaf=""> 文件格式。</span> </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;margin: 10px 0;"> <span leaf="">渲染效果稳定,兼容性好,适合合同和报告等场景的文档预览。</span> </section></li> </ul> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;margin: 10px 0;"> <strong style="font-weight: bold;color: #35b378;"><span leaf="">其它格式扩展:</span></strong> </section></li> <ul style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;color: black;list-style-type: disc;" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;margin: 10px 0;"> <span leaf="">可以通过插件或额外配置支持 Excel、图片、文本等其它附件的预览。</span> </section></li> </ul> </ol> <h3 data-tool="markdown.com.cn编辑器" style="margin-top: 30px;margin-bottom: 15px;font-size: 20px;margin: 1.2em 0 1em;padding: 0;font-weight: bold;color: #35b378;"><span style="display: none;"></span><span><strong style="font-weight: bold;color: #35b378;"><span leaf="">2.2 易于集成与自定义</span></strong></span><span style="display: none;"></span></h3> <ul style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;color: black;list-style-type: disc;" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;margin: 10px 0;"> <span leaf="">提供简单的 Vue 组件接口,几行代码即可实现文档预览功能。</span> </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;margin: 10px 0;"> <span leaf="">支持自定义样式和交互逻辑,满足不同业务需求。</span> </section></li> </ul> <hr style="height: 1px;margin-top: 10px;margin-bottom: 10px;border-top: 1px solid black;border: 1px solid #35b378;margin: 1.5em auto;"> <h2 data-tool="markdown.com.cn编辑器" style="margin-top: 30px;margin-bottom: 15px;bmin-height: 32px;line-height: 32px;border-bottom: solid 1px #000000;color: #35b378;display: inline-block;border-bottom-width: 0px;border-bottom-style: solid;border-color: #35b378;padding-top: 5px;padding-right: 0.5em;padding-left: 0.5em;font-size: 23px;margin: 1em 0 0rem 0;padding: 0.5em 0;text-align: leftt;font-weight: bold;"><span style="display: none;"></span><span><strong style="font-weight: bold;color: #35b378;"><span leaf="">3. 如何快速集成</span><code><span leaf="">vue-office</span></code></strong></span><span></span></h2> <p data-tool="markdown.com.cn编辑器" style="font-size: 16px;padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: black;margin: 1em 4px;"><span leaf="">以下是集成和使用</span><code style="font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: #35b378;"><span leaf="">vue-office</span></code><span leaf=""> 的快速指南:</span></p> <h3 data-tool="markdown.com.cn编辑器" style="margin-top: 30px;margin-bottom: 15px;font-size: 20px;margin: 1.2em 0 1em;padding: 0;font-weight: bold;color: #35b378;"><span style="display: none;"></span><span><strong style="font-weight: bold;color: #35b378;"><span leaf="">3.1 安装 vue-office</span></strong></span><span style="display: none;"></span></h3> <p data-tool="markdown.com.cn编辑器" style="font-size: 16px;padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: black;margin: 1em 4px;"><span leaf="">使用 npm 或 yarn 安装:</span></p> <pre data-tool="markdown.com.cn编辑器" style="margin-top: 10px;margin-bottom: 10px;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;"><span data-cacheurl="" data-remoteid="" style="display: block;background: none;height: 30px;width: 100%;background-size: 40px;background-repeat: no-repeat;background-color: #282c34;margin-bottom: -7px;border-radius: 5px;background-position: 10px 10px;background-image: url(" https: mmbiz.qpic.cn mmbiz_svg ofvngicepbfqib5ddbfwhglygiagmh67y5qdwvhdcluugdnkoj8idicb45djm2umdrda5jxln6ya9cfjn5jicqic1vkgpb50snqhuo 640?wx_fmt="svg&from=appmsg");""></span><code style="overflow-x: auto;padding: 16px;color: #abb2bf;display: -webkit-box;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;font-size: 12px;-webkit-overflow-scrolling: touch;padding-top: 15px;background: #282c34;border-radius: 5px;"><span leaf="">bash</span><br><span leaf="">复制代码</span><br><span leaf="">npm install vue-office --save</span><br><br></code></pre> <p data-tool="markdown.com.cn编辑器" style="font-size: 16px;padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: black;margin: 1em 4px;"><span leaf="">或者:</span></p> <pre data-tool="markdown.com.cn编辑器" style="margin-top: 10px;margin-bottom: 10px;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;"><span data-cacheurl="" data-remoteid="" style="display: block;background: none;height: 30px;width: 100%;background-size: 40px;background-repeat: no-repeat;background-color: #282c34;margin-bottom: -7px;border-radius: 5px;background-position: 10px 10px;background-image: url(" https: mmbiz.qpic.cn mmbiz_svg ofvngicepbfqib5ddbfwhglygiagmh67y5qdwvhdcluugdnkoj8idicb45djm2umdrda5jxln6ya9cfjn5jicqic1vkgpb50snqhuo 640?wx_fmt="svg&from=appmsg");""></span><code style="overflow-x: auto;padding: 16px;color: #abb2bf;display: -webkit-box;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;font-size: 12px;-webkit-overflow-scrolling: touch;padding-top: 15px;background: #282c34;border-radius: 5px;"><br><span leaf="">yarn add vue-office</span><br></code></pre> <h3 data-tool="markdown.com.cn编辑器" style="margin-top: 30px;margin-bottom: 15px;font-size: 20px;margin: 1.2em 0 1em;padding: 0;font-weight: bold;color: #35b378;"><span style="display: none;"></span><span><strong style="font-weight: bold;color: #35b378;"><span leaf="">3.2 使用示例</span></strong></span><span style="display: none;"></span></h3> <p data-tool="markdown.com.cn编辑器" style="font-size: 16px;padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: black;margin: 1em 4px;"><span leaf="">以下是一个实现 PDF 和 Word 文件预览的示例:</span></p> <h3 data-tool="markdown.com.cn编辑器" style="margin-top: 30px;margin-bottom: 15px;font-size: 20px;margin: 1.2em 0 1em;padding: 0;font-weight: bold;color: #35b378;"><span style="display: none;"></span><span><strong style="font-weight: bold;color: #35b378;"><span leaf="">PDF 文件预览</span></strong></span><span style="display: none;"></span></h3> <pre data-tool="markdown.com.cn编辑器" style="margin-top: 10px;margin-bottom: 10px;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;"><span data-cacheurl="" data-remoteid="" style="display: block;background: none;height: 30px;width: 100%;background-size: 40px;background-repeat: no-repeat;background-color: #282c34;margin-bottom: -7px;border-radius: 5px;background-position: 10px 10px;background-image: url(" https: mmbiz.qpic.cn mmbiz_svg ofvngicepbfqib5ddbfwhglygiagmh67y5qdwvhdcluugdnkoj8idicb45djm2umdrda5jxln6ya9cfjn5jicqic1vkgpb50snqhuo 640?wx_fmt="svg&from=appmsg");""></span><code style="overflow-x: auto;padding: 16px;color: #abb2bf;display: -webkit-box;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;font-size: 12px;-webkit-overflow-scrolling: touch;padding-top: 15px;background: #282c34;border-radius: 5px;"><br><span leaf=""> <template> <br><span leaf=""> </span><span style="line-height: 26px;"><span style="line-height: 26px;"><span leaf=""><</span><span style="color: #e06c75;line-height: 26px;"><span leaf="">div</span></span><span leaf=""> </span><span style="color: #d19a66;line-height: 26px;"><span leaf="">class</span></span><span leaf="">=</span><span style="color: #98c379;line-height: 26px;"><span leaf="">"pdf-viewer"</span></span><span leaf="">></span></span><br><span leaf=""> </span><span style="line-height: 26px;"><span leaf=""><</span><span style="color: #e06c75;line-height: 26px;"><span leaf="">VueOfficePdf</span></span><span leaf=""> </span><span style="color: #d19a66;line-height: 26px;"><span leaf="">:file</span></span><span leaf="">=</span><span style="color: #98c379;line-height: 26px;"><span leaf="">"pdfFile"</span></span><span leaf=""> /></span></span><br><span leaf=""> </span><span style="line-height: 26px;"><span leaf=""><!--/</span--><span style="color: #e06c75;line-height: 26px;"><span leaf="">div</span></span><span leaf="">></span></span></span><br><span leaf=""><</span><span style="color: #98c379;line-height: 26px;"><span leaf="">/templat</span><br><br><span leaf=""><script></span><br /><span leaf="">import VueOfficePdf from 'vue-office/</span></span><span leaf="">pdf</span><span style="color: #98c379;line-height: 26px;"><span leaf="">';</span><br /><br /><span leaf="">export default {</span><br /><span leaf=""> components: { VueOfficePdf },</span><br /><span leaf=""> data() {</span><br /><span leaf=""> return {</span><br /><span leaf=""> pdfFile: '</span></span><span leaf="">https:</span><span style="color: #5c6370;font-style: italic;line-height: 26px;"><span leaf="">//example.com/document.pdf' // PDF 文件 URL</span></span><br /><span leaf=""> };</span><br /><span leaf=""> }</span><br /><span leaf="">};</span><br /><span leaf=""><</span><span style="color: #98c379;line-height: 26px;"><span leaf="">/script></span><br /><br /></span></code></pre><h3 data-tool="markdown.com.cn编辑器" style="margin-top: 30px;margin-bottom: 15px;font-size: 20px;margin: 1.2em 0 1em;padding: 0;font-weight: bold;color: #35b378;"><span style="display: none;"></span><span><strong style="font-weight: bold;color: #35b378;"><span leaf="">Word 文件预览</span></strong></span><span style="display: none;"></span></h3><pre data-tool="markdown.com.cn编辑器" style="margin-top: 10px;margin-bottom: 10px;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;"><span data-cacheurl="" data-remoteid="" style="display: block;background: none;height: 30px;width: 100%;background-size: 40px;background-repeat: no-repeat;background-color: #282c34;margin-bottom: -7px;border-radius: 5px;background-position: 10px 10px;background-image: url("https://mmbiz.qpic.cn/mmbiz_svg/ofvnGicEPbfQib5ddbfwHglYgiagmH67Y5qdwVhDclUuGDNkoJ8IDicB45Djm2UMdRda5jXLn6yA9cfJN5jicqic1vKgpB50sNQHuO/640?wx_fmt=svg&from=appmsg");"></span><code style="overflow-x: auto;padding: 16px;color: #abb2bf;display: -webkit-box;font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;font-size: 12px;-webkit-overflow-scrolling: touch;padding-top: 15px;background: #282c34;border-radius: 5px;"><br /><span leaf=""><template></span><br /><span leaf=""> </span><span style="line-height: 26px;"><span style="line-height: 26px;"><span leaf=""><</span><span style="color: #e06c75;line-height: 26px;"><span leaf="">div</span></span><span leaf=""> </span><span style="color: #d19a66;line-height: 26px;"><span leaf="">class</span></span><span leaf="">=</span><span style="color: #98c379;line-height: 26px;"><span leaf="">"word-viewer"</span></span><span leaf="">></span></span><br /><span leaf=""> </span><span style="line-height: 26px;"><span leaf=""><</span><span style="color: #e06c75;line-height: 26px;"><span leaf="">VueOfficeWord</span></span><span leaf=""> </span><span style="color: #d19a66;line-height: 26px;"><span leaf="">:file</span></span><span leaf="">=</span><span style="color: #98c379;line-height: 26px;"><span leaf="">"wordFile"</span></span><span leaf=""> /></span></span><br /><span leaf=""> </span><span style="line-height: 26px;"><span leaf=""></</span><span style="color: #e06c75;line-height: 26px;"><span leaf="">div</span></span><span leaf="">></span></span></span><br /><span leaf=""><</span><span style="color: #98c379;line-height: 26px;"><span leaf="">/template></span><br /><br /><span leaf=""><script></span><br /><span leaf="">import VueOfficeWord from 'vue-office/</span></span><span leaf="">word</span><span style="color: #98c379;line-height: 26px;"><span leaf="">';</span><br /><br /><span leaf="">export default {</span><br /><span leaf=""> components: { VueOfficeWord },</span><br /><span leaf=""> data() {</span><br /><span leaf=""> return {</span><br /><span leaf=""> wordFile: '</span></span><span leaf="">https:</span><span style="color: #5c6370;font-style: italic;line-height: 26px;"><span leaf="">//example.com/document.docx' // Word 文件 URL</span></span><br /><span leaf=""> };</span><br /><span leaf=""> }</span><br /><span leaf="">};</span><br /><span leaf=""><</span><span style="color: #98c379;line-height: 26px;"><span leaf="">/script></span><br /></span></code></pre><hr style="height: 1px;margin-top: 10px;margin-bottom: 10px;border-top: 1px solid black;border: 1px solid #35b378;margin: 1.5em auto;" /><h3 data-tool="markdown.com.cn编辑器" style="margin-top: 30px;margin-bottom: 15px;font-size: 20px;margin: 1.2em 0 1em;padding: 0;font-weight: bold;color: #35b378;"><span style="display: none;"></span><span><strong style="font-weight: bold;color: #35b378;"><span leaf="">3.3 支持的 Props 和事件</span></strong></span><span style="display: none;"></span></h3><table style="display: table;text-align: left;"><thead><tr style="border: 0;border-top: 1px solid #ccc;background-color: white;"><th valign="top" style="font-size: 16px;border: 1px solid #ccc;padding: 5px 10px;text-align: left;font-weight: bold;background-color: #f0f0f0;"><section><span leaf="">Prop</span></section></th><th valign="top" style="font-size: 16px;border: 1px solid #ccc;padding: 5px 10px;text-align: left;font-weight: bold;background-color: #f0f0f0;"><section><span leaf="">类型</span></section></th><th valign="top" style="font-size: 16px;border: 1px solid #ccc;padding: 5px 10px;text-align: left;font-weight: bold;background-color: #f0f0f0;"><section><span leaf="">说明</span></section></th></tr></thead><tbody><tr style="border: 0;border-top: 1px solid #ccc;background-color: white;"><td valign="top" style="font-size: 16px;border: 1px solid #ccc;padding: 5px 10px;text-align: left;"><code><span leaf="">file</span></code></td><td valign="top" style="font-size: 16px;border: 1px solid #ccc;padding: 5px 10px;text-align: left;"><code><span leaf="">File | String</span></code></td><td valign="top" style="font-size: 16px;border: 1px solid #ccc;padding: 5px 10px;text-align: left;"><section><span leaf=""><br /></span></section></td></tr><tr style="border: 0;border-top: 1px solid #ccc;background-color: #F8F8F8;"><td valign="top" style="font-size: 16px;border: 1px solid #ccc;padding: 5px 10px;text-align: left;"><code><span leaf="">loading</span></code></td><td valign="top" style="font-size: 16px;border: 1px solid #ccc;padding: 5px 10px;text-align: left;"><code><span leaf="">Boolean</span></code></td><td valign="top" style="font-size: 16px;border: 1px solid #ccc;padding: 5px 10px;text-align: left;"><section><span leaf="">是否显示加载动画,默认值为</span><code><span leaf="">true</span></code><span leaf="">。</span></section></td></tr><tr style="border: 0;border-top: 1px solid #ccc;background-color: white;"><td valign="top" style="font-size: 16px;border: 1px solid #ccc;padding: 5px 10px;text-align: left;"><code><span leaf="">options</span></code></td><td valign="top" style="font-size: 16px;border: 1px solid #ccc;padding: 5px 10px;text-align: left;"><code><span leaf="">Object</span></code></td><td valign="top" style="font-size: 16px;border: 1px solid #ccc;padding: 5px 10px;text-align: left;"><section><span leaf="">配置预览行为,例如缩放模式、页面布局等。</span></section></td></tr></tbody></table><hr style="height: 1px;margin-top: 10px;margin-bottom: 10px;border-top: 1px solid black;border: 1px solid #35b378;margin: 1.5em auto;" /><h2 data-tool="markdown.com.cn编辑器" style="margin-top: 30px;margin-bottom: 15px;bmin-height: 32px;line-height: 32px;border-bottom: solid 1px #000000;color: #35b378;display: inline-block;border-bottom-width: 0px;border-bottom-style: solid;border-color: #35b378;padding-top: 5px;padding-right: 0.5em;padding-left: 0.5em;font-size: 23px;margin: 1em 0 0rem 0;padding: 0.5em 0;text-align: leftt;font-weight: bold;"><span style="display: none;"></span><span><strong style="font-weight: bold;color: #35b378;"><span leaf="">4. 实际应用场景</span></strong></span><span></span></h2><h3 data-tool="markdown.com.cn编辑器" style="margin-top: 30px;margin-bottom: 15px;font-size: 20px;margin: 1.2em 0 1em;padding: 0;font-weight: bold;color: #35b378;"><span style="display: none;"></span><span><strong style="font-weight: bold;color: #35b378;"><span leaf="">4.1 B 端管理类系统的大量附件预览需求</span></strong></span><span style="display: none;"></span></h3><p data-tool="markdown.com.cn编辑器" style="font-size: 16px;padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: black;margin: 1em 4px;"><span leaf="">在许多 B 端系统中,比如企业管理后台、OA 办公系统或在线审批平台,文档附件预览是一个高频需求。通过</span><code style="font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: #35b378;"><span leaf="">vue-office</span></code><span leaf="">,可以快速实现以下功能:</span></p><ul style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;color: black;list-style-type: disc;" class="list-paddingleft-1"><li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;margin: 10px 0;"><span leaf="">在无需下载的情况下直接预览文档,提高用户体验。</span></section></li><li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;margin: 10px 0;"><span leaf="">支持 PDF 和 Word 文档的高质量渲染,满足企业对合同、审批报告等文件的展示需求。</span></section></li><li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;margin: 10px 0;"><span leaf="">提供轻量化的组件,降低开发成本,减少不必要的复杂度。</span></section></li></ul><h3 data-tool="markdown.com.cn编辑器" style="margin-top: 30px;margin-bottom: 15px;font-size: 20px;margin: 1.2em 0 1em;padding: 0;font-weight: bold;color: #35b378;"><span style="display: none;"></span><span><strong style="font-weight: bold;color: #35b378;"><span leaf="">4.2 法务系统中的合同文档管理</span></strong></span><span style="display: none;"></span></h3><p data-tool="markdown.com.cn编辑器" style="font-size: 16px;padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: black;margin: 1em 4px;"><span leaf="">在法务系统中,合同的在线预览和校对是常见需求。</span><code style="font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: #35b378;"><span leaf="">vue-office</span></code><span leaf=""> 提供流畅的 PDF 和 Word 预览体验,帮助法务人员快速定位合同内容,提高审核效率。</span></p><hr style="height: 1px;margin-top: 10px;margin-bottom: 10px;border-top: 1px solid black;border: 1px solid #35b378;margin: 1.5em auto;" /><h2 data-tool="markdown.com.cn编辑器" style="margin-top: 30px;margin-bottom: 15px;bmin-height: 32px;line-height: 32px;border-bottom: solid 1px #000000;color: #35b378;display: inline-block;border-bottom-width: 0px;border-bottom-style: solid;border-color: #35b378;padding-top: 5px;padding-right: 0.5em;padding-left: 0.5em;font-size: 23px;margin: 1em 0 0rem 0;padding: 0.5em 0;text-align: leftt;font-weight: bold;"><span style="display: none;"></span><span><strong style="font-weight: bold;color: #35b378;"><span leaf="">5. vue-office 的对比优势</span></strong></span><span></span></h2><table style="display: table;text-align: left;"><thead><tr style="border: 0;border-top: 1px solid #ccc;background-color: white;"><th valign="top" style="font-size: 16px;border: 1px solid #ccc;padding: 5px 10px;text-align: left;font-weight: bold;background-color: #f0f0f0;"><section><span leaf="">特性</span></section></th><th valign="top" style="font-size: 16px;border: 1px solid #ccc;padding: 5px 10px;text-align: left;font-weight: bold;background-color: #f0f0f0;"><section><span leaf="">vue-office</span></section></th><th valign="top" style="font-size: 16px;border: 1px solid #ccc;padding: 5px 10px;text-align: left;font-weight: bold;background-color: #f0f0f0;"><section><span leaf="">自己集成</span><code><span leaf="">pdf.js</span></code><span leaf=""> 和</span><code><span leaf="">docx-preview</span></code></section></th></tr></thead><tbody><tr style="border: 0;border-top: 1px solid #ccc;background-color: white;"><td valign="top" style="font-size: 16px;border: 1px solid #ccc;padding: 5px 10px;text-align: left;"><strong style="font-weight: bold;color: #35b378;"><span leaf="">开发成本</span></strong></td><td valign="top" style="font-size: 16px;border: 1px solid #ccc;padding: 5px 10px;text-align: left;"><section><span leaf="">开箱即用,简单易集成</span></section></td><td valign="top" style="font-size: 16px;border: 1px solid #ccc;padding: 5px 10px;text-align: left;"><section><span leaf="">需要自己封装,开发周期较长</span></section></td></tr><tr style="border: 0;border-top: 1px solid #ccc;background-color: #F8F8F8;"><td valign="top" style="font-size: 16px;border: 1px solid #ccc;padding: 5px 10px;text-align: left;"><strong style="font-weight: bold;color: #35b378;"><span leaf="">功能扩展性</span></strong></td><td valign="top" style="font-size: 16px;border: 1px solid #ccc;padding: 5px 10px;text-align: left;"><section><span leaf="">提供统一接口,灵活扩展</span></section></td><td valign="top" style="font-size: 16px;border: 1px solid #ccc;padding: 5px 10px;text-align: left;"><section><span leaf="">难以统一管理,扩展需要额外开发</span></section></td></tr><tr style="border: 0;border-top: 1px solid #ccc;background-color: white;"><td valign="top" style="font-size: 16px;border: 1px solid #ccc;padding: 5px 10px;text-align: left;"><strong style="font-weight: bold;color: #35b378;"><span leaf="">兼容性</span></strong></td><td valign="top" style="font-size: 16px;border: 1px solid #ccc;padding: 5px 10px;text-align: left;"><section><span leaf="">集成了优化方案,兼容稳定</span></section></td><td valign="top" style="font-size: 16px;border: 1px solid #ccc;padding: 5px 10px;text-align: left;"><section><span leaf="">底层库原生问题需自行处理</span></section></td></tr></tbody></table><p data-tool="markdown.com.cn编辑器" style="font-size: 16px;padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: black;margin: 1em 4px;"><span leaf="">通过</span><code style="font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: #35b378;"><span leaf="">vue-office</span></code><span leaf="">,开发者可以免去复杂的底层封装工作,专注于业务功能的开发。</span></p><hr style="height: 1px;margin-top: 10px;margin-bottom: 10px;border-top: 1px solid black;border: 1px solid #35b378;margin: 1.5em auto;" /><h2 data-tool="markdown.com.cn编辑器" style="margin-top: 30px;margin-bottom: 15px;bmin-height: 32px;line-height: 32px;border-bottom: solid 1px #000000;color: #35b378;display: inline-block;border-bottom-width: 0px;border-bottom-style: solid;border-color: #35b378;padding-top: 5px;padding-right: 0.5em;padding-left: 0.5em;font-size: 23px;margin: 1em 0 0rem 0;padding: 0.5em 0;text-align: leftt;font-weight: bold;"><span style="display: none;"></span><span><strong style="font-weight: bold;color: #35b378;"><span leaf="">6. 总结</span></strong></span><span></span></h2><p data-tool="markdown.com.cn编辑器" style="font-size: 16px;padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: black;margin: 1em 4px;"><code style="font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: #35b378;"><span leaf="">vue-office</span></code><span leaf=""> 是一款专注于文档预览功能的 Vue 组件库,基于成熟的</span><code style="font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: #35b378;"><span leaf="">pdf.js</span></code><span leaf=""> 和</span><code style="font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: #35b378;"><span leaf="">docx-preview</span></code><span leaf=""> 库,提供高质量的 PDF 和 Word 渲染效果。在 B 端管理类系统中,它可以帮助开发者快速实现附件预览功能,提升产品的用户体验。</span></p><p data-tool="markdown.com.cn编辑器" style="font-size: 16px;padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: black;margin: 1em 4px;"><strong style="font-weight: bold;color: #35b378;"><span leaf="">亮点总结:</span></strong></p><ul style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;color: black;list-style-type: disc;" class="list-paddingleft-1"><li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;margin: 10px 0;"><span leaf="">支持 PDF 和 Word 文档的高质量预览,渲染稳定。</span></section></li><li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;margin: 10px 0;"><span leaf="">集成简单,开箱即用,适合快速开发场景。</span></section></li><li><section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;margin: 10px 0;"><span leaf="">性能优化良好,适用于大文件和多文档的预览需求。</span></section></li></ul><p data-tool="markdown.com.cn编辑器" style="font-size: 16px;padding-top: 8px;padding-bottom: 8px;line-height: 26px;color: black;margin: 1em 4px;"><span leaf="">如果你正在开发一个需要附件预览的管理系统,不妨试试</span><code style="font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: #35b378;"><span leaf="">vue-office</span></code><span leaf="">,让你的系统功能更上一层楼!</span></p></section><section><span leaf=""><br /></span></section><p style="display: none;"><mp-style-type data-value="3"></mp-style-type></p></div> <script type="text/javascript" nonce="1498836573" reportloaderror> var first_sceen__time = (+new Date()); if ("" == 1 && document.getElementById('js_content')) { document.getElementById('js_content').addEventListener("selectstart",function(e){ e.preventDefault(); }); } </script> </span></span></span> </template></span></code></pre> </section>
作者:微信小助手
<section style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(10, 10, 10);letter-spacing: normal;background-color: rgb(255, 255, 255);text-align: left;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;font-size: 15px;> <section style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));margin: 0px 8px 1.5em;text-align: justify;line-height: 1.75;letter-spacing: 0.1em;color: rgb(63, 63, 63);"> 在传统开发模式中,从需求到上线通常需要经历漫长的开发周期,尤其是在界面设计、交互实现等环节,往往需要反复打磨。而随着低代码技术的崛起,这一切正在改变。低代码让开发者可以通过拖拽、配置等简单操作,快速构建复杂的系统页面,既节省时间又提高了开发质量。 </section> <p style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));margin: 1.5em 8px;text-align: justify;line-height: 1.75;letter-spacing: 0.1em;color: rgb(63, 63, 63);">低代码开发是一场生产力革命!</p> <p style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));margin: 1.5em 8px;text-align: justify;line-height: 1.75;letter-spacing: 0.1em;color: rgb(63, 63, 63);"><strong style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));text-align: left;line-height: 1.75;font-size: inherit;color: rgb(85, 201, 234);">LowCodeEngine</strong>,这款由阿里开源的低代码开发框架,正以强大的定制能力和优雅的开发体验,为开发者带来前所未有的效率提升。不仅功能强大,还兼具灵活性和易用性,为开发者和业务团队搭建起了一个共同高效合作的桥梁。</p> <p style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));margin: 1.5em 8px;text-align: justify;line-height: 1.75;letter-spacing: 0.1em;color: rgb(63, 63, 63);">更重要的是,它提供了丰富的 API 和插件支持,能够满足各种复杂的业务场景需求。</p> <p style="text-align: center;"><img class="rich_pages wxw-img" data-backh="273" data-backw="578" data-galleryid="" data-imgfileid="100002922" data-ratio="0.4729374671571203" data-s="300,640" src="/upload/9f7704cf197beed30c1e6c3e3246c50e.png" data-type="png" data-w="1903" style="width: 100%;height: auto;"></p> <h3 style="border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-bottom-color: rgb(85, 201, 234);border-left-color: rgb(85, 201, 234);font-size: 18px;font-weight: bold;margin-top: 2em;margin-right: 8px;margin-bottom: 0.75em;line-height: 1.2;padding-left: 12px;color: rgb(63, 63, 63);">功能亮点:全方位覆盖开发需求</h3> <ul style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));list-style: none;padding-left: 1.5em;line-height: 1.75;color: rgb(63, 63, 63);" class="list-paddingleft-1"> <li style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.5em 8px;"><p>• 🌈 提炼自企业级低代码平台的面向扩展设计的内核引擎,奉行最小内核,最强生态的设计理念</p></li> <li style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.5em 8px;"><p>• 📦 开箱即用的高质量生态元素,包括 物料体系、设置器、插件 等</p></li> <li style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.5em 8px;"><p>• ⚙️ 完善的工具链,支持 物料体系、设置器、插件 等生态元素的全链路研发周期</p></li> <li style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.5em 8px;"><p>• 🔌 强大的扩展能力,已支撑 100+ 个各种类型低代码平台</p></li> <li style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.5em 8px;"><p>• 🛡 使用 TypeScript 开发,提供完整的类型定义文件</p></li> <li style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.5em 8px;"><p>• 提供 <strong style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));line-height: 1.75;font-size: inherit;color: rgb(85, 201, 234);">fetch</strong> 和 <strong style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));line-height: 1.75;font-size: inherit;color: rgb(85, 201, 234);">jsonp</strong> 两种方式设置数据源,让数据交互轻松高效。</p></li> </ul> <h3 style="border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-bottom-color: rgb(85, 201, 234);border-left-color: rgb(85, 201, 234);font-size: 18px;font-weight: bold;margin-top: 2em;margin-right: 8px;margin-bottom: 0.75em;line-height: 1.2;padding-left: 12px;color: rgb(63, 63, 63);">界面使用</h3> <p style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));margin: 1.5em 8px;text-align: justify;line-height: 1.75;letter-spacing: 0.1em;color: rgb(63, 63, 63);">支持页面预览视图、源码视图和组件大纲视图之间切换,让开发者在不同阶段都能保持清晰的全局视野。</p> <p style="text-align: center;"><img class="rich_pages wxw-img" data-backh="274" data-backw="578" data-galleryid="" data-imgfileid="100002924" data-ratio="0.4744791666666667" data-s="300,640" src="/upload/af3a7376712aef348400360e6f58966e.png" data-type="png" data-w="1920" style="width: 100%;height: auto;"></p> <section style="text-align: center;margin-top: 8px;"> <img class="rich_pages wxw-img" data-backh="276" data-backw="578" data-galleryid="" data-imgfileid="100002923" data-ratio="0.4773922187171398" data-s="300,640" src="/upload/7b7e3b0f3838858e1bbc0eeeebd11126.png" data-type="png" data-w="1902" style="width: 100%;height: auto;"> </section> <p style="text-align: center;margin-top: 8px;"><img class="rich_pages wxw-img" data-backh="275" data-backw="578" data-galleryid="" data-imgfileid="100002925" data-ratio="0.4764803541781959" data-s="300,640" src="/upload/28dfa2cc33bf789f03fa045077bed7ea.png" data-type="png" data-w="1807" style="width: 100%;height: auto;"></p> <p style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));margin: 1.5em 8px;text-align: justify;line-height: 1.75;letter-spacing: 0.1em;color: rgb(63, 63, 63);">提供页面尺寸调节功能,轻松适配多端设备;同时支持中英文切换,让全球化协作更加便捷。</p> <p style="text-align: center;"><img class="rich_pages wxw-img" data-galleryid="" data-imgfileid="100002926" data-ratio="0.3130630630630631" data-s="300,640" src="/upload/f7f74e4a2aa97ad69effd4e895eecae0.png" data-type="png" data-w="444" style=""></p> <p style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));margin: 1.5em 8px;text-align: justify;line-height: 1.75;letter-spacing: 0.1em;color: rgb(63, 63, 63);">复制、删除、调整组件顺序,甚至嵌套容器类型组件,所有操作都能通过直观的拖拽完成。</p> <p style="text-align: center;"><img class="rich_pages wxw-img" data-backh="335" data-backw="578" data-galleryid="" data-imgfileid="100002927" data-ratio="0.5802213001383126" data-s="300,640" src="/upload/58b95d1e0b51ed2d408d2d2a5b0b95e6.png" data-type="png" data-w="1446" style="width: 100%;height: auto;"></p> <h3 style="border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-bottom-color: rgb(85, 201, 234);border-left-color: rgb(85, 201, 234);font-size: 18px;font-weight: bold;margin-top: 2em;margin-right: 8px;margin-bottom: 0.75em;line-height: 1.2;padding-left: 12px;color: rgb(63, 63, 63);">本地调试</h3> <p style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));margin: 1.5em 8px;text-align: justify;line-height: 1.75;letter-spacing: 0.1em;color: rgb(63, 63, 63);">windows 环境必须使用 <span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));text-align: left;line-height: 1.75;color: rgb(87, 107, 149);">WSL</span>,其他终端不保证能正常运行:</p> <pre style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;font-feature-settings: normal;font-variation-settings: normal;font-size: 14px;margin: 10px 8px;color: rgb(171, 178, 191);background: rgb(40, 44, 52);line-height: 1.5;overflow-x: auto;border-radius: 8px;box-shadow: rgba(0, 0, 0.05) 0px inset;><span hidden style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));display: flex;padding-top: 10px;padding-right: 14px;padding-left: 14px;"> <svg xmlns="http://www.w3.org/2000/svg" version="1.1" x="0px" y="0px" width="45px" height="13px" viewbox="0 0 450 130"> <ellipse cx="50" cy="65" rx="50" ry="52" stroke="rgb(220,60,54)" stroke-width="2" fill="rgb(237,108,96)"></ellipse><ellipse cx="225" cy="65" rx="50" ry="52" stroke="rgb(218,151,33)" stroke-width="2" fill="rgb(247,193,81)"></ellipse><ellipse cx="400" cy="65" rx="50" ry="52" stroke="rgb(27,161,37)" stroke-width="2" fill="rgb(100,200,86)"></ellipse> </svg></span><code style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));font-family: " fira code, menlo, operator mono, consolas, monaco, monospace;font-feature-settings: normal;font-variation-settings: normal;font-size: 15px;display: -webkit-box;padding: 0.5em 1em 1em;overflow-x: auto;line-height: 1.75;><span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(92, 99, 112);font-style: italic;"># 安装工具</span><br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));">npm install -g @alilc/create-element@latest<br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"><br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"><span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(92, 99, 112);font-style: italic;"># 创建编辑器项目</span><br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));">npm init @alilc/element editor-project-name<br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"><br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"><span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(92, 99, 112);font-style: italic;"># 进入项目目录</span><br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"><span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(230, 192, 123);">cd</span> editor-project-name<br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"><br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"><span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(92, 99, 112);font-style: italic;"># 安装依赖</span><br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));">npm install<br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"><br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));"><span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(92, 99, 112);font-style: italic;"># 启动项目</span><br style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));">npm start</code></pre> <h3 style="border-width: 0px 0px 1px 4px;border-style: solid solid dashed;border-bottom-color: rgb(85, 201, 234);border-left-color: rgb(85, 201, 234);font-size: 18px;font-weight: bold;margin-top: 2em;margin-right: 8px;margin-bottom: 0.75em;line-height: 1.2;padding-left: 12px;color: rgb(63, 63, 63);">总结</h3> <p style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));margin: 1.5em 8px;text-align: justify;line-height: 1.75;letter-spacing: 0.1em;color: rgb(63, 63, 63);">作为低代码开发领域的佼佼者,<strong style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));text-align: left;line-height: 1.75;font-size: inherit;color: rgb(85, 201, 234);">LowCodeEngine</strong> 为开发者节省了大量的时间,让繁琐的开发变得高效。</p> <p style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));margin: 1.5em 8px;text-align: justify;line-height: 1.75;letter-spacing: 0.1em;color: rgb(63, 63, 63);">Github star趋势:目前该项目的 star 数高达14k。</p> <p style="text-align: center;"><img class="rich_pages wxw-img" data-backh="385" data-backw="578" data-galleryid="" data-imgfileid="100002928" data-ratio="0.6658959537572254" data-s="300,640" src="/upload/425ea81251e736f42e5b53f5fe6fe17f.png" data-type="png" data-w="865" style="width: 100%;height: auto;"></p> <p style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));margin: 1.5em 8px;text-align: justify;line-height: 1.75;letter-spacing: 0.1em;color: rgb(63, 63, 63);">如果你希望快速搭建功能强大的系统页面,同时又享受灵活的自定义能力,可以试试这款工具。</p> <p style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));margin: 1.5em 8px;text-align: justify;line-height: 1.75;letter-spacing: 0.1em;color: rgb(63, 63, 63);"><strong style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));text-align: left;line-height: 1.75;font-size: inherit;color: rgb(85, 201, 234);">官网</strong>:</p> <pre style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;font-feature-settings: normal;font-variation-settings: normal;font-size: 14px;margin: 10px 8px;color: rgb(171, 178, 191);background: rgb(40, 44, 52);line-height: 1.5;overflow-x: auto;border-radius: 8px;box-shadow: rgba(0, 0, 0.05) 0px inset;><span hidden style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));display: flex;padding-top: 10px;padding-right: 14px;padding-left: 14px;"> <svg xmlns="http://www.w3.org/2000/svg" version="1.1" x="0px" y="0px" width="45px" height="13px" viewbox="0 0 450 130"> <ellipse cx="50" cy="65" rx="50" ry="52" stroke="rgb(220,60,54)" stroke-width="2" fill="rgb(237,108,96)"></ellipse><ellipse cx="225" cy="65" rx="50" ry="52" stroke="rgb(218,151,33)" stroke-width="2" fill="rgb(247,193,81)"></ellipse><ellipse cx="400" cy="65" rx="50" ry="52" stroke="rgb(27,161,37)" stroke-width="2" fill="rgb(100,200,86)"></ellipse> </svg></span><code style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));font-family: " fira code, menlo, operator mono, consolas, monaco, monospace;font-feature-settings: normal;font-variation-settings: normal;font-size: 15px;display: -webkit-box;padding: 0.5em 1em 1em;overflow-x: auto;line-height: 1.75;><span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(209, 154, 102);">https</span>:<span style="border-width: 0px;border-style: solid;border-color: hsl(var(--border));color: rgb(92, 99, 112);font-style: italic;">//lowcode-engine.cn/index</span></code></pre> </section>
作者:微信小助手
<h3 style="letter-spacing: normal;white-space: normal;text-align: left;line-height: 1.2;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;font-size: 14px;font-weight: bold;margin-right: 8px;margin-bottom: 0.75em;padding-left: 8px;border-left: 3px solid rgb(15, 76, 129);color: rgb(63, 63, 63);>前言</h3> <p style="font-size: 14px;white-space: normal;text-align: left;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;margin: 1.5em 8px;letter-spacing: 0.1em;color: rgb(63, 63, 63);>我的<span style="line-height: 1.75;color: rgb(87, 107, 149);">拾壹博客</span>博客网站是由vue写的,由于vue是单页面的,所以对于seo优化来讲并不是很友好,蜘蛛只能抓取首页,但是呢,虽然流量没有多少,但我们的seo还是要做一做的,毕竟有seo才能吸引到更多的用户访问。</p> <h4 style="font-size: 14px;letter-spacing: normal;white-space: normal;text-align: left;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;font-weight: bold;margin: 2em 8px 0.5em;color: rgb(15, 76, 129);>说说几种方案吧</h4> <ul style="font-size: 14px;letter-spacing: normal;white-space: normal;text-align: left;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;padding-left: 1em;list-style: circle;color: rgb(63, 63, 63); class="list-paddingleft-1"> <li style="text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.2em 8px;"><p>• 网上比较多的是使用Nuxt.js,但是用我已经开发好的项目来改,说实话,前端小白的我实在是改不动了。</p></li> <li style="text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.2em 8px;"><p>• Quasar不太了解,不过多介绍了。</p></li> <li style="text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.2em 8px;"><p>• Vite SSR,Vite 提供了内置的Vue 服务端渲染支持。也要改已有代码,不想改,不会改。</p></li> </ul> <p style="font-size: 14px;white-space: normal;text-align: left;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;margin: 1.5em 8px;letter-spacing: 0.1em;color: rgb(63, 63, 63);>官方给的方案被我否定了,就是想找个不用修改已有代码的方法。经过不懈的百度努力,发现了一线生机Puppeteer,简单说说这个吧</p> <h4 style="font-size: 14px;letter-spacing: normal;white-space: normal;text-align: left;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;font-weight: bold;margin: 2em 8px 0.5em;color: rgb(15, 76, 129);>Puppeteer</h4> <blockquote style="font-size: 14px;letter-spacing: normal;white-space: normal;text-align: left;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;border-left: none;padding: 1em;border-radius: 8px;color: rgba(0, 0, 0.5);background: rgb(247, 247, 247);margin: 2em 8px;> <p style="line-height: 1.75;font-size: 1em;letter-spacing: 0.1em;color: rgb(80, 80, 80);">Puppeteer 是一个 Node.js 库,它提供了一个高级 API 来通过开发工具协议控制 Chrome/Chromium。 Puppeteer 默认以无头模式运行,但可以配置为在完整 (“有头”) Chrome/Chromium 中运行。</p> </blockquote> <p style="font-size: 14px;white-space: normal;text-align: left;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;margin: 1.5em 8px;letter-spacing: 0.1em;color: rgb(63, 63, 63);>Puppeteer的作用,我主要用到的是SSR:</p> <ul style="font-size: 14px;letter-spacing: normal;white-space: normal;text-align: left;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;padding-left: 1em;list-style: circle;color: rgb(63, 63, 63); class="list-paddingleft-2"> <li style="text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.2em 8px;"><p>• 生成页面的屏幕截图和 PDF。</p></li> <li style="text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.2em 8px;"><p>• 抓取 SPA(单页应用)并生成预渲染内容(即 “SSR”(服务器端渲染))。</p></li> <li style="text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.2em 8px;"><p>• 自动化表单提交、UI 测试、键盘输入等。</p></li> <li style="text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.2em 8px;"><p>• 使用最新的 JavaScript 和浏览器功能创建自动化测试环境。</p></li> <li style="text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.2em 8px;"><p>• 捕获站点的时间线痕迹以帮助诊断性能问题。</p></li> <li style="text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.2em 8px;"><p>• 测试 Chrome 扩展程序。</p><h4 style="line-height: 1.75;font-size: 14px;font-weight: bold;margin: 2em 8px 0.5em;color: rgb(15, 76, 129);">SEO实现-使用Puppeteer进行SSR</h4><p>搭建用到的工具</p></li> <li style="text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.2em 8px;"><p>• node</p></li> <li style="text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.2em 8px;"><p>• npm</p></li> <li style="text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.2em 8px;"><p>• puppeteer</p></li> <li style="text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.2em 8px;"><p>• express</p></li> <li style="text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.2em 8px;"><p>• html-minifier</p></li> <li style="text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.2em 8px;"><p>• google-chrome</p></li> <li style="text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.2em 8px;"><p>• nginx</p><h4 style="line-height: 1.75;font-size: 14px;font-weight: bold;margin: 2em 8px 0.5em;color: rgb(15, 76, 129);">1. 安装Node.js和npm</h4><p>已经安装过node.js的机器忽略这部分即可,可以通过node -v查看</p></li> </ul> <ol style="font-size: 14px;letter-spacing: normal;white-space: normal;text-align: left;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;padding-left: 1em;color: rgb(63, 63, 63); class="list-paddingleft-1"> <li style="text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.2em 8px;"><p>1. 进入node安装目录<code style="line-height: 1.75;font-family: Menlo, " operator mono, consolas, monaco, monospace;white-space: nowrap;><span style="color: rgb(230, 192, 123);"><span>cd</span></span><span> </span><span>/</span><span>opt</span></code></p></li> <li style="text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.2em 8px;"><p>2. 下载安装包</p></li> </ol> <pre style="color: rgb(171, 178, 191);background: rgb(40, 44, 52);font-size: 14px;letter-spacing: normal;text-align: left;line-height: 1.5;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;overflow-x: auto;border-radius: 8px;padding: 1em;margin: 10px 8px;><code style="line-height: 1.75;font-family: Menlo, " operator mono, consolas, monaco, monospace;white-space: nowrap;><span>wget https</span><span>://</span><span>nodejs</span><span>.</span><span>org</span><span>/</span><span>dist</span><span>/</span><span>v17</span><span>.</span><span>9.0</span><span>/</span><span>node</span><span>-</span><span>v17</span><span>.</span><span>9.0</span><span>-</span><span>linux</span><span>-</span><span>x64</span><span>.</span><span>tar</span><span>.</span><span>gz</span></code></pre> <ol style="font-size: 14px;letter-spacing: normal;white-space: normal;text-align: left;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;padding-left: 1em;color: rgb(63, 63, 63); class="list-paddingleft-1"> <li style="text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.2em 8px;"><p>1. 解压安装包</p></li> </ol> <pre style="color: rgb(171, 178, 191);background: rgb(40, 44, 52);font-size: 14px;letter-spacing: normal;text-align: left;line-height: 1.5;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;overflow-x: auto;border-radius: 8px;padding: 1em;margin: 10px 8px;><code style="line-height: 1.75;font-family: Menlo, " operator mono, consolas, monaco, monospace;white-space: nowrap;><span>tar </span><span>-</span><span>xzvf node</span><span>-</span><span>v17</span><span>.</span><span>9.0</span><span>-</span><span>linux</span><span>-</span><span>x64</span><span>.</span><span>tar</span><span>.</span><span>gz</span></code></pre> <p style="font-size: 14px;white-space: normal;text-align: left;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;margin: 1.5em 8px;letter-spacing: 0.1em;color: rgb(63, 63, 63);>4.设置软连接,建立快捷命令</p> <pre style="color: rgb(171, 178, 191);background: rgb(40, 44, 52);font-size: 14px;letter-spacing: normal;text-align: left;line-height: 1.5;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;overflow-x: auto;border-radius: 8px;padding: 1em;margin: 10px 8px;><code style="line-height: 1.75;font-family: Menlo, " operator mono, consolas, monaco, monospace;white-space: nowrap;><span style="color: rgb(230, 192, 123);"><span>ln</span></span><span> </span><span>-</span><span>s </span><span>/</span><span>opt</span><span>/</span><span>node</span><span>-</span><span>v17</span><span>.</span><span>9.0</span><span>-</span><span>linux</span><span>-</span><span>x64</span><span>/</span><span>bin</span><span>/</span><span>node </span><span>/</span><span>usr</span><span>/</span><span>local</span><span>/</span><span>bin</span><span>/</span><br><span style="color: rgb(230, 192, 123);"><span>ln</span></span><span> </span><span>-</span><span>s </span><span>/</span><span>opt</span><span>/</span><span>node</span><span>-</span><span>v17</span><span>.</span><span>9.0</span><span>-</span><span>linux</span><span>-</span><span>x64</span><span>/</span><span>bin</span><span>/</span><span>npm </span><span>/</span><span>usr</span><span>/</span><span>local</span><span>/</span><span>bin</span><span>/</span></code></pre> <ol style="font-size: 14px;letter-spacing: normal;white-space: normal;text-align: left;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;padding-left: 1em;color: rgb(63, 63, 63); class="list-paddingleft-1"> <li style="text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.2em 8px;"><p>1. 使用node -v查看是否安装成功</p> <figure style="line-height: 1.75;margin: 1.5em 8px;"> <img class="rich_pages wxw-img" data-imgfileid="100000124" data-ratio="0.18585858585858586" src="/upload/10321aaf515b1ed5148403f72b4d3c82.png" data-type="png" data-w="495" style="line-height: 1.75;border-radius: 4px;display: block;margin: 0.1em auto 0.5em;" title="null"> <figcaption style="text-align: center;line-height: 1.75;color: rgb(136, 136, 136);font-size: 0.8em;"> image.png </figcaption> </figure><h4 style="line-height: 1.75;font-size: 14px;font-weight: bold;margin: 2em 8px 0.5em;color: rgb(15, 76, 129);">2. 安装 Puppeteer 及相关扩展工具</h4></li> <li style="text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.2em 8px;"><p>2. 创建并进入项目目录,会生成node_modules<code style="line-height: 1.75;font-family: Menlo, " operator mono, consolas, monaco, monospace;white-space: nowrap;><span style="color: rgb(230, 192, 123);"><span>cd</span></span><span> </span><span>/</span><span>home</span><br><span style="color: rgb(230, 192, 123);"><span>mkdir</span></span><span> puppeteer</span><br><span style="color: rgb(230, 192, 123);"><span>cd</span></span><span> puppeteer</span></code></p></li> <li style="text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.2em 8px;"><p>3. 安装 puppeteer,express 与 html-minifier</p></li> </ol> <pre style="color: rgb(171, 178, 191);background: rgb(40, 44, 52);font-size: 14px;letter-spacing: normal;text-align: left;line-height: 1.5;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;overflow-x: auto;border-radius: 8px;padding: 1em;margin: 10px 8px;><code style="line-height: 1.75;font-family: Menlo, " operator mono, consolas, monaco, monospace;white-space: nowrap;><span>npm install puppeteer </span><span>--</span><span>save</span><br><span>npm install express</span><br><span>npm install html</span><span>-</span><span>minifier</span></code></pre> <ol style="font-size: 14px;letter-spacing: normal;white-space: normal;text-align: left;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;padding-left: 1em;color: rgb(63, 63, 63); class="list-paddingleft-1"> <li style="text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.2em 8px;"><p>1. 安装依赖库</p></li> </ol> <pre style="color: rgb(171, 178, 191);background: rgb(40, 44, 52);font-size: 14px;letter-spacing: normal;text-align: left;line-height: 1.5;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;overflow-x: auto;border-radius: 8px;padding: 1em;margin: 10px 8px;><code style="line-height: 1.75;font-family: Menlo, " operator mono, consolas, monaco, monospace;white-space: nowrap;><span>yum install pango</span><span>.</span><span>x86_64 libXcomposite</span><span>.</span><span>x86_64 libXcursor</span><span>.</span><span>x86_64 libXdamage</span><span>.</span><span>x86_64 libXext</span><span>.</span><span>x86</span></code></pre> <h4 style="font-size: 14px;letter-spacing: normal;white-space: normal;text-align: left;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;font-weight: bold;margin: 2em 8px 0.5em;color: rgb(15, 76, 129);>3. 创建服务器端运行脚本</h4> <ol style="font-size: 14px;letter-spacing: normal;white-space: normal;text-align: left;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;padding-left: 1em;color: rgb(63, 63, 63); class="list-paddingleft-1"> <li style="text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.2em 8px;"><p>1. 创建渲染请求的页面脚本:spider.js</p></li> </ol> <pre style="color: rgb(171, 178, 191);background: rgb(40, 44, 52);font-size: 14px;letter-spacing: normal;text-align: left;line-height: 1.5;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;overflow-x: auto;border-radius: 8px;padding: 1em;margin: 10px 8px;><code style="line-height: 1.75;font-family: Menlo, " operator mono, consolas, monaco, monospace;white-space: nowrap;><span>const puppeteer </span><span>=</span><span> require</span><span>(</span><span style="color: rgb(152, 195, 121);"><span>'./node_modules/puppeteer'</span></span><span>);//由于目录不一致,所以使用的是绝对路径</span><br><span>const WSE_LIST </span><span>=</span><span> require</span><span>(</span><span style="color: rgb(152, 195, 121);"><span>'./puppeteer-pool.js'</span></span><span>);</span><span> </span><span>//这里注意文件的路径和文件名</span><br><span>const spider </span><span>=</span><span> async </span><span>(</span><span>url</span><span>)</span><span> </span><span>=></span><span> </span><span>{</span><br><span> </span><span style="color: rgb(230, 192, 123);"><span>let</span></span><span> tmp </span><span>=</span><span> </span><span>Math</span><span>.</span><span>floor</span><span>(</span><span>Math</span><span>.</span><span>random</span><span>()</span><span> </span><span>*</span><span> WSE_LIST</span><span>.</span><span>length</span><span>);</span><br><span> </span><span>//随机获取浏览器</span><br><span> </span><span style="color: rgb(230, 192, 123);"><span>let</span></span><span> browserWSEndpoint </span><span>=</span><span> WSE_LIST</span><span>[</span><span>tmp</span><span>];</span><br><span> </span><span>//连接</span><br><span> const browser </span><span>=</span><span> await puppeteer</span><span>.</span><span>connect</span><span>({</span><br><span> browserWSEndpoint</span><br><span> </span><span>});</span><br><span> </span><br><span> </span><span>//打开一个标签页</span><br><span> var page </span><span>=</span><span> await browser</span><span>.</span><span>newPage</span><span>();</span><br><span> </span><br><span> </span><span>//</span><span> </span><span>Intercept</span><span> network requests</span><span>.</span><br><span> await page</span><span>.</span><span>setRequestInterception</span><span>(</span><span style="color: rgb(86, 182, 194);"><span>true</span></span><span>);</span><br><br><span> page</span><span>.</span><span>on</span><span>(</span><span style="color: rgb(152, 195, 121);"><span>'request'</span></span><span>,</span><span> req </span><span>=></span><span> </span><span>{</span><br><span> </span><span>//</span><span> </span><span>Ignore</span><span> requests </span><span style="color: rgb(198, 120, 221);"><span>for</span></span><span> resources that don</span><span style="color: rgb(152, 195, 121);"><span>'t produce DOM</span><br><span> // (images, stylesheets, media).</span><br><span> const whitelist = ['</span></span><span>document</span><span style="color: rgb(152, 195, 121);"><span>', '</span></span><span>script</span><span style="color: rgb(152, 195, 121);"><span>', '</span></span><span>xhr</span><span style="color: rgb(152, 195, 121);"><span>', '</span></span><span>fetch</span><span style="color: rgb(152, 195, 121);"><span>'];</span><br><span> if (!whitelist.includes(req.resourceType())) {</span><br><span> return req.abort();</span><br><span> }</span><br><span> </span><br><span> // Pass through all other requests.</span><br><span> req.continue();</span><br><span> });</span><br><span> </span><br><span> //打开网页</span><br><span> await page.goto(url, {</span><br><span> timeout: 20000, //连接超时时间,单位ms</span><br><span> waitUntil: '</span></span><span>networkidle0</span><span style="color: rgb(152, 195, 121);"><span>' //网络空闲说明已加载完毕</span><br><span> });</span><br><span> </span><br><span> //获取渲染好的页面源码。不建议使用await page.content();获取页面,因为在我测试中发现,页面还没有完全加载。就获取到了。页面源码不完整。也就是动态路由没有加载。vue路由也配置了history模式</span><br><span> let html = await page.evaluate(() => {</span><br><span> return document.getElementsByTagName('</span></span><span>html</span><span style="color: rgb(152, 195, 121);"><span>')[0].outerHTML;</span><br><span> });</span><br><span> await page.close();</span><br><span> return html;</span><br><span>}</span><br><br><span>module.exports = spider;</span><br></span></code></pre> <ol style="font-size: 14px;letter-spacing: normal;white-space: normal;text-align: left;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;padding-left: 1em;color: rgb(63, 63, 63); class="list-paddingleft-1"> <li style="text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.2em 8px;"><p>1. 创建优化puppeteer性能角本,默认不加载一些多余的功能,提高访问效率:puppeteer-pool.js</p></li> </ol> <pre style="color: rgb(171, 178, 191);background: rgb(40, 44, 52);font-size: 14px;letter-spacing: normal;text-align: left;line-height: 1.5;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;overflow-x: auto;border-radius: 8px;padding: 1em;margin: 10px 8px;><code style="line-height: 1.75;font-family: Menlo, " operator mono, consolas, monaco, monospace;white-space: nowrap;><span>const puppeteer </span><span>=</span><span> require</span><span>(</span><span style="color: rgb(152, 195, 121);"><span>'./node_modules/puppeteer'</span></span><span>);</span><br><span>const MAX_WSE </span><span>=</span><span> </span><span>2</span><span>;</span><span> </span><span>//启动几个浏览器</span><span> </span><br><span style="color: rgb(230, 192, 123);"><span>let</span></span><span> WSE_LIST </span><span>=</span><span> </span><span>[];</span><span> </span><span>//存储</span><span>browserWSEndpoint</span><span>列表</span><br><span>//负载均衡</span><br><span>(</span><span>async </span><span>()</span><span> </span><span>=></span><span> </span><span>{</span><br><span> </span><span style="color: rgb(198, 120, 221);"><span>for</span></span><span> </span><span>(</span><span>var i </span><span>=</span><span> </span><span>0</span><span>;</span><span> i </span><span><</span><span> MAX_WSE</span><span>;</span><span> i</span><span>++)</span><span> </span><span>{</span><br><span> const browser </span><span>=</span><span> await puppeteer</span><span>.</span><span>launch</span><span>({</span><br><span> </span><span>//无头模式</span><br><span> headless</span><span>:</span><span> </span><span style="color: rgb(86, 182, 194);"><span>true</span></span><span>,</span><br><span> </span><span>//参数</span><br><span> args</span><span>:</span><span> </span><span>[</span><br><span> </span><span style="color: rgb(152, 195, 121);"><span>'--disable-gpu'</span></span><span>,</span><br><span> </span><span style="color: rgb(152, 195, 121);"><span>'--disable-dev-shm-usage'</span></span><span>,</span><br><span> </span><span style="color: rgb(152, 195, 121);"><span>'--disable-setuid-sandbox'</span></span><span>,</span><br><span> </span><span style="color: rgb(152, 195, 121);"><span>'--no-first-run'</span></span><span>,</span><br><span> </span><span style="color: rgb(152, 195, 121);"><span>'--no-sandbox'</span></span><span>,</span><br><span> </span><span style="color: rgb(152, 195, 121);"><span>'--no-zygote'</span></span><span>,</span><br><span> </span><span style="color: rgb(152, 195, 121);"><span>'--single-process'</span></span><br><span> </span><span>],</span><br><span> </span><span>//一般不需要配置这条,除非启动一直报错找不到谷歌浏览器</span><br><span> </span><span>//</span><span>executablePath</span><span>:</span><span style="color: rgb(152, 195, 121);"><span>'chrome.exe在你本机上的路径,例如C:/Program Files/Google/chrome.exe'</span></span><br><span> </span><span>});</span><br><span> </span><span style="color: rgb(230, 192, 123);"><span>let</span></span><span> browserWSEndpoint </span><span>=</span><span> await browser</span><span>.</span><span>wsEndpoint</span><span>();</span><br><span> WSE_LIST</span><span>.</span><span>push</span><span>(</span><span>browserWSEndpoint</span><span>);</span><br><span> </span><span>}</span><br><span>})();</span><br><br><span>module</span><span>.</span><span>exports </span><span>=</span><span> WSE_LIST</span></code></pre> <ol style="font-size: 14px;letter-spacing: normal;white-space: normal;text-align: left;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;padding-left: 1em;color: rgb(63, 63, 63); class="list-paddingleft-1"> <li style="text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.2em 8px;"><p>1. 创建服务端启动脚本:service.js 需要和spider.js放在一个目录 ==https://www.shiyit.com需要替换成你自己的域名==</p></li> </ol> <pre style="color: rgb(171, 178, 191);background: rgb(40, 44, 52);font-size: 14px;letter-spacing: normal;text-align: left;line-height: 1.5;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;overflow-x: auto;border-radius: 8px;padding: 1em;margin: 10px 8px;><code style="line-height: 1.75;font-family: Menlo, " operator mono, consolas, monaco, monospace;white-space: nowrap;><span>const express </span><span>=</span><span> require</span><span>(</span><span style="color: rgb(152, 195, 121);"><span>'./node_modules/express'</span></span><span>);</span><br><span>var app </span><span>=</span><span> express</span><span>();</span><br><span>var spider </span><span>=</span><span> require</span><span>(</span><span style="color: rgb(152, 195, 121);"><span>"./spider.js"</span></span><span>);</span><br><span>var minify </span><span>=</span><span> require</span><span>(</span><span style="color: rgb(152, 195, 121);"><span>'html-minifier'</span></span><span>).</span><span>minify</span><span>;</span><br><span>app</span><span>.</span><span>get</span><span>(</span><span style="color: rgb(152, 195, 121);"><span>'*'</span></span><span>,</span><span> async </span><span>(</span><span>req</span><span>,</span><span> res</span><span>)</span><span> </span><span>=></span><span> </span><span>{</span><br><span> </span><span style="color: rgb(230, 192, 123);"><span>let</span></span><span> url </span><span>=</span><span> </span><span style="color: rgb(152, 195, 121);"><span>"https://www.shiyit.com"</span></span><span> </span><span>+</span><span> req</span><span>.</span><span>originalUrl</span><span>;</span><br><span> console</span><span>.</span><span>log</span><span>(</span><span style="color: rgb(152, 195, 121);"><span>'请求的完整URL:'</span></span><span> </span><span>+</span><span> url</span><span>);</span><br><span> </span><span style="color: rgb(230, 192, 123);"><span>let</span></span><span> content </span><span>=</span><span> await spider</span><span>(</span><span>url</span><span>).</span><span>catch</span><span>((</span><span>error</span><span>)</span><span> </span><span>=></span><span> </span><span>{</span><br><span> console</span><span>.</span><span>log</span><span>(</span><span>error</span><span>);</span><br><span> res</span><span>.</span><span>send</span><span>(</span><span style="color: rgb(152, 195, 121);"><span>'获取html内容失败'</span></span><span>);</span><br><span> </span><span style="color: rgb(230, 192, 123);"><span>return</span></span><span>;</span><br><span> </span><span>});</span><br><span> </span><span>//</span><span> </span><span>通过</span><span>minify</span><span>库压缩代码</span><br><span> content</span><span>=</span><span>minify</span><span>(</span><span>content</span><span>,{</span><span>removeComments</span><span>:</span><span> </span><span style="color: rgb(86, 182, 194);"><span>true</span></span><span>,</span><span>collapseWhitespace</span><span>:</span><span> </span><span style="color: rgb(86, 182, 194);"><span>true</span></span><span>,</span><span>minifyJS</span><span>:</span><span style="color: rgb(86, 182, 194);"><span>true</span></span><span>,</span><span> minifyCSS</span><span>:</span><span style="color: rgb(86, 182, 194);"><span>true</span></span><span>});</span><br><span> res</span><span>.</span><span>send</span><span>(</span><span>content</span><span>);</span><br><span>});</span><br><span>app</span><span>.</span><span>listen</span><span>(</span><span>3000</span><span>,</span><span> </span><span>()</span><span> </span><span>=></span><span> </span><span>{</span><br><span> console</span><span>.</span><span>log</span><span>(</span><span style="color: rgb(152, 195, 121);"><span>'服务已启动!'</span></span><span>);</span><br><span>});</span></code></pre> <ol style="font-size: 14px;letter-spacing: normal;white-space: normal;text-align: left;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;padding-left: 1em;color: rgb(63, 63, 63); class="list-paddingleft-1"> <li style="text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.2em 8px;"><p>1. 执行启动puppeteer命令</p></li> </ol> <pre style="color: rgb(171, 178, 191);background: rgb(40, 44, 52);font-size: 14px;letter-spacing: normal;text-align: left;line-height: 1.5;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;overflow-x: auto;border-radius: 8px;padding: 1em;margin: 10px 8px;><code style="line-height: 1.75;font-family: Menlo, " operator mono, consolas, monaco, monospace;white-space: nowrap;><span style="color: rgb(230, 192, 123);"><span>nohup</span></span><span> node service</span><span>.</span><span>js </span><span>&</span></code></pre> <p style="font-size: 14px;white-space: normal;text-align: left;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;margin: 1.5em 8px;letter-spacing: 0.1em;color: rgb(63, 63, 63);>启动成功后,可以通过tail -f nohup.out查看日志,出现服务已启动!则代表运行成功,不过极大几率会不成功,因为我就没有成功,出现了错误,贴上常见的几种错误以及解决方法。要注意,一定要出现服务已启动这几个字外,没有其他任何东西才算启动成功</p> <ul style="font-size: 14px;letter-spacing: normal;white-space: normal;text-align: left;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;padding-left: 1em;list-style: circle;color: rgb(63, 63, 63); class="list-paddingleft-1"> <li style="text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.2em 8px;"><p>• /node_modules/puppeteer/.local-chromium/linux-856583/chrome-linux/chrome: error while loading shared libraries: libatk-1.0.so.0: cannot open shared object file: No such file or directory</p></li> </ul> <pre style="color: rgb(171, 178, 191);background: rgb(40, 44, 52);font-size: 14px;letter-spacing: normal;text-align: left;line-height: 1.5;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;overflow-x: auto;border-radius: 8px;padding: 1em;margin: 10px 8px;><code style="line-height: 1.75;font-family: Menlo, " operator mono, consolas, monaco, monospace;white-space: nowrap;><span>yum install atk </span><span>-</span><span>y</span></code></pre> <ul style="font-size: 14px;letter-spacing: normal;white-space: normal;text-align: left;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;padding-left: 1em;list-style: circle;color: rgb(63, 63, 63); class="list-paddingleft-1"> <li style="text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.2em 8px;"><p>• /node_modules/puppeteer/.local-chromium/linux-856583/chrome-linux/chrome: error while loading shared libraries: libatk-bridge-2.0.so.0: cannot open shared object file: No such file or directory</p></li> </ul> <pre style="color: rgb(171, 178, 191);background: rgb(40, 44, 52);font-size: 14px;letter-spacing: normal;text-align: left;line-height: 1.5;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;overflow-x: auto;border-radius: 8px;padding: 1em;margin: 10px 8px;><code style="line-height: 1.75;font-family: Menlo, " operator mono, consolas, monaco, monospace;white-space: nowrap;><span>yum install at</span><span>-</span><span>spi2</span><span>-</span><span>atk</span></code></pre> <ul style="font-size: 14px;letter-spacing: normal;white-space: normal;text-align: left;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;padding-left: 1em;list-style: circle;color: rgb(63, 63, 63); class="list-paddingleft-1"> <li style="text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.2em 8px;"><p>• /node_modules/puppeteer/.local-chromium/linux-856583/chrome-linux/chrome: error while loading shared libraries: libxkbcommon.so.0: cannot open shared object file: No such file or directory</p></li> </ul> <pre style="color: rgb(171, 178, 191);background: rgb(40, 44, 52);font-size: 14px;letter-spacing: normal;text-align: left;line-height: 1.5;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;overflow-x: auto;border-radius: 8px;padding: 1em;margin: 10px 8px;><code style="line-height: 1.75;font-family: Menlo, " operator mono, consolas, monaco, monospace;white-space: nowrap;><span>yum install libxkbcommon</span><span>-</span><span>x11</span><span>-</span><span>devel</span></code></pre> <ul style="font-size: 14px;letter-spacing: normal;white-space: normal;text-align: left;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;padding-left: 1em;list-style: circle;color: rgb(63, 63, 63); class="list-paddingleft-1"> <li style="text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.2em 8px;"><p>• /node_modules/puppeteer/.local-chromium/linux-856583/chrome-linux/chrome: error while loading shared libraries: libXcomposite.so.1: cannot open shared object file: No such file or directory<code style="line-height: 1.75;font-family: Menlo, " operator mono, consolas, monaco, monospace;white-space: nowrap;>yum install libXcomposite</code></p></li> <li style="text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.2em 8px;"><p>• /home/work/node_modules/puppeteer/.local-chromium/linux-856583/chrome-linux/chrome: error while loading shared libraries: libgtk-3.so.0: cannot open shared object file: No such file or directory</p></li> </ul> <pre style="color: rgb(171, 178, 191);background: rgb(40, 44, 52);font-size: 14px;letter-spacing: normal;text-align: left;line-height: 1.5;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;overflow-x: auto;border-radius: 8px;padding: 1em;margin: 10px 8px;><code style="line-height: 1.75;font-family: Menlo, " operator mono, consolas, monaco, monospace;white-space: nowrap;>yum install gtk3</code></pre> <h4 style="font-size: 14px;letter-spacing: normal;white-space: normal;text-align: left;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;font-weight: bold;margin: 2em 8px 0.5em;color: rgb(15, 76, 129);>4. 配置Nginx</h4> <ol style="font-size: 14px;letter-spacing: normal;white-space: normal;text-align: left;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;padding-left: 1em;color: rgb(63, 63, 63); class="list-paddingleft-1"> <li style="text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.2em 8px;"><p>1. docker 或直接安装nginx 如果使用的是docker或直接安装的nginx,则在配置文件添加如下代码:</p></li> </ol> <pre style="color: rgb(171, 178, 191);background: rgb(40, 44, 52);font-size: 14px;letter-spacing: normal;text-align: left;line-height: 1.5;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;overflow-x: auto;border-radius: 8px;padding: 1em;margin: 10px 8px;><code style="line-height: 1.75;font-family: Menlo, " operator mono, consolas, monaco, monospace;white-space: nowrap;><span>location </span><span>/</span><span> </span><span>{</span><br><br><span> proxy_set_header </span><span>Host</span><span> </span><span style="color: rgb(209, 154, 102);"><span>$host</span></span><span>:</span><span style="color: rgb(209, 154, 102);"><span>$proxy_port</span></span><span>;</span><br><span> proxy_set_header X</span><span>-</span><span>Real</span><span>-</span><span>IP </span><span style="color: rgb(209, 154, 102);"><span>$remote_addr</span></span><span>;</span><br><span> proxy_set_header X</span><span>-</span><span>Forwarded</span><span>-</span><span>For</span><span> </span><span style="color: rgb(209, 154, 102);"><span>$proxy_add_x_forwarded_for</span></span><span>;</span><br><br><span> </span><span style="color: rgb(198, 120, 221);"><span>if</span></span><span> </span><span>(</span><span style="color: rgb(209, 154, 102);"><span>$http_user_agent</span></span><span> </span><span>~*</span><span> </span><span style="color: rgb(152, 195, 121);"><span>"Baiduspider|twitterbot|facebookexternalhit|rogerbot|linkedinbot|embedly|quora link preview|showyoubot|outbrain|pinterest|slackbot|vkShare|W3C_Validator|bingbot|Sosospider|Sogou Pic Spider|Googlebot|360Spider"</span></span><span>)</span><span> </span><span>{</span><br><span> proxy_pass http</span><span>://</span><span>127.0</span><span>.</span><span>0.1</span><span>:</span><span>3000</span><span>;</span><br><span> </span><span>}</span><br><br><span> </span><br><span> index index</span><span>.</span><span>html index</span><span>.</span><span>htm</span><span>;</span><br><span> try_files </span><span style="color: rgb(209, 154, 102);"><span>$uri</span></span><span> </span><span style="color: rgb(209, 154, 102);"><span>$uri</span></span><span>/</span><span> </span><span>/</span><span>index</span><span>.</span><span>html</span><span>;</span><br><span>}</span><br></code></pre> <ol style="font-size: 14px;letter-spacing: normal;white-space: normal;text-align: left;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;padding-left: 1em;color: rgb(63, 63, 63); class="list-paddingleft-1"> <li style="text-align: left;line-height: 1.75;text-indent: -1em;display: block;margin: 0.2em 8px;"><p>1. 宝塔部署的nginx 选择你的主页网站,点设置进入在选择伪静态,在里面添上如下代码:</p></li> </ol> <pre style="color: rgb(171, 178, 191);background: rgb(40, 44, 52);font-size: 14px;letter-spacing: normal;text-align: left;line-height: 1.5;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;overflow-x: auto;border-radius: 8px;padding: 1em;margin: 10px 8px;><code style="line-height: 1.75;font-family: Menlo, " operator mono, consolas, monaco, monospace;white-space: nowrap;><span>location </span><span>/</span><span> </span><span>{</span><br><span> proxy_set_header </span><span>Host</span><span> </span><span style="color: rgb(209, 154, 102);"><span>$host</span></span><span>:</span><span style="color: rgb(209, 154, 102);"><span>$proxy_port</span></span><span>;</span><br><span> proxy_set_header X</span><span>-</span><span>Real</span><span>-</span><span>IP </span><span style="color: rgb(209, 154, 102);"><span>$remote_addr</span></span><span>;</span><br><span> proxy_set_header X</span><span>-</span><span>Forwarded</span><span>-</span><span>For</span><span> </span><span style="color: rgb(209, 154, 102);"><span>$proxy_add_x_forwarded_for</span></span><span>;</span><br><br><span> </span><span style="color: rgb(198, 120, 221);"><span>if</span></span><span> </span><span>(</span><span style="color: rgb(209, 154, 102);"><span>$http_user_agent</span></span><span> </span><span>~*</span><span> </span><span style="color: rgb(152, 195, 121);"><span>"Baiduspider|twitterbot|facebookexternalhit|rogerbot|linkedinbot|embedly|quora link preview|showyoubot|outbrain|pinterest|slackbot|vkShare|W3C_Validator|bingbot|Sosospider|Sogou Pic Spider|Googlebot|360Spider"</span></span><span>)</span><span> </span><span>{</span><br><span> proxy_pass http</span><span>://</span><span>127.0</span><span>.</span><span>0.1</span><span>:</span><span>3000</span><span>;</span><br><span> </span><span>}</span><br><br><span> index index</span><span>.</span><span>html index</span><span>.</span><span>htm</span><span>;</span><br><span> try_files </span><span style="color: rgb(209, 154, 102);"><span>$uri</span></span><span> </span><span style="color: rgb(209, 154, 102);"><span>$uri</span></span><span>/</span><span> </span><span>/</span><span>index</span><span>.</span><span>html</span><span>;</span><br><br><span> </span><span style="color: rgb(198, 120, 221);"><span>if</span></span><span> </span><span>(!-</span><span>e </span><span style="color: rgb(209, 154, 102);"><span>$request_filename</span></span><span>)</span><span> </span><span>{</span><br><span> rewrite </span><span>^(.*)</span><span>$ </span><span>/</span><span>index</span><span>.</span><span>html</span><span>?</span><span>s</span><span>=/</span><span style="color: rgb(209, 154, 102);"><span>$1</span></span><span> last</span><span>;</span><br><span> </span><span style="color: rgb(230, 192, 123);"><span>break</span></span><span>;</span><br><span> </span><span>}</span><br><span>}</span></code></pre> <h4 style="font-size: 14px;letter-spacing: normal;white-space: normal;text-align: left;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;font-weight: bold;margin: 2em 8px 0.5em;color: rgb(15, 76, 129);>测试</h4> <p style="font-size: 14px;white-space: normal;text-align: left;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;margin: 1.5em 8px;letter-spacing: 0.1em;color: rgb(63, 63, 63);>通过以上步骤后,我们就可以来测试一下了,使用apipost来测试</p> <p><span style="color: rgb(0, 0, 0);font-family: " microsoft yahei;font-size: 14px;letter-spacing: normal;text-align: start;>这里通过输入我们的文章详情页,可以看到没配置User-Agent前是显示的首页</span></p> <figure style="font-size: 14px;letter-spacing: normal;white-space: normal;text-align: left;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;margin: 1.5em 8px;color: rgb(63, 63, 63);> <img class="rich_pages wxw-img" data-imgfileid="100000125" data-ratio="0.591225626740947" src="/upload/13756c7471f9b56db679e1b84778899f.png" data-type="png" data-w="1436" style="line-height: 1.75;border-radius: 4px;display: block;margin: 0.1em auto 0.5em;" title="null"> <figcaption style="text-align: center;line-height: 1.75;color: rgb(136, 136, 136);font-size: 0.8em;"> image.png </figcaption> </figure> <p><span style="color: rgb(0, 0, 0);font-family: " microsoft yahei;font-size: 14px;letter-spacing: normal;text-align: start;>配置User-Agent后,可以看到显示了其他的东西,至此seo就配置成功了</span></p> <figure style="font-size: 14px;letter-spacing: normal;white-space: normal;text-align: left;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;margin: 1.5em 8px;color: rgb(63, 63, 63);> <img class="rich_pages wxw-img" data-imgfileid="100000126" data-ratio="0.5977318212141428" src="/upload/37d96f580b6daf143dc57d7a9760e439.png" data-type="png" data-w="1499" style="line-height: 1.75;border-radius: 4px;display: block;margin: 0.1em auto 0.5em;" title="null"> <figcaption style="text-align: center;line-height: 1.75;color: rgb(136, 136, 136);font-size: 0.8em;"> image.png </figcaption> </figure> <p style="font-size: 14px;white-space: normal;text-align: left;line-height: 1.75;font-family: -apple-system-font, BlinkMacSystemFont, " helvetica neue, pingfang sc, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;margin: 1.5em 8px;letter-spacing: 0.1em;color: rgb(63, 63, 63);>还要注意一点的就是service.js文件运行启动后,可能会出现3000端口被占用,所以需要更改里面的端口换成其他即可</p> <p><br></p> <p style="display: none;"> <mp-style-type data-value="3"></mp-style-type></p>
作者:微信小助手
<section data-tool="mdnice编辑器" data-website="https://www.mdnice.com" style="color: black;letter-spacing: 0px;white-space: normal;font-size: 16px;padding-right: 10px;padding-left: 10px;line-height: 1.6;word-break: break-word;text-align: left;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, " pingfang sc, cambria, cochin, georgia, times, times new roman, serif;margin-bottom: 24px; data-mpa-powered-by="yiban.io"> <section class="mp_profile_iframe_wrp"> <mp-common-profile class="js_uneditable custom_select_card mp_profile_iframe" data-pluginname="mpprofile" data-id="Mzg2NTc1NDM1MA==" data-headimg="http://mmbiz.qpic.cn/mmbiz_png/qM9Jiat4uNGQibvG1jm9jUfdx6wOrhqp541OnRXwu2uLe2fGIZhZMtagg4SeBoAMe2W73dzHMkHAXMYOg3Q43Tfw/0?wx_fmt=png" data-nickname="编程技术汇" data-alias="" data-signature="汇总最实用的,最有趣的,最新鲜的热门技术。" data-from="0" data-is_biz_ban="0" data-service_type="1"></mp-common-profile> </section> <h2 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;border-bottom: 2px solid rgb(239, 112, 96);font-size: 1.3em;"><span style="display: inline-block;background: rgb(239, 112, 96);color: rgb(255, 255, 255);padding: 3px 10px 1px;border-top-right-radius: 3px;border-top-left-radius: 3px;margin-right: 3px;">分支命名</span><span style="display: inline-block;vertical-align: bottom;border-bottom: 36px solid rgb(239, 235, 233);border-right: 20px solid transparent;"></span></h2> <h3 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;font-size: 20px;">master 分支</h3> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">master 为主分支,也是用于部署生产环境的分支,需要确保master分支稳定性。master 分支一般由 release 以及 hotfix 分支合并,任何时间都不能直接修改代码。</p> <h3 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;font-size: 20px;">develop 分支</h3> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">develop 为开发环境分支,始终保持最新完成以及bug修复后的代码,用于前后端联调。一般开发的新功能时,feature分支都是基于develop分支创建的。</p> <h3 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;font-size: 20px;">feature 分支</h3> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">开发新功能时,以develop为基础创建feature分支。</p> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">分支命名时以 <code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: " operator mono, consolas, monaco, menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);>feature/</code> 开头,后面可以加上开发的功能模块, 命名示例:<code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: " operator mono, consolas, monaco, menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);>feature/user_module</code>、<code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: " operator mono, consolas, monaco, menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);>feature/cart_module</code></p> <h3 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;font-size: 20px;">test分支</h3> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">test为测试环境分支,外部用户无法访问,专门给测试人员使用,版本相对稳定。</p> <h3 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;font-size: 20px;">release分支</h3> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">release 为预上线分支(预发布分支),UAT测试阶段使用。一般由 test 或 hotfix 分支合并,不建议直接在 release 分支上直接修改代码。</p> <h3 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;font-size: 20px;">hotfix 分支</h3> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">线上出现紧急问题时,需要及时修复,以master分支为基线,创建hotfix分支。修复完成后,需要合并到 master 分支和 develop 分支。</p> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">分支命名以<code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: " operator mono, consolas, monaco, menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);>hotfix/</code> 开头的为修复分支,它的命名规则与 feature 分支类似。</p> <h2 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;border-bottom: 2px solid rgb(239, 112, 96);font-size: 1.3em;"><span style="display: inline-block;background: rgb(239, 112, 96);color: rgb(255, 255, 255);padding: 3px 10px 1px;border-top-right-radius: 3px;border-top-left-radius: 3px;margin-right: 3px;">分支与环境对应关系</span><span style="display: inline-block;vertical-align: bottom;border-bottom: 36px solid rgb(239, 235, 233);border-right: 20px solid transparent;"></span></h2> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">在系统开发过程中常用的环境:</p> <ul data-tool="mdnice编辑器" style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> DEV 环境(Development environment):用于开发者调试使用 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> FAT环境(Feature Acceptance Test environment):功能验收测试环境,用于测试环境下的软件测试者测试使用 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> UAT环境 (User Acceptance Test environment):用户验收测试环境,用于生产环境下的软件测试者测试使用 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> PRO 环境(Production environment):生产环境 </section></li> </ul> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">对应关系:</p> <section data-tool="mdnice编辑器" style="overflow-x: auto;"> <table> <thead> <tr style="border-width: 1px 0px 0px;border-right-style: initial;border-bottom-style: initial;border-left-style: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: initial;border-top-style: solid;border-top-color: rgb(204, 204, 204);background-color: white;"> <th style="border-top-width: 1px;border-color: rgb(204, 204, 204);text-align: left;background-color: rgb(240, 240, 240);min-width: 85px;">分支</th> <th style="border-top-width: 1px;border-color: rgb(204, 204, 204);text-align: left;background-color: rgb(240, 240, 240);min-width: 85px;">功能</th> <th style="border-top-width: 1px;border-color: rgb(204, 204, 204);text-align: left;background-color: rgb(240, 240, 240);min-width: 85px;">环境</th> <th style="border-top-width: 1px;border-color: rgb(204, 204, 204);text-align: left;background-color: rgb(240, 240, 240);min-width: 85px;">可访问</th> </tr> </thead> <tbody style="border-width: 0px;border-style: initial;border-color: initial;"> <tr style="border-width: 1px 0px 0px;border-right-style: initial;border-bottom-style: initial;border-left-style: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: initial;border-top-style: solid;border-top-color: rgb(204, 204, 204);background-color: white;"> <td style="border-color: rgb(204, 204, 204);min-width: 85px;">master</td> <td style="border-color: rgb(204, 204, 204);min-width: 85px;">主分支,稳定版本</td> <td style="border-color: rgb(204, 204, 204);min-width: 85px;">PRO</td> <td style="border-color: rgb(204, 204, 204);min-width: 85px;">是</td> </tr> <tr style="border-width: 1px 0px 0px;border-right-style: initial;border-bottom-style: initial;border-left-style: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: initial;border-top-style: solid;border-top-color: rgb(204, 204, 204);background-color: rgb(248, 248, 248);"> <td style="border-color: rgb(204, 204, 204);min-width: 85px;">develop</td> <td style="border-color: rgb(204, 204, 204);min-width: 85px;">开发分支,最新版本</td> <td style="border-color: rgb(204, 204, 204);min-width: 85px;">DEV</td> <td style="border-color: rgb(204, 204, 204);min-width: 85px;">是</td> </tr> <tr style="border-width: 1px 0px 0px;border-right-style: initial;border-bottom-style: initial;border-left-style: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: initial;border-top-style: solid;border-top-color: rgb(204, 204, 204);background-color: white;"> <td style="border-color: rgb(204, 204, 204);min-width: 85px;">feature</td> <td style="border-color: rgb(204, 204, 204);min-width: 85px;">开发分支,实现新特性</td> <td style="border-color: rgb(204, 204, 204);min-width: 85px;"><br></td> <td style="border-color: rgb(204, 204, 204);min-width: 85px;">否</td> </tr> <tr style="border-width: 1px 0px 0px;border-right-style: initial;border-bottom-style: initial;border-left-style: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: initial;border-top-style: solid;border-top-color: rgb(204, 204, 204);background-color: rgb(248, 248, 248);"> <td style="border-color: rgb(204, 204, 204);min-width: 85px;">test</td> <td style="border-color: rgb(204, 204, 204);min-width: 85px;">测试分支,功能测试</td> <td style="border-color: rgb(204, 204, 204);min-width: 85px;">FAT</td> <td style="border-color: rgb(204, 204, 204);min-width: 85px;">是</td> </tr> <tr style="border-width: 1px 0px 0px;border-right-style: initial;border-bottom-style: initial;border-left-style: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: initial;border-top-style: solid;border-top-color: rgb(204, 204, 204);background-color: white;"> <td style="border-color: rgb(204, 204, 204);min-width: 85px;">release</td> <td style="border-color: rgb(204, 204, 204);min-width: 85px;">预上线分支,发布新版本</td> <td style="border-color: rgb(204, 204, 204);min-width: 85px;">UAT</td> <td style="border-color: rgb(204, 204, 204);min-width: 85px;">是</td> </tr> <tr style="border-width: 1px 0px 0px;border-right-style: initial;border-bottom-style: initial;border-left-style: initial;border-right-color: initial;border-bottom-color: initial;border-left-color: initial;border-top-style: solid;border-top-color: rgb(204, 204, 204);background-color: rgb(248, 248, 248);"> <td style="border-color: rgb(204, 204, 204);min-width: 85px;">hotfix</td> <td style="border-color: rgb(204, 204, 204);min-width: 85px;">紧急修复分支,修复线上bug</td> <td style="border-color: rgb(204, 204, 204);min-width: 85px;"><br></td> <td style="border-color: rgb(204, 204, 204);min-width: 85px;">否</td> </tr> </tbody> </table> </section> <h3 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;font-size: 20px;">分支合并流程规范</h3> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">业界常见的两大主分支(master、develop)、三个辅助分支(feature、release、hotfix)的生命周期:</p> <figure data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;display: flex;flex-direction: column;justify-content: center;align-items: center;"> <img class="rich_pages wxw-img" data-ratio="1.325" src="/upload/73c7b9bd60b7e43a4afc2a5bbfd7be72.png" data-type="png" data-w="600" style="display: block;margin-right: auto;margin-left: auto;" data-imgfileid="100040279"> </figure> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">以上生命周期仅作参考,不同开发团队可能有不同的规范,可自行灵活定义。</p> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">例如我们团队在开发时,至少需要保证以下流程:</p> <ul data-tool="mdnice编辑器" style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> develop 分支和 hotfix 分支,必须从 master 分支检出 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> 由 develop 分支合并到 test 分支 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> 功能测试无误后,由 test 分支合并到 release 分支 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> UAT测试通过后,由 release 分支合并到 master分支 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> 对于工作量小的功能开发(工时小于1天),可以直接在devolop 分支进行开发,否则由 develop 分支检出 feature 分支进行开发,开发完后合并到develop 分支 </section></li> </ul> <h2 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;border-bottom: 2px solid rgb(239, 112, 96);font-size: 1.3em;"><span style="display: inline-block;background: rgb(239, 112, 96);color: rgb(255, 255, 255);padding: 3px 10px 1px;border-top-right-radius: 3px;border-top-left-radius: 3px;margin-right: 3px;">Git Commit Message规范</span><span style="display: inline-block;vertical-align: bottom;border-bottom: 36px solid rgb(239, 235, 233);border-right: 20px solid transparent;"></span></h2> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">Git commit message规范指提交代码时编写的规范注释,编写良好的Commit messages可以达到3个重要的目的:</p> <ul data-tool="mdnice编辑器" style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> 加快代码review的流程 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> 帮助我们编写良好的版本发布日志 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> 让之后的维护者了解代码里出现特定变化和feature被添加的原因 </section></li> </ul> <h3 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;font-size: 20px;">Angular Git Commit Guidelines</h3> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">业界应用的比较广泛的是Angular Git Commit Guidelines:</p> <pre data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;"><span style="display: block;background: url(" https: mmbiz.qpic.cn mmbiz_svg ckbyf6iyns0k9az1yytwjma0zkvwbmxun2eudehxc2ppqtp1niatjroyoygimiulwicuzaea0bhr59ljpnib3behrz6cznmhc7 640?wx_fmt="svg")" 10px 40px no-repeat rgb(40, 44, 52);height: 30px;width: 747px;margin-bottom: -7px;border-radius: 5px;></span><code style="overflow-x: auto;padding: 15px 16px 16px;color: rgb(171, 178, 191);display: -webkit-box;font-family: " operator mono, consolas, monaco, menlo, monospace;font-size: 12px;background: rgb(40, 44, 52);border-radius: 5px;><<span style="color: rgb(230, 192, 123);line-height: 26px;">type</span>>( <scope>): <subject> <br> <blank line> <br> <br> <blank line> <br> </blank line> </blank line> </subject> </scope></code> <footer> <code style="overflow-x: auto;padding: 15px 16px 16px;color: rgb(171, 178, 191);display: -webkit-box;font-family: " operator="" mono,="" consolas,="" monaco,="" menlo,="" monospace;font-size:="" 12px;background:="" rgb(40,="" 44,="" 52);border-radius:="" 5px;=""><br></code> </footer></pre> <ul data-tool="mdnice编辑器" style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> type:提交类型 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> scope:可选项,本次 commit 波及的范围 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> subject:简明扼要的阐述下本次 commit 的主旨,在<code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: " operator mono, consolas, monaco, menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);>Angular Git Commit Guidelines</code>中强调了三点。使用祈使句,首字母不要大写,结尾无需添加标点 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> body: 同样使用祈使句,在主体内容中我们需要把本次 commit 详细的描述一下,比如此次变更的动机 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> footer: 描述下与之关联的 issue 或 break change </section></li> </ul> <h3 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;font-size: 20px;">简易版</h3> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">项目中实际可以采用简易版规范:</p> <pre data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;"><span style="display: block;background: url(" https: mmbiz.qpic.cn mmbiz_svg ckbyf6iyns0k9az1yytwjma0zkvwbmxun2eudehxc2ppqtp1niatjroyoygimiulwicuzaea0bhr59ljpnib3behrz6cznmhc7 640?wx_fmt="svg")" 10px 40px no-repeat rgb(40, 44, 52);height: 30px;width: 747px;margin-bottom: -7px;border-radius: 5px;></span><code style="overflow-x: auto;padding: 15px 16px 16px;color: rgb(171, 178, 191);display: -webkit-box;font-family: " operator mono, consolas, monaco, menlo, monospace;font-size: 12px;background: rgb(40, 44, 52);border-radius: 5px;><<span style="color: rgb(230, 192, 123);line-height: 26px;">type</span>>( <scope>): <subject> <br> </subject> </scope></code></pre> <h3 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;font-size: 20px;">type规范</h3> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;"><code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: " operator mono, consolas, monaco, menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);>Angular Git Commit Guidelines</code>中推荐的type类型如下:</p> <ul data-tool="mdnice编辑器" style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> feat: 新增功能 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> fix: 修复bug </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> docs: 仅文档更改 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> style: 不影响代码含义的更改(空白、格式设置、缺失 分号等) </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> refactor: 既不修复bug也不添加特性的代码更改 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> perf: 改进性能的代码更改 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> test: 添加缺少的测试或更正现有测试 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> chore: 对构建过程或辅助工具和库(如文档)的更改 </section></li> </ul> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">除此之外,还有一些常用的类型:</p> <ul data-tool="mdnice编辑器" style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> delete:删除功能或文件 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> modify:修改功能 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> build:改变构建流程,新增依赖库、工具等(例如webpack、gulp、npm修改) </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> test:测试用例的新增、修改 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> ci:自动化流程配置修改 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> revert:回滚到上一个版本 </section></li> </ul> <h3 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;font-size: 20px;">单次提交注意事项</h3> <ul data-tool="mdnice编辑器" style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> 提交问题必须为同一类别 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> 提交问题不要超过3个 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> 提交的commit发现不符合规范,<code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: " operator mono, consolas, monaco, menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);>git commit --amend -m "新的提交信息"</code>或 <code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: " operator mono, consolas, monaco, menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);>git reset --hard HEAD</code> 重新提交一次 </section></li> </ul> <h2 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;border-bottom: 2px solid rgb(239, 112, 96);font-size: 1.3em;"><span style="display: inline-block;background: rgb(239, 112, 96);color: rgb(255, 255, 255);padding: 3px 10px 1px;border-top-right-radius: 3px;border-top-left-radius: 3px;margin-right: 3px;">配置.gitignore文件</span><span style="display: inline-block;vertical-align: bottom;border-bottom: 36px solid rgb(239, 235, 233);border-right: 20px solid transparent;"></span></h2> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;"><code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: " operator mono, consolas, monaco, menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);>.gitignore</code>是一份用于忽略不必提交的文件的列表,项目中可以根据实际需求统一<code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: " operator mono, consolas, monaco, menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);>.gitignore</code>文件,减少不必要的文件提交和冲突,净化代码库环境。</p> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">通用文件示例:</p> <pre data-tool="mdnice编辑器" style="margin-top: 10px;margin-bottom: 10px;border-radius: 5px;box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;"><span style="display: block;background: url(" https: mmbiz.qpic.cn mmbiz_svg ckbyf6iyns0k9az1yytwjma0zkvwbmxun2eudehxc2ppqtp1niatjroyoygimiulwicuzaea0bhr59ljpnib3behrz6cznmhc7 640?wx_fmt="svg")" 10px 40px no-repeat rgb(40, 44, 52);height: 30px;width: 747px;margin-bottom: -7px;border-radius: 5px;></span><code style="overflow-x: auto;padding: 15px 16px 16px;color: rgb(171, 178, 191);display: -webkit-box;font-family: " operator mono, consolas, monaco, menlo, monospace;font-size: 12px;background: rgb(40, 44, 52);border-radius: 5px;>HELP.md<br>target/<br>!.mvn/wrapper/maven-wrapper.jar<br>!**/src/main/**/target/<br>!**/src/test/**/target/<br><br>### STS ###<br>.apt_generated<br>.classpath<br>.factorypath<br>.project<br>.settings<br>.springBeans<br>.sts4-cache<br><br>### IntelliJ IDEA ###<br>.idea<br>*.iws<br>*.iml<br>*.ipr<br><br>### NetBeans ###<br>/nbproject/private/<br>/nbbuild/<br>/dist/<br>/nbdist/<br>/.nb-gradle/<br>build/<br>!**/src/main/**/build/<br>!**/src/test/**/build/<br><br>### VS Code ###<br>.vscode/<br><br># Log file<br>*.log<br>/logs*<br><br># BlueJ files<br>*.ctxt<br><br># Mobile Tools for Java (J2ME)<br>.mtj.tmp/<br><br># Package Files #<br>*.jar<br>*.war<br>*.ear<br>*.zip<br>*.tar.gz<br>*.rar<br>*.cmd<br></code></pre> <h2 data-tool="mdnice编辑器" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;border-bottom: 2px solid rgb(239, 112, 96);font-size: 1.3em;"><span style="display: inline-block;background: rgb(239, 112, 96);color: rgb(255, 255, 255);padding: 3px 10px 1px;border-top-right-radius: 3px;border-top-left-radius: 3px;margin-right: 3px;">其他</span><span style="display: inline-block;vertical-align: bottom;border-bottom: 36px solid rgb(239, 235, 233);border-right: 20px solid transparent;"></span></h2> <p data-tool="mdnice编辑器" style="padding-top: 8px;padding-bottom: 8px;line-height: 26px;">此外,还有一些其他建议:</p> <ul data-tool="mdnice编辑器" style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> master 分支的每一次更新,都建议打 tag 添加标签,通常为对应版本号,便于管理 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> feature分支、hotfix分支在合并后可以删除,避免分支过多管理混乱 </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;color: rgb(1, 1, 1);"> 每次 pull 代码前,提交本地代码到本地库中,否则可能回出现合并代码出错,导致代码丢失 </section></li> </ul> <figure data-tool="mdnice编辑器" style="-webkit-tap-highlight-color: transparent;margin-top: 10px;margin-bottom: 10px;outline: 0px;color: rgb(0, 0, 0);font-family: Optima, " microsoft yahei, pingfangsc-regular, serif;font-size: 16px;letter-spacing: normal;background-color: rgb(255, 255, 255);display: flex;flex-direction: column;justify-content: center;align-items: center;></figure> </section>
作者:微信小助手
<article> <h2 yne-bulb-block="heading" yne-bulb-level="2" style="white-space:pre-wrap;line-height:1.75;font-size:14px;text-align:left;margin-left:0px;"><span style="font-weight: bold;font-size: 20px;"><span leaf="">多字段搜索场景优化</span></span></h2> <p><span leaf="">多字段搜索的三种场景:</span></p> <ul style="margin:0px;margin-left: 14px;" class="list-paddingleft-1"> <li><span style="font-weight: bold;"><span leaf="">最佳字段(Best Fields) : 多个字段中返回评分最高的</span></span></li> </ul> <p><span leaf="">当字段之间相互竞争,又相互关联。例如,对于博客的 title和 body这样的字段,评分来自最匹配字段</span></p> <ul style="margin:0px;margin-left: 14px;" class="list-paddingleft-1"> <li><span style="font-weight: bold;"><span leaf="">多数字段(Most Fields):匹配多个字段,返回各个字段评分之和</span></span></li> </ul> <p><span leaf="">处理英文内容时的一种常见的手段是,在主字段( English Analyzer),抽取词干,加入同义词,以匹配更多的文档。相同的文本,加入子字段(Standard Analyzer),以提供更加精确的匹配。其他字段作为匹配文档提高相关度的信号,匹配字段越多则越好。</span></p> <ul style="margin:0px;margin-left: 14px;" class="list-paddingleft-1"> <li><span style="font-weight: bold;"><span leaf="">混合字段(Cross Fields): 跨字段匹配,待查询内容在多个字段中都显示</span></span></li> </ul> <p><span leaf="">对于某些实体,例如人名,地址,图书信息。需要在多个字段中确定信息,单个字段只能作为整体的一部分。希望在任何这些列出的字段中找到尽可能多的词。</span></p> <h3 yne-bulb-block="heading" yne-bulb-level="3" style="white-space:pre-wrap;line-height:1.75;font-size:14px;text-align:left;"><span style="font-weight: bold;font-size: inherit;"><span leaf="">最佳字段搜索</span></span></h3> <p><span style="color: rgb(223, 64, 42);"><span leaf="">将任何与任一查询匹配的文档作为结果返回,采用字段上最匹配的评分作为最终评分返回。</span></span></p> <blockquote> <p><span leaf="">官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/8.14/query-dsl-dis-max-query.html</span></p> </blockquote> <p><span leaf="">案例</span></p> <section class="code-snippet__fix code-snippet__js"> <ul class="code-snippet__line-index code-snippet__js"> </ul> <pre class="code-snippet__js" data-lang="css"><code><span leaf=""><span class="code-snippet__plaintext">DELETE /blogs</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">PUT /blogs/_doc/</span><span class="code-snippet__number">1</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> "title": </span><span class="code-snippet__string">"Quick brown rabbits"</span><span class="code-snippet__plaintext">,</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"body"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"Brown rabbits are commonly seen."</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">PUT /blogs/_doc/</span><span class="code-snippet__number">2</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> "title": </span><span class="code-snippet__string">"Keeping pets healthy"</span><span class="code-snippet__plaintext">,</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"body"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"My quick brown fox eats rabbits on a regular basis."</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"># 搜索棕色的狐狸</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">POST /blogs/_search</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> "query": {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> "bool": {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> "should": [</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> { "match": { "title": </span><span class="code-snippet__string">"Brown fox"</span><span class="code-snippet__plaintext"> }},</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> { "match": { "</span><span class="code-snippet__selector-tag">body</span><span class="code-snippet__plaintext">": </span><span class="code-snippet__string">"Brown fox"</span><span class="code-snippet__plaintext"> }}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> ]</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">}</span></span></code></pre> </section> <p><span leaf=""><br></span></p> </article> <article> <p><span style="color: rgb(223, 64, 42);"><span leaf="">思考:查询结果不符合预期,为什么?</span></span></p> <section nodeleaf=""> <img src="/upload/4c5b4ece119156dbf29ec665708cbe73.png" class="rich_pages wxw-img" data-ratio="0.37962962962962965" data-type="png" data-w="1080" height="235" style="width: 620px;height: 235px;" width="620" data-imgfileid="100000274"> </section> <p><span style="font-weight: bold;"><span leaf="">bool should的算法过程:</span></span></p> <ul style="margin:0px;margin-left: 14px;" class="list-paddingleft-1"> <li> <section> <span leaf="">查询should语句中的两个查询</span> </section></li> <li> <section> <span leaf="">加和两个查询的评分</span> </section></li> <li> <section> <span leaf="">乘以匹配语句的总数</span> </section></li> <li> <section> <span leaf="">除以所有语句的总数</span> </section></li> </ul> <p><span style="color: rgb(223, 64, 42);"><span leaf="">上述例子中,title和body属于竞争关系,不应该将分数简单叠加,而是应该找到单个最佳匹配的字段的评分。</span></span></p> <p><span style="color: rgb(223, 64, 42);"><span leaf=""><br></span></span></p> <h4 yne-bulb-block="heading" yne-bulb-level="4" style="white-space:pre-wrap;line-height:1.75;font-size:14px;text-align:left;"><span style="font-weight: bold;font-size: 18px;"><span leaf="">使用dis max query查询</span></span></h4> </article> <section class="code-snippet__fix code-snippet__js"> <ul class="code-snippet__line-index code-snippet__js"> </ul> <pre class="code-snippet__js" data-lang="bash"><code><span leaf=""><span class="code-snippet__plaintext">POST /blogs/_search</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"query"</span><span class="code-snippet__plaintext">: {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"dis_max"</span><span class="code-snippet__plaintext">: {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"queries"</span><span class="code-snippet__plaintext">: [</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> { </span><span class="code-snippet__string">"match"</span><span class="code-snippet__plaintext">: { </span><span class="code-snippet__string">"title"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"Brown fox"</span><span class="code-snippet__plaintext"> }},</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> { </span><span class="code-snippet__string">"match"</span><span class="code-snippet__plaintext">: { </span><span class="code-snippet__string">"body"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"Brown fox"</span><span class="code-snippet__plaintext"> }}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> ]</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">}</span></span></code></pre> </section> <article> <p><span style="font-weight: bold;"><span leaf="">可以通过tie_breaker参数调整</span></span></p> <p><span leaf="">Tie Breaker是一个介于0-1之间的浮点数。</span><span style="color: rgb(223, 64, 42);"><span leaf="">0代表使用最佳匹配;1代表所有语句同等重要。 </span></span></p> <ol style="margin:0px;margin-left: 14px;" class="list-paddingleft-1"> <li> <section> <span leaf="">获得最佳匹配语句的评分_score 。</span> </section></li> <li> <section> <span leaf="">将其他匹配语句的评分与tie_breaker相乘</span> </section></li> <li> <section> <span leaf="">对以上评分求和并规范化</span> </section></li> </ol> <p><span leaf="">最终得分=最佳匹配字段+其他匹配字段*tie_breaker</span></p> </article> <section class="code-snippet__fix code-snippet__js"> <ul class="code-snippet__line-index code-snippet__js"> </ul> <pre class="code-snippet__js" data-lang="bash"><code><span leaf=""><span class="code-snippet__plaintext">POST /blogs/_search</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"query"</span><span class="code-snippet__plaintext">: {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"dis_max"</span><span class="code-snippet__plaintext">: {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"queries"</span><span class="code-snippet__plaintext">: [</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> { </span><span class="code-snippet__string">"match"</span><span class="code-snippet__plaintext">: { </span><span class="code-snippet__string">"title"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"Quick pets"</span><span class="code-snippet__plaintext"> }},</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> { </span><span class="code-snippet__string">"match"</span><span class="code-snippet__plaintext">: { </span><span class="code-snippet__string">"body"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"Quick pets"</span><span class="code-snippet__plaintext"> }}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> ]</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">POST /blogs/_search</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"query"</span><span class="code-snippet__plaintext">: {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"dis_max"</span><span class="code-snippet__plaintext">: {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"queries"</span><span class="code-snippet__plaintext">: [</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> { </span><span class="code-snippet__string">"match"</span><span class="code-snippet__plaintext">: { </span><span class="code-snippet__string">"title"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"Quick pets"</span><span class="code-snippet__plaintext"> }},</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> { </span><span class="code-snippet__string">"match"</span><span class="code-snippet__plaintext">: { </span><span class="code-snippet__string">"body"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"Quick pets"</span><span class="code-snippet__plaintext"> }}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> ],</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"tie_breaker"</span><span class="code-snippet__plaintext">: 0.1</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">}</span></span></code></pre> </section> <section> <span leaf=""><br></span> </section> <article data-content="[{" type:block,id:kwer-1724903217777,name:heading,data:{level:h4},nodes:[{type:text,id:zx7k-1688015027540,leaves:[{text:使用 best_fields 查询,marks:[]}]}],state:{}},{type:block,id:i49g-1690957960790,name:paragraph,data:{version:1},nodes:[{type:text,id:zukf-1690957960791,leaves:[{text:best_fields策略获取最佳匹配字段的得分, final_score =" max(其他匹配字段得分, 最佳匹配字段得分)","marks":[{"type":"color","value":"#F33232"}]}]}],"state":{}},{"type":"block","id":"zfyo-1690960044023","name":"paragraph","data":{"version":1},"nodes":[{"type":"text","id":"kKjL-1690960044021","leaves":[{"text":"采用 best_fields 查询,并添加参数 tie_breaker=0.1,final_score = 其他匹配字段得分 * 0.1 + 最佳匹配字段得分","marks":[{"type":"color","value":"#F33232"}]}]}],"state":{}},{"type":"block","id":"4639-1654862775338","name":"paragraph","data":{"version":1},"nodes":[{"type":"text","id":"cROd-1688015027540","leaves":[{"text":"Best Fields是默认类型,可以不用指定,","marks":[]},{"text":"等价于dis_max查询方式","marks":[{"type":"color","value":"#F33232"}]}]}],"state":{}}]""> <h4 yne-bulb-block="heading" yne-bulb-level="4" style="white-space:pre-wrap;line-height:1.75;font-size:14px;text-align:left;"><span style="font-weight: bold;"><span leaf="">使用 best_fields 查询</span></span></h4> <p><span style="color: rgb(243, 50, 50);"><span leaf="">best_fields策略获取最佳匹配字段的得分, final_score = max(其他匹配字段得分, 最佳匹配字段得分)</span></span></p> <p><span style="color: rgb(243, 50, 50);"><span leaf="">采用 best_fields 查询,并添加参数 tie_breaker=0.1,final_score = 其他匹配字段得分 * 0.1 + 最佳匹配字段得分</span></span></p> <p><span leaf="">Best Fields是默认类型,可以不用指定,</span><span style="color: rgb(243, 50, 50);"><span leaf="">等价于dis_max查询方式</span></span></p> <section class="code-snippet__fix code-snippet__js"> <ul class="code-snippet__line-index code-snippet__js"> </ul> <pre class="code-snippet__js" data-lang="bash"><code><span leaf=""><span class="code-snippet__plaintext">POST /blogs/_search</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"query"</span><span class="code-snippet__plaintext">: {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"multi_match"</span><span class="code-snippet__plaintext">: {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"type"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"best_fields"</span><span class="code-snippet__plaintext">,</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"query"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"Brown fox"</span><span class="code-snippet__plaintext">,</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"fields"</span><span class="code-snippet__plaintext">: [</span><span class="code-snippet__string">"title"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"body"</span><span class="code-snippet__plaintext">],</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"tie_breaker"</span><span class="code-snippet__plaintext">: 0.2</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">}</span></span></code></pre> </section> <article data-content="[{" type:block,id:awxw-1688015175675,name:paragraph,data:{version:1},nodes:[{type:text,id:hr69-1688015027540,leaves:[{text:案例,marks:[{type:bold}]}]}],state:{}}]> <p><span style="font-weight: bold;"><span leaf="">案例</span></span></p> </article> <section class="code-snippet__fix code-snippet__js"> <ul class="code-snippet__line-index code-snippet__js"> </ul> <pre class="code-snippet__js" data-lang="cpp"><code><span leaf=""><span class="code-snippet__plaintext">PUT /employee</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"settings"</span><span class="code-snippet__plaintext"> : {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"index"</span><span class="code-snippet__plaintext"> : {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"analysis.analyzer.default.type"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"ik_max_word"</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">POST /employee/_bulk</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span><span class="code-snippet__string">"index"</span><span class="code-snippet__plaintext">:{</span><span class="code-snippet__string">"_id"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">1</span><span class="code-snippet__plaintext">}}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span><span class="code-snippet__string">"empId"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"1"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"name"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"员工001"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"age"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">20</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"sex"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"男"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"mobile"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"19000001111"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"salary"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">23343</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"deptName"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"技术部"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"address"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"湖北省武汉市洪山区光谷大厦"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"content"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"i like to write best elasticsearch article"</span><span class="code-snippet__plaintext">}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span><span class="code-snippet__string">"index"</span><span class="code-snippet__plaintext">:{</span><span class="code-snippet__string">"_id"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">2</span><span class="code-snippet__plaintext">}}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span><span class="code-snippet__string">"empId"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"2"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"name"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"员工002"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"age"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">25</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"sex"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"男"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"mobile"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"19000002222"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"salary"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">15963</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"deptName"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"销售部"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"address"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"湖北省武汉市江汉路"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"content"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"i think java is the best programming language"</span><span class="code-snippet__plaintext">}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span><span class="code-snippet__string">"index"</span><span class="code-snippet__plaintext">:{</span><span class="code-snippet__string">"_id"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">3</span><span class="code-snippet__plaintext">}}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span><span class="code-snippet__string">"empId"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"3"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"name"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"员工003"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"age"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">30</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"sex"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"男"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"mobile"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"19000003333"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"salary"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">20000</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"deptName"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"技术部"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"address"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"湖北省武汉市经济开发区"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"content"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"i am only an elasticsearch beginner"</span><span class="code-snippet__plaintext">}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span><span class="code-snippet__string">"index"</span><span class="code-snippet__plaintext">:{</span><span class="code-snippet__string">"_id"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">4</span><span class="code-snippet__plaintext">}}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span><span class="code-snippet__string">"empId"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"4"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"name"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"员工004"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"age"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">20</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"sex"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"女"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"mobile"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"19000004444"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"salary"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">15600</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"deptName"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"销售部"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"address"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"湖北省武汉市沌口开发区"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"content"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"elasticsearch and hadoop are all very good solution, i am a beginner"</span><span class="code-snippet__plaintext">}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span><span class="code-snippet__string">"index"</span><span class="code-snippet__plaintext">:{</span><span class="code-snippet__string">"_id"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">5</span><span class="code-snippet__plaintext">}}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span><span class="code-snippet__string">"empId"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"5"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"name"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"员工005"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"age"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">20</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"sex"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"男"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"mobile"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"19000005555"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"salary"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">19665</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"deptName"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"测试部"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"address"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"湖北省武汉市东湖隧道"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"content"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"spark is best big data solution based on scala, an programming language similar to java"</span><span class="code-snippet__plaintext">}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span><span class="code-snippet__string">"index"</span><span class="code-snippet__plaintext">:{</span><span class="code-snippet__string">"_id"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">6</span><span class="code-snippet__plaintext">}}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span><span class="code-snippet__string">"empId"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"6"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"name"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"员工006"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"age"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">30</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"sex"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"女"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"mobile"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"19000006666"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"salary"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">30000</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"deptName"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"技术部"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"address"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"湖北省武汉市江汉路"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"content"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"i like java developer"</span><span class="code-snippet__plaintext">}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span><span class="code-snippet__string">"index"</span><span class="code-snippet__plaintext">:{</span><span class="code-snippet__string">"_id"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">7</span><span class="code-snippet__plaintext">}}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span><span class="code-snippet__string">"empId"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"7"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"name"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"员工007"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"age"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">60</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"sex"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"女"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"mobile"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"19000007777"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"salary"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">52130</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"deptName"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"测试部"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"address"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"湖北省黄冈市边城区"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"content"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"i like elasticsearch developer"</span><span class="code-snippet__plaintext">}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span><span class="code-snippet__string">"index"</span><span class="code-snippet__plaintext">:{</span><span class="code-snippet__string">"_id"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">8</span><span class="code-snippet__plaintext">}}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span><span class="code-snippet__string">"empId"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"8"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"name"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"员工008"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"age"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">19</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"sex"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"女"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"mobile"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"19000008888"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"salary"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">60000</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"deptName"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"技术部"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"address"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"湖北省武汉市江汉大学"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"content"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"i like spark language"</span><span class="code-snippet__plaintext">}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span><span class="code-snippet__string">"index"</span><span class="code-snippet__plaintext">:{</span><span class="code-snippet__string">"_id"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">9</span><span class="code-snippet__plaintext">}}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span><span class="code-snippet__string">"empId"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"9"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"name"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"员工009"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"age"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">40</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"sex"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"男"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"mobile"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"19000009999"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"salary"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">23000</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"deptName"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"销售部"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"address"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"河南省郑州市郑州大学"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"content"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"i like java developer"</span><span class="code-snippet__plaintext">}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span><span class="code-snippet__string">"index"</span><span class="code-snippet__plaintext">:{</span><span class="code-snippet__string">"_id"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">10</span><span class="code-snippet__plaintext">}}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span><span class="code-snippet__string">"empId"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"10"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"name"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"张湖北"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"age"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">35</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"sex"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"男"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"mobile"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"19000001010"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"salary"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">18000</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"deptName"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"测试部"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"address"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"湖北省武汉市东湖高新"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"content"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"i like java developer, i also like elasticsearch"</span><span class="code-snippet__plaintext">}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span><span class="code-snippet__string">"index"</span><span class="code-snippet__plaintext">:{</span><span class="code-snippet__string">"_id"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">11</span><span class="code-snippet__plaintext">}}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span><span class="code-snippet__string">"empId"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"11"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"name"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"王河南"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"age"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">61</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"sex"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"男"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"mobile"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"19000001011"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"salary"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">10000</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"deptName"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"销售部"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"address"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"河南省开封市河南大学"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"content"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"i am not like java"</span><span class="code-snippet__plaintext">}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span><span class="code-snippet__string">"index"</span><span class="code-snippet__plaintext">:{</span><span class="code-snippet__string">"_id"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">12</span><span class="code-snippet__plaintext">}}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span><span class="code-snippet__string">"empId"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"12"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"name"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"张大学"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"age"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">26</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"sex"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"女"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"mobile"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"19000001012"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"salary"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">11321</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"deptName"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"测试部"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"address"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"河南省开封市河南大学"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"content"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"i am java developer, java is good"</span><span class="code-snippet__plaintext">}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span><span class="code-snippet__string">"index"</span><span class="code-snippet__plaintext">:{</span><span class="code-snippet__string">"_id"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">13</span><span class="code-snippet__plaintext">}}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span><span class="code-snippet__string">"empId"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"13"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"name"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"李江汉"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"age"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">36</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"sex"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"男"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"mobile"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"19000001013"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"salary"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">11215</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"deptName"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"销售部"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"address"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"河南省郑州市二七区"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"content"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"i like java and java is very best, i like it, do you like java"</span><span class="code-snippet__plaintext">}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span><span class="code-snippet__string">"index"</span><span class="code-snippet__plaintext">:{</span><span class="code-snippet__string">"_id"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">14</span><span class="code-snippet__plaintext">}}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span><span class="code-snippet__string">"empId"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"14"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"name"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"王技术"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"age"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">45</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"sex"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"女"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"mobile"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"19000001014"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"salary"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">16222</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"deptName"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"测试部"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"address"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"河南省郑州市金水区"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"content"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"i like c++"</span><span class="code-snippet__plaintext">}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span><span class="code-snippet__string">"index"</span><span class="code-snippet__plaintext">:{</span><span class="code-snippet__string">"_id"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">15</span><span class="code-snippet__plaintext">}}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span><span class="code-snippet__string">"empId"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"15"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"name"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"张测试"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"age"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">18</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"sex"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"男"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"mobile"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"19000001015"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"salary"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__number">20000</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"deptName"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"技术部"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"address"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"河南省郑州市高新开发区"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"content"</span><span class="code-snippet__plaintext">:</span><span class="code-snippet__string">"i think spark is good"</span><span class="code-snippet__plaintext">}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">GET /employee/_search</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"query"</span><span class="code-snippet__plaintext">: {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"multi_match"</span><span class="code-snippet__plaintext">: {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"query"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"elasticsearch beginner 湖北省 开封市"</span><span class="code-snippet__plaintext">,</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"type"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"best_fields"</span><span class="code-snippet__plaintext">,</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"fields"</span><span class="code-snippet__plaintext">: [</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"content"</span><span class="code-snippet__plaintext">,</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"address"</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> ]</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> },</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"size"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__number">15</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span></span></code><code><span leaf=""><span class="code-snippet__plaintext"># 查看执行计划</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">GET /employee/_explain/</span><span class="code-snippet__number">3</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"query"</span><span class="code-snippet__plaintext">: {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"multi_match"</span><span class="code-snippet__plaintext">: {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"query"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"elasticsearch beginner 湖北省 开封市"</span><span class="code-snippet__plaintext">,</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"type"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"best_fields"</span><span class="code-snippet__plaintext">,</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"fields"</span><span class="code-snippet__plaintext">: [</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"content"</span><span class="code-snippet__plaintext">,</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"address"</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> ]</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">GET /employee/_explain/</span><span class="code-snippet__number">3</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"query"</span><span class="code-snippet__plaintext">: {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"multi_match"</span><span class="code-snippet__plaintext">: {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"query"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"elasticsearch beginner 湖北省 开封市"</span><span class="code-snippet__plaintext">,</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"type"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"best_fields"</span><span class="code-snippet__plaintext">,</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"fields"</span><span class="code-snippet__plaintext">: [</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"content"</span><span class="code-snippet__plaintext">,</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"address"</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> ],</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"tie_breaker"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__number">0.1</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">}</span></span></code></pre> </section> <p><span style="color: rgb(243, 50, 50);"><span leaf=""><br></span></span></p> </article> <article data-content="[{" type:block,id:rc45-1724903217779,name:heading,data:{level:h3},nodes:[{type:text,id:nsxc-1690958132534,leaves:[{text:使用多数字段搜索,marks:[{type:bold}]}]}],state:{}},{type:block,id:fqi1-1690957816554,name:paragraph,data:{version:1},nodes:[{type:text,id:svce-1690957816555,leaves:[{text:most_fields策略获取全部匹配字段的累计得分(综合全部匹配字段的得分),等价于bool should查询方式,marks:[{type:color,value:#f33232}]}]}],state:{}}]> <h3 yne-bulb-block="heading" yne-bulb-level="3" style="white-space:pre-wrap;line-height:1.75;font-size:14px;text-align:left;"><span style="font-weight: bold;font-size: inherit;"><span leaf="">使用多数字段搜索</span></span></h3> <p><span style="color: rgb(243, 50, 50);"><span leaf="">most_fields策略获取全部匹配字段的累计得分(综合全部匹配字段的得分),等价于bool should查询方式</span></span></p> </article> <section class="code-snippet__fix code-snippet__js"> <ul class="code-snippet__line-index code-snippet__js"> </ul> <pre class="code-snippet__js" data-lang="bash"><code><span leaf=""><span class="code-snippet__plaintext">GET /employee/_explain/3</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"query"</span><span class="code-snippet__plaintext">: {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"multi_match"</span><span class="code-snippet__plaintext">: {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"query"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"elasticsearch beginner 湖北省 开封市"</span><span class="code-snippet__plaintext">,</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"type"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"most_fields"</span><span class="code-snippet__plaintext">,</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"fields"</span><span class="code-snippet__plaintext">: [</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"content"</span><span class="code-snippet__plaintext">,</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"address"</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> ]</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">}</span></span></code></pre> </section> <article data-content="[{" type:block,id:9538-1654863884223,name:paragraph,data:{version:1},nodes:[{type:text,id:qf07-1688015027540,leaves:[{text:案例,marks:[{type:bold}]}]}],state:{}}]> <p><span style="font-weight: bold;"><span leaf="">案例</span></span></p> </article> <section class="code-snippet__fix code-snippet__js"> <ul class="code-snippet__line-index code-snippet__js"> </ul> <pre class="code-snippet__js" data-lang="bash"><code><span leaf=""><span class="code-snippet__plaintext">DELETE /titles</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">PUT /titles</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"mappings"</span><span class="code-snippet__plaintext">: {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"properties"</span><span class="code-snippet__plaintext">: {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"title"</span><span class="code-snippet__plaintext">: {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"type"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"text"</span><span class="code-snippet__plaintext">,</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"analyzer"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"english"</span><span class="code-snippet__plaintext">,</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"fields"</span><span class="code-snippet__plaintext">: {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"std"</span><span class="code-snippet__plaintext">: {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"type"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"text"</span><span class="code-snippet__plaintext">,</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"analyzer"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"standard"</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">POST titles/_bulk</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{ </span><span class="code-snippet__string">"index"</span><span class="code-snippet__plaintext">: { </span><span class="code-snippet__string">"_id"</span><span class="code-snippet__plaintext">: 1 }}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{ </span><span class="code-snippet__string">"title"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"My dog barks"</span><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{ </span><span class="code-snippet__string">"index"</span><span class="code-snippet__plaintext">: { </span><span class="code-snippet__string">"_id"</span><span class="code-snippet__plaintext">: 2 }}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{ </span><span class="code-snippet__string">"title"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"I see a lot of barking dogs on the road "</span><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__comment"># 结果与预期不匹配</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">GET /titles/_search</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> "query": {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> "match": {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> "title": "barking dogs"</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">}</span></span></code></pre> </section> <article data-content="[{" type:block,id:3522-1654861745009,name:paragraph,data:{version:1},nodes:[{type:text,id:yefz-1688015027541,leaves:[{text:用广度匹配字段title包括尽可能多的文档——以提升召回率——同时又使用字段title.std 作为信号将相关度更高的文档置于结果顶部。,marks:[]}]}],state:{}}]> <p><span leaf="">用广度匹配字段title包括尽可能多的文档——以提升召回率——同时又使用字段title.std 作为信号将相关度更高的文档置于结果顶部。</span></p> </article> <section class="code-snippet__fix code-snippet__js"> <ul class="code-snippet__line-index code-snippet__js"> </ul> <pre class="code-snippet__js" data-lang="bash"><code><span leaf=""><span class="code-snippet__plaintext">GET /titles/_search</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"query"</span><span class="code-snippet__plaintext">: {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"multi_match"</span><span class="code-snippet__plaintext">: {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"query"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"barking dogs"</span><span class="code-snippet__plaintext">,</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"type"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"most_fields"</span><span class="code-snippet__plaintext">,</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"fields"</span><span class="code-snippet__plaintext">: [</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"title"</span><span class="code-snippet__plaintext">,</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"title.std"</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> ]</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">}</span></span></code></pre> </section> <article data-content="[{" type:block,id:1517-1654863959301,name:paragraph,data:{version:1},nodes:[{type:text,id:t2k7-1688015027542,leaves:[{text:每个字段对于最终评分的贡献可以通过自定义值boost 来控制。,marks:[{type:color,value:#df402a}]},{text:比如,使title 字段更为重要,这样同时也降低了其他信号字段的作用:,marks:[]}]}],state:{}}]> <p><span style="color: rgb(223, 64, 42);"><span leaf="">每个字段对于最终评分的贡献可以通过自定义值boost 来控制。</span></span><span leaf="">比如,使title 字段更为重要,这样同时也降低了其他信号字段的作用:</span></p> </article> <section class="code-snippet__fix code-snippet__js"> <ul class="code-snippet__line-index code-snippet__js"> </ul> <pre class="code-snippet__js" data-lang="swift"><code><span leaf=""><span class="code-snippet__plaintext">#增加title的权重</span></span></code><code><span leaf=""><span class="code-snippet__type">GET</span><span class="code-snippet__plaintext"> </span><span class="code-snippet__regexp">/titles/</span><span class="code-snippet__plaintext">_search</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"query"</span><span class="code-snippet__plaintext">: {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"multi_match"</span><span class="code-snippet__plaintext">: {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"query"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"barking dogs"</span><span class="code-snippet__plaintext">,</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"type"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"most_fields"</span><span class="code-snippet__plaintext">,</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"fields"</span><span class="code-snippet__plaintext">: [</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"title^10"</span><span class="code-snippet__plaintext">,</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"title.std"</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> ]</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">}</span></span></code></pre> </section> <article data-content="[{" type:block,id:plra-1724903217781,name:heading,data:{level:h3},nodes:[{type:text,id:s345-1688015027542,leaves:[{text:跨字段搜索,marks:[{type:bold}]}]}],state:{}},{type:block,id:olef-1690960504158,name:paragraph,data:{version:1},nodes:[{type:text,id:2wyo-1690960504159,leaves:[{text:搜索内容在多个字段中都显示,marks:[{type:color,value:#f33232}]},{text:,类似bool+dis_max组合,marks:[]}]}],state:{}}]> <h3 yne-bulb-block="heading" yne-bulb-level="3" style="white-space:pre-wrap;line-height:1.75;font-size:14px;text-align:left;"><span style="font-weight: bold;font-size: inherit;"><span leaf="">跨字段搜索</span></span></h3> <p><span style="color: rgb(243, 50, 50);"><span leaf="">搜索内容在多个字段中都显示</span></span><span leaf="">,类似bool+dis_max组合</span></p> </article> <section class="code-snippet__fix code-snippet__js"> <ul class="code-snippet__line-index code-snippet__js"> </ul> <pre class="code-snippet__js" data-lang="swift"><code><span leaf=""><span class="code-snippet__type">DELETE</span><span class="code-snippet__plaintext"> </span><span class="code-snippet__regexp">/address</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">PUT /address</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"settings"</span><span class="code-snippet__plaintext"> : {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"index"</span><span class="code-snippet__plaintext"> : {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"analysis.analyzer.default.type"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"ik_max_word"</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">}</span></span></code><code><span leaf=""><span class="code-snippet__type">PUT</span><span class="code-snippet__plaintext"> </span><span class="code-snippet__regexp">/address/</span><span class="code-snippet__plaintext">_bulk</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{ </span><span class="code-snippet__string">"index"</span><span class="code-snippet__plaintext">: { </span><span class="code-snippet__string">"_id"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"1"</span><span class="code-snippet__plaintext">} }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span><span class="code-snippet__string">"province"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"湖南"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"city"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"长沙"</span><span class="code-snippet__plaintext">}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{ </span><span class="code-snippet__string">"index"</span><span class="code-snippet__plaintext">: { </span><span class="code-snippet__string">"_id"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"2"</span><span class="code-snippet__plaintext">} }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span><span class="code-snippet__string">"province"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"湖南"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"city"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"常德"</span><span class="code-snippet__plaintext">}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{ </span><span class="code-snippet__string">"index"</span><span class="code-snippet__plaintext">: { </span><span class="code-snippet__string">"_id"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"3"</span><span class="code-snippet__plaintext">} }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span><span class="code-snippet__string">"province"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"广东"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"city"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"广州"</span><span class="code-snippet__plaintext">}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{ </span><span class="code-snippet__string">"index"</span><span class="code-snippet__plaintext">: { </span><span class="code-snippet__string">"_id"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"4"</span><span class="code-snippet__plaintext">} }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span><span class="code-snippet__string">"province"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"湖南"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"city"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"邵阳"</span><span class="code-snippet__plaintext">}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">#使用most_fields的方式结果不符合预期,不支持</span><span class="code-snippet__keyword">operator</span></span></code><code><span leaf=""><span class="code-snippet__type">GET</span><span class="code-snippet__plaintext"> </span><span class="code-snippet__regexp">/address/</span><span class="code-snippet__plaintext">_search</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"query"</span><span class="code-snippet__plaintext">: {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"multi_match"</span><span class="code-snippet__plaintext">: {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"query"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"湖南常德"</span><span class="code-snippet__plaintext">,</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"type"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"most_fields"</span><span class="code-snippet__plaintext">,</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"fields"</span><span class="code-snippet__plaintext">: [</span><span class="code-snippet__string">"province"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"city"</span><span class="code-snippet__plaintext">]</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"># 可以使用cross_fields,支持</span><span class="code-snippet__keyword">operator</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">#与copy_to相比,其中一个优势就是它可以在搜索时为单个字段提升权重</span><span class="code-snippet__operator">。</span></span></code><code><span leaf=""><span class="code-snippet__type">GET</span><span class="code-snippet__plaintext"> </span><span class="code-snippet__regexp">/address/</span><span class="code-snippet__plaintext">_search</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"query"</span><span class="code-snippet__plaintext">: {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"multi_match"</span><span class="code-snippet__plaintext">: {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"query"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"湖南常德"</span><span class="code-snippet__plaintext">,</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"type"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"cross_fields"</span><span class="code-snippet__plaintext">,</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"operator"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"and"</span><span class="code-snippet__plaintext">, </span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"fields"</span><span class="code-snippet__plaintext">: [</span><span class="code-snippet__string">"province"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"city"</span><span class="code-snippet__plaintext">]</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">}</span></span></code></pre> </section> <article data-content="[{" type:block,id:7743-1654866590444,name:paragraph,data:{version:1},nodes:[{type:text,id:j9a8-1688015027544,leaves:[{text:还可以用copy...to 解决,但是需要额外的存储空间,marks:[]}]}],state:{}}]> <p><span leaf="">还可以用copy...to 解决,但是需要额外的存储空间</span></p> </article> <section class="code-snippet__fix code-snippet__js"> <ul class="code-snippet__line-index code-snippet__js"> </ul> <pre class="code-snippet__js" data-lang="css"><code><span leaf=""><span class="code-snippet__plaintext">DELETE /</span><span class="code-snippet__selector-tag">address</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"># copy_to参数允许将多个字段的值复制到组字段中,然后可以将其作为单个字段进行查询</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">PUT /</span><span class="code-snippet__selector-tag">address</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> "mappings" : {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> "properties" : {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> "province" : {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> "type" : </span><span class="code-snippet__string">"keyword"</span><span class="code-snippet__plaintext">,</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"copy_to"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"full_address"</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> },</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> "city" : {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> "type" : </span><span class="code-snippet__string">"text"</span><span class="code-snippet__plaintext">,</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"copy_to"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"full_address"</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> },</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> "settings" : {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> "index" : {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> "analysis</span><span class="code-snippet__selector-class">.analyzer.default.type</span><span class="code-snippet__plaintext">": </span><span class="code-snippet__string">"ik_max_word"</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">PUT /</span><span class="code-snippet__selector-tag">address</span><span class="code-snippet__plaintext">/_bulk</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{ "index": { "_id": </span><span class="code-snippet__string">"1"</span><span class="code-snippet__plaintext">} }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{"province": </span><span class="code-snippet__string">"湖南"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"city"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"长沙"</span><span class="code-snippet__plaintext">}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{ "index": { "_id": </span><span class="code-snippet__string">"2"</span><span class="code-snippet__plaintext">} }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{"province": </span><span class="code-snippet__string">"湖南"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"city"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"常德"</span><span class="code-snippet__plaintext">}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{ "index": { "_id": </span><span class="code-snippet__string">"3"</span><span class="code-snippet__plaintext">} }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{"province": </span><span class="code-snippet__string">"广东"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"city"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"广州"</span><span class="code-snippet__plaintext">}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{ "index": { "_id": </span><span class="code-snippet__string">"4"</span><span class="code-snippet__plaintext">} }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{"province": </span><span class="code-snippet__string">"湖南"</span><span class="code-snippet__plaintext">,</span><span class="code-snippet__string">"city"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"邵阳"</span><span class="code-snippet__plaintext">}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">GET /</span><span class="code-snippet__selector-tag">address</span><span class="code-snippet__plaintext">/_search</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">{</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> "query": {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> "match": {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> "full_address": {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> "query": </span><span class="code-snippet__string">"湖南常德"</span><span class="code-snippet__plaintext">,</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__string">"operator"</span><span class="code-snippet__plaintext">: </span><span class="code-snippet__string">"and"</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">}</span></span></code></pre> </section> <section> <span leaf=""><br></span> </section> <p style="display: none;"> <mp-style-type data-value="3"></mp-style-type></p>
作者:微信小助手
<article> <h3 yne-bulb-block="heading" yne-bulb-level="3" style="white-space:pre-wrap;line-height:1.75;font-size:14px;text-align:left;"><span style="font-weight: bold;font-size: inherit;"><span leaf=""><span textstyle="" style="font-size: 20px;">实验介绍</span></span></span></h3> <p><span leaf="">本实验使用Keepalived为LVS提供高可用服务,同时LVS为后端的Nginx1和Nginx2提供负载均衡服务,最终通过Keepalived+LVS实现Nginx高可用负载均衡集群。</span></p> <h3 yne-bulb-block="heading" yne-bulb-level="3" style="white-space:pre-wrap;line-height:1.75;font-size:14px;text-align:left;"><span style="font-weight: bold;font-size: inherit;"><span leaf=""><span textstyle="" style="font-size: 20px;">组网介绍</span></span></span></h3> <p><span leaf="">如下图所示,本实验由5台主机组成,Nginx1和Nginx2提供web服务,LVS1和LVS2通过Keepalived组成高可用集群,向后端的Nginx1和Nginx2提供负载均衡。</span></p> <section nodeleaf=""> <img class="rich_pages wxw-img" data-imgfileid="100002534" src="/upload/a8a211839ec51921d3982e864d6fde58.png" data-type="png" height="360" style="width: 441px;height: 360px;" width="441"> </section> <p><span leaf="">LVS1:ens36 192.168.1.11/24;ens33 20.0.0.1/24</span></p> <p><span leaf="">LVS2:ens36 192.168.1.12/24;ens33 20.0.0.1/24</span></p> <p><span leaf="">VIP:192.168.1.20</span></p> <p><span leaf="">Nginx1:DIP ens36 192.168.1.14</span></p> <p><span leaf="">Nginx2:DIP ens36 192.168.1.15</span></p> <p><span leaf="">client:192.168.1.13/24</span></p> <h3 yne-bulb-block="heading" yne-bulb-level="3" style="white-space:pre-wrap;line-height:1.75;font-size:14px;text-align:left;"><span style="font-weight: bold;font-size: inherit;"><span leaf=""><span textstyle="" style="font-size: 20px;">实验步骤</span></span></span></h3> <h4 yne-bulb-block="heading" yne-bulb-level="4" style="white-space:pre-wrap;line-height:1.75;font-size:14px;text-align:left;"><span style="font-weight: bold;"><span leaf=""><span textstyle="" style="font-size: 16px;">步骤1 为LVS1和LVS2配置IP地址</span></span></span></h4> <p><span leaf="">LVS1的IP配置</span></p> <section class="code-snippet__fix code-snippet__js"> <ul class="code-snippet__line-index code-snippet__js"> </ul> <pre class="code-snippet__js" data-lang="swift"><code><span leaf=""><span class="code-snippet__plaintext">nmcli connection modify ens33 ipv4.method manual ipv4.addresses </span><span class="code-snippet__number">20.0</span><span class="code-snippet__plaintext">.</span><span class="code-snippet__number">0.1</span><span class="code-snippet__regexp">/24 </span></span></code><code><span leaf=""><span class="code-snippet__plaintext">nmcli connection modify ens36 ipv4.method manual ipv4.addresses 192.168.1.11/</span><span class="code-snippet__number">24</span><span class="code-snippet__plaintext"> </span></span></code><code><span leaf=""><span class="code-snippet__plaintext">nmcli connection up ens33 </span></span></code><code><span leaf=""><span class="code-snippet__plaintext">nmcli connection up ens36</span></span></code></pre> </section> <p><span leaf=""><br></span></p> <p><span leaf="">LVS2的IP配置</span></p> <section class="code-snippet__fix code-snippet__js"> <ul class="code-snippet__line-index code-snippet__js"> </ul> <pre class="code-snippet__js" data-lang="swift"><code><span leaf=""><span class="code-snippet__plaintext">nmcli connection modify ens33 ipv4.method manual ipv4.addresses </span><span class="code-snippet__number">20.0</span><span class="code-snippet__plaintext">.</span><span class="code-snippet__number">0.2</span><span class="code-snippet__regexp">/24 </span></span></code><code><span leaf=""><span class="code-snippet__plaintext">nmcli connection modify ens36 ipv4.method manual ipv4.addresses 192.168.1.12/</span><span class="code-snippet__number">24</span><span class="code-snippet__plaintext"> </span></span></code><code><span leaf=""><span class="code-snippet__plaintext">nmcli connection up ens33 </span></span></code><code><span leaf=""><span class="code-snippet__plaintext">nmcli connection up ens36</span></span></code></pre> </section> <p><span leaf=""><br></span></p> <p><span leaf="">测试心跳IP和业务IP的连通性</span></p> <section nodeleaf=""> <img class="rich_pages wxw-img" data-imgfileid="100002531" src="/upload/07d9818f3244974f78d6bfbbdd675d75.png" data-type="png" height="93" style="width: 631px;height: 93px;" width="631"> </section> <section nodeleaf=""> <img class="rich_pages wxw-img" data-imgfileid="100002530" src="/upload/58d53f65b36e973f39f6cf9d0f532e48.png" data-type="png" height="89" style="width: 716px;height: 89px;" width="716"> </section> <h4 yne-bulb-block="heading" yne-bulb-level="4" style="white-space:pre-wrap;line-height:1.75;font-size:14px;text-align:left;"><span style="font-weight: bold;"><span leaf="">步骤2 为LVS1和LVS2安装keepalived和ipvsadm并修改配置文件</span></span></h4> <section class="code-snippet__fix code-snippet__js"> <ul class="code-snippet__line-index code-snippet__js"> </ul> <pre class="code-snippet__js" data-lang=""><code><span leaf=""><span class="code-snippet__plaintext">yum install -y keepalived ipvsadm</span></span></code></pre> </section> <p><span leaf=""><br></span></p> <p><span leaf="">LVS1的keepalived配置文件修改为</span></p> <section class="code-snippet__fix code-snippet__js"> <ul class="code-snippet__line-index code-snippet__js"> </ul> <pre class="code-snippet__js" data-lang="perl"><code><span leaf=""><span class="code-snippet__plaintext">! Configuration File </span><span class="code-snippet__keyword">for</span><span class="code-snippet__plaintext"> keepalived</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">global_defs {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> router_id Cluster1</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">vrrp_instance Nginx {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__keyword">state</span><span class="code-snippet__plaintext"> MASTER </span><span class="code-snippet__comment"># 两个 DS,一个为 MASTER 一个为 BACKUP</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> interface ens36 # 当前 DIP 对应的网络接口</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> virtual_router_id 51 # 虚拟路由 ID(0-255),在一个 VRRP 实例中主备服务器 ID 必须一样</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> priority 255 # 优先级值设定:MASTER 要比 BACKUP 的值大</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> advert_int 1 # 通告时间间隔:单位秒,主备要一致</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> authentication { # 认证机制,主从节点保持一致即可</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> auth_type PASS</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> auth_pass 1111</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> virtual_ipaddress {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> 192.168.1.20/24 # VIP,可配置多个</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">virtual_server 192.168.1.20 80 {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> delay_loop 6 # 设置健康状态检查时间间隔(秒)</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> lb_algo rr # 调度算法,这里用了 rr 轮询算法</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> lb_kind DR # 这里测试用了 Direct Route 模式</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> persistence_timeout 50 # 持久连接超时时间</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> protocol TCP</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> real_server 192.168.1.14 80 {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> weight 1</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> TCP_CHECK { #定义TCP健康检查参数</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> connect_timeout 3 #连接超时时间为3秒</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> retry 3 #重试次数为3次</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> delay_before_retry 3 #每次重试之间的延迟时间为3秒</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> real_server 192.168.1.15 80 {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> weight 2</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> TCP_CHECK {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> connect_timeout 3</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> retry 3</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> delay_before_retry 3</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">}</span></span></code></pre> </section> <p><span leaf=""><br></span></p> <p><span leaf="">LVS2的keepalived配置文件修改为</span></p> <section class="code-snippet__fix code-snippet__js"> <ul class="code-snippet__line-index code-snippet__js"> </ul> <pre class="code-snippet__js" data-lang="ruby"><code><span leaf=""><span class="code-snippet__plaintext">! </span><span class="code-snippet__title">Configuration</span><span class="code-snippet__plaintext"> </span><span class="code-snippet__title">File</span><span class="code-snippet__plaintext"> </span><span class="code-snippet__keyword">for</span><span class="code-snippet__plaintext"> keepalived</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">global_defs {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> router_id </span><span class="code-snippet__title">Cluster2</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">vrrp_instance </span><span class="code-snippet__title">Nginx</span><span class="code-snippet__plaintext"> {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> state </span><span class="code-snippet__variable">BACKUP</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> interface ens36</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> virtual_router_id </span><span class="code-snippet__number">51</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> priority </span><span class="code-snippet__number">100</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> advert_int </span><span class="code-snippet__number">1</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> authentication {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> auth_type </span><span class="code-snippet__variable">PASS</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> auth_pass </span><span class="code-snippet__number">1111</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> virtual_ipaddress {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__number">192.168</span><span class="code-snippet__plaintext">.</span><span class="code-snippet__number">1.20</span><span class="code-snippet__plaintext">/</span><span class="code-snippet__number">24</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">}</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">virtual_server </span><span class="code-snippet__number">192.168</span><span class="code-snippet__plaintext">.</span><span class="code-snippet__number">1.20</span><span class="code-snippet__plaintext"> </span><span class="code-snippet__number">80</span><span class="code-snippet__plaintext"> {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> delay_loop </span><span class="code-snippet__number">6</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> lb_algo rr</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> lb_kind </span><span class="code-snippet__variable">DR</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> persistence_timeout </span><span class="code-snippet__number">50</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> protocol </span><span class="code-snippet__variable">TCP</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> real_server </span><span class="code-snippet__number">192.168</span><span class="code-snippet__plaintext">.</span><span class="code-snippet__number">1.14</span><span class="code-snippet__plaintext"> </span><span class="code-snippet__number">80</span><span class="code-snippet__plaintext"> {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> weight </span><span class="code-snippet__number">1</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__variable">TCP_CHECK</span><span class="code-snippet__plaintext"> {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> connect_timeout </span><span class="code-snippet__number">3</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__keyword">retry</span><span class="code-snippet__plaintext"> </span><span class="code-snippet__number">3</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> delay_before_retry </span><span class="code-snippet__number">3</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> real_server </span><span class="code-snippet__number">192.168</span><span class="code-snippet__plaintext">.</span><span class="code-snippet__number">1.15</span><span class="code-snippet__plaintext"> </span><span class="code-snippet__number">80</span><span class="code-snippet__plaintext"> {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> weight </span><span class="code-snippet__number">2</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__variable">TCP_CHECK</span><span class="code-snippet__plaintext"> {</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> connect_timeout </span><span class="code-snippet__number">3</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> </span><span class="code-snippet__keyword">retry</span><span class="code-snippet__plaintext"> </span><span class="code-snippet__number">3</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> delay_before_retry </span><span class="code-snippet__number">3</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext"> }</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">}</span></span></code></pre> </section> <p><span leaf=""><br></span></p> <p><span leaf="">在两台主机上重启keepalived服务使其生效</span></p> <section class="code-snippet__fix code-snippet__js"> <ul class="code-snippet__line-index code-snippet__js"> </ul> <pre class="code-snippet__js" data-lang=""><code><span leaf=""><span class="code-snippet__plaintext">systemctl restart keepalived</span></span></code></pre> </section> <p><span leaf=""><br></span></p> <h4 yne-bulb-block="heading" yne-bulb-level="4" style="white-space:pre-wrap;line-height:1.75;font-size:14px;text-align:left;"><span style="font-weight: bold;font-size: 18px;"><span leaf="">步骤3 为后端服务器安装Nginx并配置虚拟主机</span></span></h4> <p><span leaf="">Nginx1上执行</span></p> <section class="code-snippet__fix code-snippet__js"> <ul class="code-snippet__line-index code-snippet__js"> </ul> <pre class="code-snippet__js" data-lang="swift"><code><span leaf=""><span class="code-snippet__plaintext">#安装niginx</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">yum install </span><span class="code-snippet__operator">-</span><span class="code-snippet__plaintext">y nginx</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">#向nginx的主页面中写入想要的信息</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">echo </span><span class="code-snippet__string">"hello,10.0.0.2"</span><span class="code-snippet__plaintext"> </span><span class="code-snippet__operator">></span><span class="code-snippet__plaintext"> </span><span class="code-snippet__regexp">/usr/</span><span class="code-snippet__plaintext">share</span><span class="code-snippet__regexp">/nginx/</span><span class="code-snippet__plaintext">html</span><span class="code-snippet__operator">/</span><span class="code-snippet__plaintext">index.html</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">#启动nginx服务</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">systemctl enalbe nginx.service </span><span class="code-snippet__operator">--</span><span class="code-snippet__plaintext">now</span></span></code></pre> </section> <p><span leaf=""><br></span></p> <p><span leaf="">Nginx2上执行</span></p> <section class="code-snippet__fix code-snippet__js"> <ul class="code-snippet__line-index code-snippet__js"> </ul> <pre class="code-snippet__js" data-lang="swift"><code><span leaf=""><span class="code-snippet__plaintext">#安装niginx</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">yum install </span><span class="code-snippet__operator">-</span><span class="code-snippet__plaintext">y nginx</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">#向nginx的主页面中写入想要的信息</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">echo </span><span class="code-snippet__string">"hello,10.0.0.3"</span><span class="code-snippet__plaintext"> </span><span class="code-snippet__operator">></span><span class="code-snippet__plaintext"> </span><span class="code-snippet__regexp">/usr/</span><span class="code-snippet__plaintext">share</span><span class="code-snippet__regexp">/nginx/</span><span class="code-snippet__plaintext">html</span><span class="code-snippet__operator">/</span><span class="code-snippet__plaintext">index.html</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">#启动nginx服务</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">systemctl enalbe nginx.service </span><span class="code-snippet__operator">--</span><span class="code-snippet__plaintext">now</span></span></code></pre> </section> <p><span leaf=""><br></span></p> <h4 yne-bulb-block="heading" yne-bulb-level="4" style="white-space:pre-wrap;line-height:1.75;font-size:14px;text-align:left;"><span style="font-weight: bold;font-size: 18px;"><span leaf="">步骤4 为后端服务器配置IP</span></span></h4> <p><span leaf="">按照规划,</span><span style="color: rgb(243, 50, 50);"><span leaf="">将Nginx1和nginx2的网关设置为网关的地址</span></span><span leaf="">。配置命令参考以下内容</span></p> <p><span leaf="">以Nginx1为例配置如下,Nginx2按规划修改IP地址即可:</span></p> <section class="code-snippet__fix code-snippet__js"> <ul class="code-snippet__line-index code-snippet__js"> </ul> <pre class="code-snippet__js" data-lang=""><code><span leaf=""><span class="code-snippet__plaintext">nmcli con mod ens36 ipv4.address 192.168.1.14/24 ipv4.gateway 192.168.1.1 </span></span></code><code><span leaf=""><span class="code-snippet__plaintext">nmcli con up ens36</span></span></code></pre> </section> <p><span leaf=""><br></span></p> <p><span leaf="">增加一个虚拟接口,并为其配置VIP</span></p> <section class="code-snippet__fix code-snippet__js"> <ul class="code-snippet__line-index code-snippet__js"> </ul> <pre class="code-snippet__js" data-lang="bash"><code><span leaf=""><span class="code-snippet__plaintext">nmcli connection add </span><span class="code-snippet__built_in">type</span><span class="code-snippet__plaintext"> dummy ifname dummy2 ipv4.method manual ipv4.addresses 192.168.1.20/32</span></span></code></pre> </section> <p><span leaf=""><br></span></p> <p><span leaf="">修改内核中关于ARP的配置,关闭arp广播和arp应答</span></p> <section class="code-snippet__fix code-snippet__js"> <ul class="code-snippet__line-index code-snippet__js"> </ul> <pre class="code-snippet__js" data-lang="bash"><code><span leaf=""><span class="code-snippet__built_in">cat</span><span class="code-snippet__plaintext"> >> /etc/sysctl.conf << </span><span class="code-snippet__string">EOF</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">net.ipv4.conf.all.arp_ignore=1</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">net.ipv4.conf.all.arp_announce=2</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">net.ipv4.conf.dummy2.arp_ignore=1</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">net.ipv4.conf.dummy2.arp_announce=2</span></span></code><code><span leaf=""><span class="code-snippet__plaintext">EOF</span></span></code></pre> </section> <p><span leaf=""><br></span></p> <p><span leaf="">配置完成后,用sysctl -p使其生效</span></p> <section class="code-snippet__fix code-snippet__js"> <ul class="code-snippet__line-index code-snippet__js"> </ul> <pre class="code-snippet__js" data-lang="perl"><code><span leaf=""><span class="code-snippet__plaintext">sysctl -p | </span><span class="code-snippet__keyword">grep</span><span class="code-snippet__plaintext"> arp</span></span></code></pre> </section> <p><span leaf=""><br></span></p> <section nodeleaf=""> <img class="rich_pages wxw-img" data-imgfileid="100002533" src="/upload/bfe440e57fd266f8cd16f4394b57b560.png" data-type="png" height="100" style="width: 438px;height: 100px;" width="438"> </section> <h2 yne-bulb-block="heading" yne-bulb-level="2" style="white-space:pre-wrap;line-height:1.75;font-size:14px;text-align:left;"><span style="font-weight: bold;font-size: 18px;"><span leaf="">步骤5 HA测试</span></span></h2> <p><span leaf="">首先查看一下当前的VIP,我们发现在LVS1上</span></p> <section nodeleaf=""> <img class="rich_pages wxw-img" data-imgfileid="100002532" src="/upload/213f1195bf400a8849b91e335806fa22.png" data-type="png" height="99" style="width: 906px;height: 99px;" width="906"> </section> <p><span leaf="">我们关闭LVS1的keepalvied的进程,模拟故障场景,再次查看VIP的情况</span></p> <section nodeleaf=""> <img class="rich_pages wxw-img" data-imgfileid="100002539" src="/upload/210b048dfb4f004d5671f56d68e6c1bf.png" data-type="png" height="87.34860335195532" style="width: 759px;height: 87.34860335195532px;" width="759"> </section> <p><span leaf="">我们发现VIP已经漂移到了LVS2上了</span></p> <section nodeleaf=""> <img class="rich_pages wxw-img" data-imgfileid="100002535" src="/upload/91c50ea3e6eecb3aa734bdc56a3b8fba.png" data-type="png" height="94" style="width: 904px;height: 94px;" width="904"> </section> <h2 yne-bulb-block="heading" yne-bulb-level="2" style="white-space:pre-wrap;line-height:1.75;font-size:14px;text-align:left;"><span style="font-weight: bold;font-size: 18px;"><span leaf="">步骤6 负载均衡测试</span></span></h2> <p><span leaf="">从客户端向VIP发起请求</span></p> <section nodeleaf=""> <img class="rich_pages wxw-img" data-imgfileid="100002536" src="/upload/2aaba6cb370c38d3234473def449b08b.png" data-type="png" height="125" style="width: 408px;height: 125px;" width="408"> </section> <p><span leaf="">我们看到这里只有Nginx1响应服务,可以通过ipvsadm命令查看,通过LVS的链接默认开启了持久连接,且超时时间设置为了50,因此每次连接都转发到了第一次分配的服务器上</span></p> <section nodeleaf=""> <img class="rich_pages wxw-img" data-imgfileid="100002537" src="/upload/f6ec484c1ce19af742f9453375565fd1.png" data-type="png" height="133" style="width: 709px;height: 133px;" width="709"> </section> <p><span leaf="">我们将keepalived配置文件中的相关配置注释掉,然后重启服务,再次验证</span></p> <section nodeleaf=""> <img class="rich_pages wxw-img" data-imgfileid="100002538" src="/upload/c6d5ddadfa3de3e4fbebadf5c5ce295a.png" data-type="png" height="136" style="width: 518px;height: 136px;" width="518"> </section> <p><span leaf="">重新启动服务后,再次测式结果如下:</span></p> <section nodeleaf=""> <img class="rich_pages wxw-img" data-imgfileid="100002540" src="/upload/3d53d54ccef8ecd23e91079e34041026.png" data-type="png" height="164" style="width: 387px;height: 164px;" width="387"> </section> <p><span leaf="">我们看到已经可以用指定的轮询方式来提供负载均衡了</span></p> </article> <section> <span leaf=""><br></span> </section> <p style="display: none;"> <mp-style-type data-value="3"></mp-style-type></p>
作者:微信小助手
<section data-tool="markdown编辑器" data-website="https://markdown.com.cn/editor" style="font-size: 16px;color: black;line-height: 1.6;word-spacing: 0px;letter-spacing: 0px;word-break: break-word;word-wrap: break-word;text-align: justify;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, 'PingFang SC', Cambria, Cochin, Georgia, Times, 'Times New Roman', serif;margin-top: -10px;padding: 5px;"> <p data-tool="markdown.com.cn编辑器" style="font-size: 16px;padding-top: 8px;padding-bottom: 8px;margin: 0 0 20px;padding: 0;line-height: 1.8em;color: #3a3a3a;"><span leaf="">在讨论了 RAG 的 chunking、embedding、评估指标、评估流程等技术后,我们进一步探讨 RAG 系统的实际应用。在实际项目中,RAG(Retrieval-Augmented Generation)系统的检索阶段往往是影响生成效果的核心环节。RAG 系统的工作流程包括数据摄取(Data Ingestion)和数据查询(Data Querying),其中检索是至关重要的一步。本文介绍了在一个案例中,团队如何通过2个关键技巧把 RAG 检索准确率从 50% 提高到 95 %</span></p> <hr style="height: 1px;margin-top: 10px;margin-bottom: 10px;border: none;border-top: 1px solid #f9bf45;margin: 20px 0px;"> <h2 data-tool="markdown.com.cn编辑器" style="font-weight: bold;color: black;font-size: 22px;line-height: 1.5em;margin-top: 2.2em;margin-bottom: 35px;"><span style="display: none;"></span><span style="display: inline-block;font-weight: bold;background: linear-gradient(#fff 60%, #ffb11b 40%);color: #515151;padding: 2px 13px 2px;margin-right: 3px;height: 50%;"><span leaf="">1. 什么是 RAG 检索准确率?为什么它很重要?</span></span></h2> <p data-tool="markdown.com.cn编辑器" style="font-size: 16px;padding-top: 8px;padding-bottom: 8px;margin: 0 0 20px;padding: 0;line-height: 1.8em;color: #3a3a3a;"><span leaf="">RAG 检索准确率(Recall)是衡量检索系统能否找到与用户查询相关的所有文档的指标。它在 RAG 系统中尤为重要,因为如果检索阶段无法提供足够的上下文,即使生成模型再强大,也难以输出高质量结果。高检索准确率是确保生成内容相关性的基础。</span></p> <p data-tool="markdown.com.cn编辑器" style="font-size: 16px;padding-top: 8px;padding-bottom: 8px;margin: 0 0 20px;padding: 0;line-height: 1.8em;color: #3a3a3a;"><span leaf="">检索准确率(Recall)公式如下:</span></p> <section style="text-align: center;" nodeleaf=""> <img src="/upload/8a05e67418ad157e7042e34faa6ee22b.png" class="rich_pages wxw-img" data-ratio="0.19528619528619529" data-s="300,640" data-type="png" data-w="297" type="block" data-imgfileid="502469168"> </section> <p data-tool="markdown.com.cn编辑器" style="font-size: 16px;padding-top: 8px;padding-bottom: 8px;margin: 0 0 20px;padding: 0;line-height: 1.8em;color: #3a3a3a;"><span leaf=""><br></span></p> <p data-tool="markdown.com.cn编辑器" style="font-size: 16px;padding-top: 8px;padding-bottom: 8px;margin: 0 0 20px;padding: 0;line-height: 1.8em;color: #3a3a3a;"><span leaf="">示例:</span></p> <ul style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;color: black;list-style-type: disc;" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;"> <span leaf="">用户查询 "Swedish massage in Helsinki"。</span> </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;"> <span leaf="">数据库中有 10 条相关文档,检索系统返回 9 条相关文档和 1 条不相关文档。</span> </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;"> <span leaf="">检索准确率计算:</span> </section></li> </ul><span leaf=""><br></span> </section> <section style="text-align: center;" nodeleaf=""> <img src="/upload/255b90ed973e767649a38881af507257.png" class="rich_pages wxw-img" data-ratio="0.20388349514563106" data-s="300,640" data-type="png" data-w="206" type="block" data-imgfileid="502469169"> </section> <section data-tool="markdown编辑器" data-website="https://markdown.com.cn/editor" style="font-size: 16px;color: black;line-height: 1.6;word-spacing: 0px;letter-spacing: 0px;word-break: break-word;word-wrap: break-word;text-align: justify;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, 'PingFang SC', Cambria, Cochin, Georgia, Times, 'Times New Roman', serif;margin-top: -10px;padding: 5px;"> <span leaf=""><br></span> <hr style="height: 1px;margin-top: 10px;margin-bottom: 10px;border: none;border-top: 1px solid #f9bf45;margin: 20px 0px;"> <h2 data-tool="markdown.com.cn编辑器" style="font-weight: bold;color: black;font-size: 22px;line-height: 1.5em;margin-top: 2.2em;margin-bottom: 35px;"><span style="display: none;"></span><span style="display: inline-block;font-weight: bold;background: linear-gradient(#fff 60%, #ffb11b 40%);color: #515151;padding: 2px 13px 2px;margin-right: 3px;height: 50%;"><span leaf="">2. 案例背景</span></span></h2> <p style="box-sizing: border-box;margin: 0px 0px 20px;font-size: 16px;padding: 0px;line-height: 1.8em;color: rgb(58, 58, 58);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, " pingfang sc, cambria, cochin, georgia, times, times new roman, serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;><span leaf="">在这个案例中,我们通过两个关键改进,使系统的检索准确率从 50-60% 提升至 95% 以上。此项目的背景是为客户服务团队构建一个内部聊天机器人,以帮助客服人员更快地访问信息。</span></p> <p style="box-sizing: border-box;margin: 0px 0px 20px;font-size: 16px;padding: 0px;line-height: 1.8em;color: rgb(58, 58, 58);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, " pingfang sc, cambria, cochin, georgia, times, times new roman, serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;><span leaf="">项目初始阶段包括:</span></p> <ul style="box-sizing: border-box;margin-top: 8px;margin-bottom: 8px;padding-left: 25px;color: rgb(0, 0, 0);list-style-type: disc;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, " pingfang sc, cambria, cochin, georgia, times, times new roman, serif;font-size: 16px;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial; class="list-paddingleft-1"> <li style="box-sizing: border-box;"> <section style="box-sizing: border-box;display: block;margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1, 1, 1);font-weight: 500;"> <span leaf="">从各种系统中获取数据。</span> </section></li> <li style="box-sizing: border-box;"> <section style="box-sizing: border-box;display: block;margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1, 1, 1);font-weight: 500;"> <span leaf="">预处理、chunking 和 embedding 数据。</span> </section></li> <li style="box-sizing: border-box;"> <section style="box-sizing: border-box;display: block;margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1, 1, 1);font-weight: 500;"> <span leaf="">在 Azure AI Search 中构建搜索索引。</span> </section></li> <li style="box-sizing: border-box;"> <section style="box-sizing: border-box;display: block;margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1, 1, 1);font-weight: 500;"> <span leaf="">将聊天机器人连接到搜索索引。</span> </section></li> </ul> <p style="box-sizing: border-box;margin: 0px 0px 20px;font-size: 16px;padding: 0px;line-height: 1.8em;color: rgb(58, 58, 58);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, " pingfang sc, cambria, cochin, georgia, times, times new roman, serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;><span leaf="">数据包括有关地点(如水疗中心和健身房)和专家(如按摩治疗师和私人教练)的信息。数据通过将文本字段(描述、城市、地区)合并为一个内容字段,并为向量搜索创建 embeddings 来准备。</span></p> <p style="box-sizing: border-box;margin: 0px 0px 20px;font-size: 16px;padding: 0px;line-height: 1.8em;color: rgb(58, 58, 58);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, " pingfang sc, cambria, cochin, georgia, times, times new roman, serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;><span leaf="">最初的搜索查询要么作为向量搜索,要么作为全文 BM25 搜索对内容字段运行。然而,系统仅在 50-60% 的时间内检索到正确的文档。</span></p> <p style="box-sizing: border-box;margin: 0px 0px 20px;font-size: 16px;padding: 0px;line-height: 1.8em;color: rgb(58, 58, 58);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, " pingfang sc, cambria, cochin, georgia, times, times new roman, serif;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: justify;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;background-color: rgb(255, 255, 255);text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;><span leaf="">向量搜索不适合这个应用,因为它优先考虑模糊匹配和语义相似性,而我们的应用需要精确匹配。BM25 搜索也不够,因为它基于术语频率,导致包含更多匹配查询术语的文档优先显示,而不是匹配相关术语的文档。BM25 还存在芬兰语词形变化的问题,稍微的词形变化会阻止文档检索。</span></p> <p data-tool="markdown.com.cn编辑器" style="font-size: 16px;padding-top: 8px;padding-bottom: 8px;margin: 0 0 20px;padding: 0;line-height: 1.8em;color: #3a3a3a;"><span leaf=""><br></span></p> <hr style="height: 1px;margin-top: 10px;margin-bottom: 10px;border: none;border-top: 1px solid #f9bf45;margin: 20px 0px;"> <h2 data-tool="markdown.com.cn编辑器" style="font-weight: bold;color: black;font-size: 22px;line-height: 1.5em;margin-top: 2.2em;margin-bottom: 35px;"><span style="display: none;"></span><span style="display: inline-block;font-weight: bold;background: linear-gradient(#fff 60%, #ffb11b 40%);color: #515151;padding: 2px 13px 2px;margin-right: 3px;height: 50%;"><span leaf="">3. 初始方案的问题</span></span></h2> <p data-tool="markdown.com.cn编辑器" style="font-size: 16px;padding-top: 8px;padding-bottom: 8px;margin: 0 0 20px;padding: 0;line-height: 1.8em;color: #3a3a3a;"><span leaf="">系统采用了</span><strong style="font-weight: bold;color: black;"><span leaf="">向量搜索</span></strong><span leaf=""> 和</span><strong style="font-weight: bold;color: black;"><span leaf="">BM25 全文搜索</span></strong><span leaf=""> 的组合,然而:</span></p> <ol style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;color: black;list-style-type: decimal;" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;"> <strong style="font-weight: bold;color: black;"><span leaf="">向量搜索</span></strong><span leaf="">:基于语义相似性,但无法精确匹配具体的服务或位置。</span> </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;"> <strong style="font-weight: bold;color: black;"><span leaf="">BM25 搜索</span></strong><span leaf="">:依赖关键字频率,但会优先返回包含高频关键词但相关性低的文档。对于芬兰语等具有词形变化的语言,BM25 的效果进一步降低。</span> </section></li> </ol> <p data-tool="markdown.com.cn编辑器" style="font-size: 16px;padding-top: 8px;padding-bottom: 8px;margin: 0 0 20px;padding: 0;line-height: 1.8em;color: #3a3a3a;"><span leaf="">这些问题导致检索结果相关性不足,严重影响了用户体验。</span></p> <hr style="height: 1px;margin-top: 10px;margin-bottom: 10px;border: none;border-top: 1px solid #f9bf45;margin: 20px 0px;"> <h2 data-tool="markdown.com.cn编辑器" style="font-weight: bold;color: black;font-size: 22px;line-height: 1.5em;margin-top: 2.2em;margin-bottom: 35px;"><span style="display: none;"></span><span style="display: inline-block;font-weight: bold;background: linear-gradient(#fff 60%, #ffb11b 40%);color: #515151;padding: 2px 13px 2px;margin-right: 3px;height: 50%;"><span leaf="">4. 检索准确率从 50-60% 提升至 95% 的两个技巧</span></span></h2> <p data-tool="markdown.com.cn编辑器" style="font-size: 16px;padding-top: 8px;padding-bottom: 8px;margin: 0 0 20px;padding: 0;line-height: 1.8em;color: #3a3a3a;"><span leaf="">通过以下两项关键改进,系统的检索准确率得以显著提升:</span></p> <h3 data-tool="markdown.com.cn编辑器" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;color: black;font-size: 20px;line-height: 1.4;padding-top: 10px;margin: 10px 0 5px;"><span style="display: none;"></span><span style="color: #515151;font-weight: 700;font-size: 1.0em;padding-left: 20px;border-left: 3px solid #f9bf45;"><span leaf="">1.</span><strong style="font-weight: bold;color: black;"><span leaf="">利用 LLM 改写用户查询</span></strong></span><span style="display: none;"></span></h3> <ul style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;color: black;list-style-type: disc;" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;"> <strong style="font-weight: bold;color: black;"><span leaf="">解决方案</span></strong><span leaf="">:在查询阶段,借助 LLM 将用户输入改写为结构化查询。例如,将 "Swedish massage in Helsinki" 改写为服务字段包含 "Swedish massage" 且城市字段为 "Helsinki" 的查询。</span> </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;"> <strong style="font-weight: bold;color: black;"><span leaf="">实际效果</span></strong><span leaf="">:精准的查询改写显著提高了检索相关性,减少了 BM25 依赖于关键词频率的问题。</span> </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;"> <strong style="font-weight: bold;color: black;"><span leaf="">成本与问题</span></strong><span leaf="">:</span> </section></li> <ul style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;color: black;list-style-type: square;" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;"> <strong style="font-weight: bold;color: black;"><span leaf="">性能开销</span></strong><span leaf="">:查询改写需要实时处理,在高并发场景中可能增加响应时间。</span> </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;"> <strong style="font-weight: bold;color: black;"><span leaf="">维护复杂度</span></strong><span leaf="">:需持续优化查询改写逻辑,以适应不断变化的用户需求。</span> </section></li> </ul> </ul> <h3 data-tool="markdown.com.cn编辑器" style="margin-top: 30px;margin-bottom: 15px;font-weight: bold;color: black;font-size: 20px;line-height: 1.4;padding-top: 10px;margin: 10px 0 5px;"><span style="display: none;"></span><span style="color: #515151;font-weight: 700;font-size: 1.0em;padding-left: 20px;border-left: 3px solid #f9bf45;"><span leaf="">2.</span><strong style="font-weight: bold;color: black;"><span leaf="">利用 LLM 改进索引</span></strong></span><span style="display: none;"></span></h3> <ul style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;color: black;list-style-type: disc;" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;"> <strong style="font-weight: bold;color: black;"><span leaf="">解决方案</span></strong><span leaf="">:在索引阶段,使用大语言模型(LLM)从自由文本中提取服务信息,生成结构化服务列表作为索引字段。例如,从描述 "This spa offers Swedish massage and aromatherapy" 中提取 "Swedish massage" 和 "aromatherapy"。</span> </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;"> <strong style="font-weight: bold;color: black;"><span leaf="">处理非标准化输入</span></strong><span leaf="">:预处理步骤清洗拼写错误、语言变体等噪声,提升模型一致性。</span> </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;"> <strong style="font-weight: bold;color: black;"><span leaf="">实际效果</span></strong><span leaf="">:索引信息更加精确,解决了向量搜索中模糊匹配导致的相关性不足问题。</span> </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;"> <strong style="font-weight: bold;color: black;"><span leaf="">成本与问题</span></strong><span leaf="">:</span> </section></li> <ul style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;color: black;list-style-type: square;" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;"> <strong style="font-weight: bold;color: black;"><span leaf="">计算成本</span></strong><span leaf="">:索引构建需要显著的计算资源,特别是在大规模数据场景中。</span> </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;"> <strong style="font-weight: bold;color: black;"><span leaf="">维护复杂度</span></strong><span leaf="">:动态服务信息需要持续更新,确保索引的准确性和实用性。</span> </section></li> </ul> </ul> <figure data-tool="markdown.com.cn编辑器" style="margin: 0;margin-top: 10px;margin-bottom: 10px;"> <span leaf=""><br></span> </figure> </section> <section style="text-align: center;" nodeleaf=""> <img src="/upload/e70badab99dd42f3987e90c42b50dc33.png" class="rich_pages wxw-img" data-ratio="0.562962962962963" data-s="300,640" data-type="png" data-w="1080" type="block" data-imgfileid="502469170"> </section> <section data-tool="markdown编辑器" data-website="https://markdown.com.cn/editor" style="font-size: 16px;color: black;line-height: 1.6;word-spacing: 0px;letter-spacing: 0px;word-break: break-word;overflow-wrap: break-word;text-align: center;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, " pingfang sc, cambria, cochin, georgia, times, times new roman, serif;margin-top: -10px;padding: 5px;> <figure data-tool="markdown.com.cn编辑器" style="margin: 0;margin-top: 10px;margin-bottom: 10px;"> <span leaf=""><span textstyle="" style="font-size: 12px;">2个技巧把 RAG 检索准确率从 50% 提高到 95 %</span></span> </figure> </section> <section data-tool="markdown编辑器" data-website="https://markdown.com.cn/editor" style="font-size: 16px;color: black;line-height: 1.6;word-spacing: 0px;letter-spacing: 0px;word-break: break-word;word-wrap: break-word;text-align: justify;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, 'PingFang SC', Cambria, Cochin, Georgia, Times, 'Times New Roman', serif;margin-top: -10px;padding: 5px;"> <figure data-tool="markdown.com.cn编辑器" style="margin: 0;margin-top: 10px;margin-bottom: 10px;"> <figcaption style="margin-top: 5px;text-align: center;color: #dda52d;font-size: 14px;"> <span leaf=""><br></span> </figcaption> </figure> <hr style="height: 1px;margin-top: 10px;margin-bottom: 10px;border: none;border-top: 1px solid #f9bf45;margin: 20px 0px;"> <h2 data-tool="markdown.com.cn编辑器" style="font-weight: bold;color: black;font-size: 22px;line-height: 1.5em;margin-top: 2.2em;margin-bottom: 35px;"><span style="display: none;"></span><span style="display: inline-block;font-weight: bold;background: linear-gradient(#fff 60%, #ffb11b 40%);color: #515151;padding: 2px 13px 2px;margin-right: 3px;height: 50%;"><span leaf="">6. 总结</span></span></h2> <p data-tool="markdown.com.cn编辑器" style="font-size: 16px;padding-top: 8px;padding-bottom: 8px;margin: 0 0 20px;padding: 0;line-height: 1.8em;color: #3a3a3a;"><span leaf="">本案例的关键收获如下:</span></p> <ol style="margin-top: 8px;margin-bottom: 8px;padding-left: 25px;color: black;list-style-type: decimal;" class="list-paddingleft-1"> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;"> <strong style="font-weight: bold;color: black;"><span leaf="">核心在于检索阶段的优化</span></strong><span leaf="">:生成效果的提升离不开高质量的检索结果。</span> </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;"> <strong style="font-weight: bold;color: black;"><span leaf="">简单且有效的改进</span></strong><span leaf="">:通过 LLM 改进索引和查询改写,显著提升了系统性能。</span> </section></li> <li> <section style="margin-top: 5px;margin-bottom: 5px;line-height: 26px;text-align: left;color: rgb(1,1,1);font-weight: 500;"> <strong style="font-weight: bold;color: black;"><span leaf="">成本与收益的权衡</span></strong><span leaf="">:虽然增加了部分计算和维护成本,但带来的用户体验提升是值得的。</span> </section></li> </ol> <p data-tool="markdown.com.cn编辑器" style="font-size: 16px;padding-top: 8px;padding-bottom: 8px;margin: 0 0 20px;padding: 0;line-height: 1.8em;color: #3a3a3a;"><span leaf="">高效的检索不仅为生成阶段提供了坚实基础,也证明了技术优化应聚焦于用户需求,避免盲目追求复杂性。</span></p> </section>
作者:微信小助手
<p style="min-height: 24px;text-indent: 2em;"><em><span style="font-size: 16px;">本文主要讲清楚支付系统订单号(或业务ID)各种设计方案对比,各子域的订单号(或业务ID)为什么要统一规范,以及最佳实践。最后还会简单分析微信支付和支付宝的对客订单号的组成差异。</span></em></p> <p style="min-height: 24px;text-indent: 2em;"><em><span style="font-size: 16px;">假如你也好奇为什么有了数据库自增ID外还需要业务ID,或者想了解如何在业务ID中编织进业务信息比如业务系统,数据版本,分库分表位等,值得花几分钟了解一下。</span></em></p> <p style="min-height: 24px;text-indent: 2em;"><em><span style="font-size: 16px;">同时我也不建议在支付系统中使用雪花算法来生成业务ID。</span></em></p> <p style="min-height: 24px;text-indent: 2em;"><span style="font-size: 16px;"><em>订单号和业务ID本质都是标识一笔交易,以下统称为:业务ID。</em></span></p> <h1 data-lake-index-type="2" style="font-size: 28px;line-height: 36px;margin-top: 26px;margin-bottom: 10px;"><span lake-read-ignore="true">1. </span>什么是业务ID</h1> <p style="min-height: 24px;text-indent: 2em;">数据库一般都会设计一个自增ID做为主键,同时还会设计一个能唯一标识一笔业务的ID,这就是所谓的业务ID(也称业务键)。比如收单域有收单单号,支付域有支付号,渠道网关域有渠道支付号等,这些都属于业务ID。</p> <p style="min-height: 24px;text-indent: 2em;">为什么有了自增ID后,还需要有业务ID呢?一般来说有以下几个核心原因:</p> <ol class="list-paddingleft-1" style="padding-left: 23px;"> <li><p>分库分表的强诉求。一旦分库分表,各表之间的自增ID就一定会重复。</p></li> <li><p>全球化部署的强诉求。在跨境支付系统建设时,部分国家地区要求本地化部署,需要通过业务ID知道业务运行在哪个机房。</p></li> <li><p>标识业务语义,在处理故障时能快速定位是哪个域哪个业务。</p></li> <li><p>方便系统升级。通过业务ID的版本所在位判断业务应该走新系统,还是走老系统。</p></li> </ol> <h1 data-lake-index-type="2" style="font-size: 28px;line-height: 36px;margin-top: 26px;margin-bottom: 10px;"><span lake-read-ignore="true">2. </span>为什么业务ID要统一规范</h1> <p style="min-height: 24px;text-indent: 2em;">互联网支付系统基本都是微服务化部署,每个子域都是相对独立的一些同学在研发,架构实现差异非常大,但是业务ID是必须要统一的。主要有以下几个原因:</p> <ol class="list-paddingleft-1" style="padding-left: 23px;"> <li><p>减少维护成本。避免在不同服务中重复发明相似机制,也减少了沟通成本。方便做成统一的组件。</p></li> <li><p>加速异常处理和诊断。在分布式环境下发现和解决问题一般都比较复杂,统一的业务ID规范可以快速判断问题所在的域,以及对应的业务。</p></li> <li><p>避免新同学因经验不足导致设计缺陷,在后期无法满足业务诉求。</p></li> </ol> <h1 data-lake-index-type="2" style="font-size: 28px;line-height: 36px;margin-top: 26px;margin-bottom: 10px;"><span lake-read-ignore="true">3. </span>常见业务ID生成规范及应用场景</h1> <p style="min-height: 24px;text-indent: 2em;">业务ID生成规则有很多种,比如知名的Snowflake算法,UUID算法,时间戳+随机数/序列号等。以下是部分规范的简要介绍。</p> <ol class="list-paddingleft-1" style="padding-left: 23px;"> <li><p><strong>Snowflake算法</strong></p></li> </ol> <p style="min-height: 24px;text-indent: 2em;">组成:时间戳 + 数据中心标识 + 机器节点 + 序列号。</p> <p style="min-height: 24px;text-indent: 2em;">适用场景:无中心化的环境中生成大量的唯一ID,无具体业务语义,且性能要求极高。比如社交媒体的聊天消息记录。</p> <ol start="2" class="list-paddingleft-1" style="padding-left: 23px;"> <li><p><strong>UUID算法</strong></p></li> </ol> <p style="min-height: 24px;text-indent: 2em;">高度唯一且随机。</p> <p style="min-height: 24px;text-indent: 2em;">适用场景:不想让外界感知内部系统的交易量级。比如调用外部渠道的请求号,如果使用序列号,有可能会让外部猜测出交易的规模。</p> <ol start="3" class="list-paddingleft-1" style="padding-left: 23px;"> <li><p><strong>编码系统</strong></p></li> </ol> <p style="min-height: 24px;text-indent: 2em;">特定组织中心化生成。</p> <p style="min-height: 24px;text-indent: 2em;">适用场景:药品或供应链管理,全球范围内标识或追踪商品。</p> <ol start="4" class="list-paddingleft-1" style="padding-left: 23px;"> <li><p><strong>业务规则编码</strong></p></li> </ol> <p style="min-height: 24px;text-indent: 2em;">把一些业务语义编码到ID中。</p> <p style="min-height: 24px;text-indent: 2em;">适用场景:金融支付、电商订单等。</p> <h1 data-lake-index-type="2" style="font-size: 28px;line-height: 36px;margin-top: 26px;margin-bottom: 10px;"><span lake-read-ignore="true">4. </span>支付系统业务ID生成最佳实践</h1> <h2 data-lake-index-type="2" style="font-size: 24px;line-height: 32px;margin-top: 21px;margin-bottom: 5px;"><span lake-read-ignore="true">4.1. </span>业务ID生成规范</h2> <p style="min-height: 24px;text-indent: 2em;">下面以32位的支付系统业务ID生成为例说明。实际应用时可灵活调整。</p> <p style="min-height: 24px;"><img class="rich_pages wxw-img" data-imgfileid="100000099" data-ratio="0.17314814814814813" src="/upload/a7cd56c94dd89d3a736d19e0c36a5a89.png" data-type="png" data-w="1080" width="1167.5"></p> <p style="min-height: 24px;text-indent: 2em;">第1-8位:日期。通过单号一眼能看出是哪天的交易。</p> <p style="min-height: 24px;text-indent: 2em;">第9位:数据版本。用于单据号的升级。</p> <p style="min-height: 24px;text-indent: 2em;">第10位:系统版本。用于内部系统版本升级,尤其是不兼容升级的时候,老业务使用老的系统处理,新业务使用新系统处理。</p> <p style="min-height: 24px;text-indent: 2em;">第11-13位:系统标识码。支付系统内部每个域分配一段,由各域自行再分配给内部系统。比如010是收单核心,012是结算核心。</p> <p style="min-height: 24px;text-indent: 2em;">第14-15位:业务标识位。由各域内部定,比如00-15代表支付类业务,01支付,02预授权,03请款等。</p> <p style="min-height: 24px;text-indent: 2em;">第16-17位:机房位。用于全球化部署。</p> <p style="min-height: 24px;text-indent: 2em;">第18-19位:用户分库位。支持百库。</p> <p style="min-height: 24px;text-indent: 2em;">第20-21位:用户分表位。支持百表。</p> <p style="min-height: 24px;text-indent: 2em;">第22位:预发生产标识位。比如0代表预发环境,1代表生产环境。</p> <p style="min-height: 24px;text-indent: 2em;">第23-24位:预留。各域根据实际情况扩展使用。</p> <p style="min-height: 24px;text-indent: 2em;">第24-32位:序列号空间。一亿规模,循环使用。一个机房一天一亿笔是很大的规模了。如果不够用,可以扩展到第24位,到十亿规模。</p> <h2 data-lake-index-type="2" style="font-size: 24px;line-height: 32px;margin-top: 21px;margin-bottom: 5px;"><span lake-read-ignore="true">4.2. </span>业务ID生成技术实现</h2> <p style="min-height: 24px;text-indent: 2em;">序列号通常采用数据库生成,保证机房内唯一性。</p> <p style="min-height: 24px;text-indent: 2em;"><img class="rich_pages wxw-img" data-imgfileid="100000098" data-ratio="1.314617618586641" src="/upload/7b807a673121ac5120bc1baa2bc242a6.png" data-type="png" data-w="1033" style="width: 424px;height: 557px;" width="516.5"></p> <p style="min-height: 24px;text-indent: 2em;">简要流程如下:</p> <ol class="list-paddingleft-1" style="padding-left: 23px;"> <li><p>DB初始化序列号数据。KEY为业务类型,VALUE初始为0;</p></li> <li><p>调用业务ID生成组件。核心传参:数据版本号,系统版本号,系统名,业务类型等。</p></li> <li><p>业务ID生成组件查看对应业务类型是否有缓存数据。如果没有,就以指定步长(比如100)去更新数据库,然后缓存起来。</p></li> <li><p>在内存中加一,然后根据规则生成业务ID,返回给调用方。</p><p><br></p></li> </ol> <p style="min-height: 24px;text-indent: 2em;">这里使用指定步长去更新数据库,主要是考虑提高性能。但是存在一定的损失,比如发布重启,缓存中的序列号就会被浪费掉。但因为是循环使用,所以基本上对业务没有影响。</p> <h1 data-lake-index-type="2" style="margin-top: 26px;margin-bottom: 10px;font-size: 28px;letter-spacing: 0.578px;line-height: 36px;"><span lake-read-ignore="true">5. 内外区分</span></h1> <p><span lake-read-ignore="true"> 建议把内部订单号和外部订单号做个区分。所谓外部订单号主要指对客(包括个人用户和商户)的订单号,这种场景下,可以考虑把业务类型做为重点编织进到订单号里面。<br></span></p> <p><span lake-read-ignore="true"> 具体可以参考下面聊到的微信支付和支付宝对客订单号。</span></p> <h1 data-lake-index-type="2" style="margin-top: 26px;margin-bottom: 10px;font-size: 28px;line-height: 36px;"><span lake-read-ignore="true">6. 微信支付和支付宝对客订单号的异同</span></h1> <p><span lake-read-ignore="true"> 微信支付:<br></span></p> <p style="text-align: center;"><img class="rich_pages wxw-img" data-galleryid="" data-imgfileid="100002925" data-ratio="0.6289473684210526" data-s="300,640" src="/upload/7a3a3a1937223157aa00a811d5517c48.png" data-type="png" data-w="760" style=""></p> <p style="letter-spacing: 0.578px;"> 有兴趣的可以翻翻自己微信支付的订单记录,42000开头的是支付类的订单,1000050001开头是转账类订单,也就是微信支付把交易类型放在订单的开头。</p> <p style="letter-spacing: 0.578px;"> 日期则放在交易类型的后面。</p> <p>支付宝:<span lake-read-ignore="true"></span></p> <p style="text-align: center;"><img class="rich_pages wxw-img" data-galleryid="" data-imgfileid="100002926" data-ratio="0.22727272727272727" data-s="300,640" src="/upload/5908d8323b18907f829246ea67dd93a4.png" data-type="png" data-w="792" style=""></p> <p style="text-align: left;"><span style="font-family: mp-quote, " pingfang sc, system-ui, -apple-system, blinkmacsystemfont, helvetica neue, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;font-size: var(--articlefontsize);letter-spacing: 0.034em;text-align: justify;> 也可以翻翻自己支付宝的订单记录,日期放在开头,紧接着日期的就是交易类型,2000代表转账,比如20250101</span><span style="font-family: mp-quote, " pingfang sc, system-ui, -apple-system, blinkmacsystemfont, helvetica neue, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;font-size: var(--articlefontsize);letter-spacing: 0.034em;text-align: justify;color: rgb(255, 0, 0);><strong>2000</strong></span><span style="font-family: mp-quote, " pingfang sc, system-ui, -apple-system, blinkmacsystemfont, helvetica neue, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;font-size: var(--articlefontsize);letter-spacing: 0.034em;text-align: justify;>xxxx。</span><span style="font-family: mp-quote, " pingfang sc, system-ui, -apple-system, blinkmacsystemfont, helvetica neue, hiragino sans gb, microsoft yahei ui, yahei, arial, sans-serif;font-size: var(--articlefontsize);letter-spacing: 0.034em;text-align: justify;>而2300或2200就是买东西的支付订单。</span></p>