章鱼的故事



当您在Internet上寻找产品时,您通常希望优化查询,以使搜索结果更加相关。 无论是T恤的颜色,汽车的变速箱类型,笔记本电脑的USB端口数量还是所需公寓中厨房的面积。

在Yula的工作开始之初,我们几乎就拥有了平坦的场地系统,该系统可以完善请求。 也就是说,以创建和搜索商品的形式,可以使用简单的选择字段,该字段允许您保存带有其他参数的商品,然后进行搜索。

随着新峰的开发和征服,Yulia需要一个新系统,该系统将允许您创建字段树,并根据先前选择的选项手动输入,选择值甚至获取新字段。 作为一个神化,需要创建一个简单的系统来通过管理面板管理所有这些。

第一部分:“克苏鲁,来吧”


我们开始解决这个问题。 在分析可能的选项时,我们经常面对这样一个事实,即“字段”,“表示”等概念与现有功能相交,从而误导了对话者。 我们的同事提出了一种从谷壳中分离谷物的根本方法,使我们摆脱了这种混乱-我们称其为“章鱼”。

为什么选择八达通? 因为这听起来像章鱼。 章鱼是一个通用的现场系统,它描述:

  • 哪个平台显示字段;
  • 该方案负责哪种展示方式(产品创建,过滤器,卡片展示等)。

章鱼有触手或触手(轻骑兵,请保持沉默!)-这就是我们所说的树枝,它描述了某些字段应如何以表格形式显示。 可以是:

  • 输入字段;
  • 选择字段
  • 现场分组;
  • 文本字段。

诸如HTML标记之类的东西,其中有标签,并且标签具有用户输入或从预定义列表中选择的参数和值。

那些“赞成”和“反对”章鱼的名字几乎是相等的,但是在系统启动一段时间后,很明显,由于有了这个名字,每个人都立即清楚地了解了所讨论的内容。

第二部分:结构


我们允许水生生物成为我们新系统的名称,但是并不是所有的东西都被海王们撕成碎片,还有一个地方可以使用更经典的名称。 我将列出所有元素:

  • 章鱼-负责整个结构。
  • 触手-描述每个分支的显示。 widget字段将传递给客户端,指示如何显示该字段。
  • 属性-存储输入的值。
  • 字典-包含可能的值列表,以便从列表中进行选择。
  • 标签-包含可以从列表中选择的值。
  • 参数-属性或触手可以补充各种参数,以进行客户确认和响应。
  • 依赖性-描述一个字段对另一个字段的选择的响应的结构。

收到八达通的客户可以按照上述结构绘制页面以创建或编辑产品或进行搜索。 填写后,数据由后端保存并发送到搜索以进行索引编制,这使编辑者可以快速创建新字段并立即在搜索中使用它们。

第三部分:演示


在这里,我们不是在谈论马戏团的表演,在这里,章鱼拍打触手,并用复杂的程序和饮水程序吓住观众(很有趣,这种马戏团存在吗?)。 我将谈论章鱼在客户生活中的样子。

如上所述,每个现场方案(八达通)都有一组参数,这些参数指示该方案所属的动作以及应由谁显示。 例如,一个Android应用程序向后端询问“女性衣柜”部分的搜索过滤器方案。 如果数据库具有适用于指定参数的方案,则后端将返回该方案,并且用户会看到“颜色”和“鞋子大小”字段。

如何实施?

管理面板中的编辑者将创建一个新的八达通方案,该方案表明该方案适用于特定类型的客户端应用程序(iOS,Android,Web或所有类型),该方案包含用于在搜索页面上显示的字段,最重要的是-该方案附加到特定类别的商品。

此外,当用户在移动应用程序中输入搜索内容时,考虑到它是Android,客户端会从后端请求字段布局,并指示类别“女人的衣橱”,并且方案应针对“搜索”视图。

第四部分:搜索


应用程序中的用户输入了广告的值,客户端根据方案的规则对其进行了检查,并将其发送到后端。 他重新检查了所有内容并安全保存。 现在,广告将以完整的字段显示给买方。 但这还不够,因为有必要由买方找到广告。

为此,我们将广告附带的所有属性发送到搜索中,在索引中对数据进行索引,这使您可以通过指定的参数立即找到广告。 编辑者可以随时在“章鱼”管理面板中创建新字段,用户可以在创建广告或搜索时立即使用它们。

第五部分:整合


B2B合作伙伴与Yulia合作,与我们共享他们的广告数据库,以扩大其覆盖面。 例如,如果我们与汽车合作伙伴进行合作,那么外部服务中的每个广告都有很多字段。 如何用我们的八爪鱼结识朋友汽车广告数据库? 答案很简单-使用映射; 或者,如果合作伙伴已通过验证,我们可以允许您直接在我们的系统中创建字段。

通过Kafka,我们与合作伙伴建立了沟通渠道,并获得:

  • 更新合作伙伴产品的字段布局;
  • 商品本身和与他们的操纵。

在开始集成之前,我们将找出将发送给我们的数据格式以及将接收的字段类型。 先前在代码中的字段中创建了映射条件后,我们就获得了合作伙伴方案并进行了映射。 您可以创建新字段或映射到现有字段。 成功作图后,我们可以收到货物,并且所有字段都将在我们的八达通中创建。 将来,如果合作伙伴突然更改计划,则不需要我们的参与。

第六部分:问题


有了八爪鱼的所有优势,我们也遇到了一些困难。 如果将单个实体缓存在Redis中,那么整个架构又如何呢? 每次生成都是非常昂贵的,并且将如此大的电路存储在高速缓存中是有问题的。 此外,当相关字段起作用时,我们需要更改方案。

我们决定将八达通计划的后端发行分为两个阶段:

  • 得到一棵不可变的树,我们将其放置在本地缓存中,每n分钟在后台更新一次。
  • 分支操作:使用依赖项对树进行补充,并在没有缓存的情况下构建响应。

这种方法解决了缓存问题,并使字段的返回时间最小化。

第七部分:A / B测试


在现代食品界,无处不在测试产品功能。 A / B测试没有绕过章鱼。 任务设定为:在考虑某个类别的数量和值的可变性的情况下,衡量某个类别中的字段的占用率。 由于电路的灵活性,这种测试的实施不需要太多时间,并且功能可以尽快投入运行。

我们是如何做到的?

在八达通与产品类别的关联级别上,我们创建了一个测试以进行实验。 在肯定的情况下,又给出了一个章鱼,用户看到了一组不同的字段。

我们还介绍了其他章鱼等级的A / B测试:触手和词典。

第八部分:还可以在哪里申请?


在Julia中,章鱼不仅用于填写产品卡片并进行搜索。 章鱼计划使您可以将它们附加到任何系统实体上,目前,章鱼用于用户的个人帐户和货物交付中。

第九部分:一个例子


单词是单词,但是没有示例,很难理解。 让我们来解释一下。 在“房地产”部分中获取用于创建产品的字段的结构。

待售类别公寓中的示例JSON-公寓参数
 { "title":" ", "widget":"group", "order":17, "params":{ "required":false }, "subfields":[ { "title":"", "widget":"section", "order":18, "params":{ "required":false }, "subfields":[ { "title":"  ", "widget":"select", "order":19, "slug":"komnat_v_kvartire", "type":"tag_id", "attribute_id":1374, "values":[ { "id":1, "value":"1 ", "order":1 }, { "id":2, "value":"2 ", "order":2 }, { "id":3, "value":" ", "order":3 }, { "id":4, "value":"", "order":4 } ], "params":{ "required":true } }, { "title":"", "widget":"input_int", "order":20, "slug":"realty_etaj", "type":"int", "attribute_id":1543, "params":{ "required":true, "min_value":1, "max_value":500 } } ] }, { "title":"", "widget":"section", "order":21, "params":{ "required":false }, "subfields":[ { "title":" ", "widget":"input_float", "order":22, "slug":"realty_obshaya_ploshad", "type":"float", "attribute_id":1541, "params":{ "required":true, "unit":"²", "min_value":1, "max_value":100000 } } ] }, { "title":"", "widget":"section", "order":25, "params":{ "required":false }, "subfields":[ { "title":" ", "widget":"input_float", "order":25, "slug":"building_flat_ceiling_height", "type":"float", "attribute_id":1518, "params":{ "required":false, "min_value":1, "max_value":10, "unit":"" } } ] } ] } 


树显示了用于提交“待售公寓”类别中的广告的字段图的一部分。 根据此方案,客户端可以为用户绘制UI,将字段分组为不同的组,验证输入的值并将其发送到后端进行保存。 让我们更详细地考虑。

触角可以彼此嵌套在一起,以便客户端了解显示内容和显示方式,我们引入了widget属性,该属性告诉客户端要在此位置显示什么:字段分组,文本块,缩进或完整字段。


第十部分:章鱼依赖


在某些情况下,您无法以一种形式显示一次出现在某个选择字段中的所有值。 例如,如果我们谈论汽车,那么即使考虑到使用搜索小部件和其他技巧,将带有所有品牌和型号的表格放在一个屏幕上对于用户来说也极为不便。

为了解决这个问题,我们实现了一个依赖系统,该系统允许我们根据用户先前在其他字段中选择的值,在后端指示应以触角显示哪些字段。

示例:用户进入汽车销售,选择宝马品牌,然后在“模型”字段中仅显示属于该品牌的那些模型。

它是这样实现的:

  • 客户收到一幅田野地图;
  • 对于那些影响方案形成的字段,将指定一个特殊标志,客户端通过该标志在选择值时重新查询方案并将此值发送到后端;
  • 用户选择该字段,客户端发送后端请求;
  • 后端在依赖系统中搜索指定值是否有相关字段,如果有,则按照预先创建的指令填充它们;
  • 客户收到具有一组新字段的更新方案;
  • 现在,用户可以在新字段中选择值。


总结


除了关于章鱼的笑话之外,我们还提供了功能强大的工具,可让您快速实施商品,用户资料,交货等的不同领域方案。 管理员现在可以通过控制面板进行更改和补充方案,而无需进行开发和搜索。 加上A / B测试系统,管理人员可以轻松地验证不同数据集对用户输入的有效性。

Source: https://habr.com/ru/post/zh-CN479924/


All Articles