<mxfile host="archify-azure" agent="archify-azure" version="1">
  <diagram name="Enterprise product catalog search on Azure" id="lueRMI9juF-zbNDXqCuX">
    <mxGraphModel dx="1323" dy="1334" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1323" pageHeight="1334" math="0" shadow="0">
      <root>
        <mxCell id="0"/>
        <mxCell id="1" parent="0"/>
<mxCell id="title" value="Enterprise product catalog search on Azure" style="text;html=1;align=left;verticalAlign=top;fontSize=20;fontStyle=1;fontColor=#000000;whiteSpace=wrap;" vertex="1" parent="1"><mxGeometry x="40" y="24" width="1243" height="30" as="geometry"/></mxCell>
<mxCell id="subtitle" value="Hybrid keyword + vector search on Azure AI Search, Azure OpenAI embeddings, and an event-driven pipeline that keeps the index fresh" style="text;html=1;align=left;verticalAlign=top;fontSize=12;fontColor=#545B64;whiteSpace=wrap;" vertex="1" parent="1"><mxGeometry x="40" y="56" width="1243" height="24" as="geometry"/></mxCell>
<mxCell id="g-cloud" value="Azure" style="whiteSpace=wrap;html=1;container=1;collapsible=0;recursiveResize=0;pointerEvents=0;fontSize=12;verticalAlign=top;align=left;spacingTop=2;rounded=0;strokeColor=#243A5E;fontColor=#243A5E;fillColor=none;dashed=0;spacingLeft=10;" vertex="1" parent="1"><mxGeometry x="221" y="116" width="1062" height="1178" as="geometry"/></mxCell>
<mxCell id="g-region" value="Region" style="whiteSpace=wrap;html=1;container=1;collapsible=0;recursiveResize=0;pointerEvents=0;fontSize=12;verticalAlign=top;align=left;spacingTop=2;rounded=0;strokeColor=#0078D4;fontColor=#0078D4;fillColor=none;dashed=1;dashPattern=2 3;spacingLeft=40;" vertex="1" parent="g-cloud"><mxGeometry x="24" y="210" width="1014" height="944" as="geometry"/></mxCell>
<mxCell id="gi-region" value="" style="image;aspect=fixed;html=1;points=[];align=center;fontSize=12;fontColor=#232F3E;image=img/lib/azure2/general/Region_Management.svg;" vertex="1" parent="g-region"><mxGeometry x="4" y="4" width="32" height="32" as="geometry"/></mxCell>
<mxCell id="g-retrieval" value="Retrieval and ranking" style="whiteSpace=wrap;html=1;container=1;collapsible=0;recursiveResize=0;pointerEvents=0;fontSize=12;verticalAlign=top;align=left;spacingTop=2;rounded=0;strokeColor=#0078D4;fontColor=#0078D4;fillColor=none;dashed=0;spacingLeft=40;" vertex="1" parent="1"><mxGeometry x="779" y="374" width="201" height="520" as="geometry"/></mxCell>
<mxCell id="gi-retrieval" value="" style="image;aspect=fixed;html=1;points=[];align=center;fontSize=12;fontColor=#232F3E;image=img/lib/azure2/app_services/Search_Services.svg;" vertex="1" parent="g-retrieval"><mxGeometry x="4" y="4" width="32" height="32" as="geometry"/></mxCell>
<mxCell id="n-shoppers" value="Shoppers&lt;br&gt;&lt;font style=&quot;font-size:10px&quot; color=&quot;#545B64&quot;&gt;web and app&lt;/font&gt;" style="image;aspect=fixed;html=1;points=[];align=center;fontSize=12;fontColor=#232F3E;verticalLabelPosition=bottom;verticalAlign=top;image=img/lib/azure2/identity/Users.svg;" vertex="1" parent="1"><mxGeometry x="58.5" y="331" width="64" height="64" as="geometry"/></mxCell>
<mxCell id="n-merch" value="Merchandisers&lt;br&gt;&lt;font style=&quot;font-size:10px&quot; color=&quot;#545B64&quot;&gt;synonyms, boosts&lt;/font&gt;" style="image;aspect=fixed;html=1;points=[];align=center;fontSize=12;fontColor=#232F3E;verticalLabelPosition=bottom;verticalAlign=top;image=img/lib/azure2/identity/Users.svg;" vertex="1" parent="1"><mxGeometry x="58.5" y="513" width="64" height="64" as="geometry"/></mxCell>
<mxCell id="n-pim" value="PIM / ERP&lt;br&gt;&lt;font style=&quot;font-size:10px&quot; color=&quot;#545B64&quot;&gt;product master&lt;/font&gt;" style="image;aspect=fixed;html=1;points=[];align=center;fontSize=12;fontColor=#232F3E;verticalLabelPosition=bottom;verticalAlign=top;image=img/lib/azure2/general/Server_Farm.svg;" vertex="1" parent="1"><mxGeometry x="58.5" y="695" width="64" height="64" as="geometry"/></mxCell>
<mxCell id="n-fd" value="Azure Front Door&lt;br&gt;&lt;font style=&quot;font-size:10px&quot; color=&quot;#545B64&quot;&gt;cache popular queries&lt;/font&gt;" style="image;aspect=fixed;html=1;points=[];align=center;fontSize=12;fontColor=#232F3E;verticalLabelPosition=bottom;verticalAlign=top;image=img/lib/azure2/networking/Front_Doors.svg;" vertex="1" parent="1"><mxGeometry x="618.5" y="164" width="64" height="64" as="geometry"/></mxCell>
<mxCell id="n-waf" value="Web Application&lt;br&gt;Firewall&lt;br&gt;&lt;font style=&quot;font-size:10px&quot; color=&quot;#545B64&quot;&gt;bot and rate rules&lt;/font&gt;" style="image;aspect=fixed;html=1;points=[];align=center;fontSize=12;fontColor=#232F3E;verticalLabelPosition=bottom;verticalAlign=top;image=img/lib/azure2/networking/Web_Application_Firewall_Policies_WAF.svg;" vertex="1" parent="1"><mxGeometry x="830" y="164" width="64" height="64" as="geometry"/></mxCell>
<mxCell id="n-apim" value="API Management&lt;br&gt;&lt;font style=&quot;font-size:10px&quot; color=&quot;#545B64&quot;&gt;search API&lt;/font&gt;" style="image;aspect=fixed;html=1;points=[];align=center;fontSize=12;fontColor=#232F3E;verticalLabelPosition=bottom;verticalAlign=top;image=img/lib/azure2/app_services/API_Management_Services.svg;" vertex="1" parent="1"><mxGeometry x="574.5" y="506" width="64" height="64" as="geometry"/></mxCell>
<mxCell id="n-searchfn" value="Azure Functions&lt;br&gt;&lt;font style=&quot;font-size:10px&quot; color=&quot;#545B64&quot;&gt;query understanding + blend&lt;/font&gt;" style="image;aspect=fixed;html=1;points=[];align=center;fontSize=12;fontColor=#232F3E;verticalLabelPosition=bottom;verticalAlign=top;image=img/lib/azure2/compute/Function_Apps.svg;" vertex="1" parent="1"><mxGeometry x="574.5" y="674" width="64" height="64" as="geometry"/></mxCell>
<mxCell id="n-ais" value="Azure AI Search&lt;br&gt;&lt;font style=&quot;font-size:10px&quot; color=&quot;#545B64&quot;&gt;BM25 + vector (hybrid)&lt;/font&gt;" style="image;aspect=fixed;html=1;points=[];align=center;fontSize=12;fontColor=#232F3E;verticalLabelPosition=bottom;verticalAlign=top;image=img/lib/azure2/app_services/Search_Services.svg;" vertex="1" parent="g-retrieval"><mxGeometry x="68.5" y="48" width="64" height="64" as="geometry"/></mxCell>
<mxCell id="n-embed" value="Azure OpenAI&lt;br&gt;&lt;font style=&quot;font-size:10px&quot; color=&quot;#545B64&quot;&gt;text embeddings&lt;/font&gt;" style="image;aspect=fixed;html=1;points=[];align=center;fontSize=12;fontColor=#232F3E;verticalLabelPosition=bottom;verticalAlign=top;image=img/lib/azure2/ai_machine_learning/Azure_OpenAI.svg;" vertex="1" parent="g-retrieval"><mxGeometry x="68.5" y="216" width="64" height="64" as="geometry"/></mxCell>
<mxCell id="n-rank" value="Azure Machine&lt;br&gt;Learning&lt;br&gt;&lt;font style=&quot;font-size:10px&quot; color=&quot;#545B64&quot;&gt;learning-to-rank&lt;/font&gt;" style="image;aspect=fixed;html=1;points=[];align=center;fontSize=12;fontColor=#232F3E;verticalLabelPosition=bottom;verticalAlign=top;image=img/lib/azure2/ai_machine_learning/Azure_Machine_Learning.svg;" vertex="1" parent="g-retrieval"><mxGeometry x="68.5" y="384" width="64" height="64" as="geometry"/></mxCell>
<mxCell id="n-feed" value="Azure Storage&lt;br&gt;&lt;font style=&quot;font-size:10px&quot; color=&quot;#545B64&quot;&gt;catalog feeds + images&lt;/font&gt;" style="image;aspect=fixed;html=1;points=[];align=center;fontSize=12;fontColor=#232F3E;verticalLabelPosition=bottom;verticalAlign=top;image=img/lib/azure2/storage/Storage_Accounts.svg;" vertex="1" parent="1"><mxGeometry x="305" y="958" width="64" height="64" as="geometry"/></mxCell>
<mxCell id="n-reindex" value="Azure Logic Apps&lt;br&gt;&lt;font style=&quot;font-size:10px&quot; color=&quot;#545B64&quot;&gt;full re-index + alias swap&lt;/font&gt;" style="image;aspect=fixed;html=1;points=[];align=center;fontSize=12;fontColor=#232F3E;verticalLabelPosition=bottom;verticalAlign=top;image=img/lib/azure2/integration/Logic_Apps.svg;" vertex="1" parent="1"><mxGeometry x="522.5" y="958" width="64" height="64" as="geometry"/></mxCell>
<mxCell id="n-cosmos" value="Azure Cosmos DB&lt;br&gt;&lt;font style=&quot;font-size:10px&quot; color=&quot;#545B64&quot;&gt;catalog + curation rules&lt;/font&gt;" style="image;aspect=fixed;html=1;points=[];align=center;fontSize=12;fontColor=#232F3E;verticalLabelPosition=bottom;verticalAlign=top;image=img/lib/azure2/databases/Azure_Cosmos_DB.svg;" vertex="1" parent="1"><mxGeometry x="746" y="958" width="64" height="64" as="geometry"/></mxCell>
<mxCell id="n-q" value="Azure Service Bus&lt;br&gt;&lt;font style=&quot;font-size:10px&quot; color=&quot;#545B64&quot;&gt;update buffer + DLQ&lt;/font&gt;" style="image;aspect=fixed;html=1;points=[];align=center;fontSize=12;fontColor=#232F3E;verticalLabelPosition=bottom;verticalAlign=top;image=img/lib/azure2/integration/Service_Bus.svg;" vertex="1" parent="1"><mxGeometry x="949.5" y="958" width="64" height="64" as="geometry"/></mxCell>
<mxCell id="n-indexer" value="Azure Functions&lt;br&gt;&lt;font style=&quot;font-size:10px&quot; color=&quot;#545B64&quot;&gt;enrich, embed, index&lt;/font&gt;" style="image;aspect=fixed;html=1;points=[];align=center;fontSize=12;fontColor=#232F3E;verticalLabelPosition=bottom;verticalAlign=top;image=img/lib/azure2/compute/Function_Apps.svg;" vertex="1" parent="1"><mxGeometry x="1141" y="958" width="64" height="64" as="geometry"/></mxCell>
<mxCell id="n-eh" value="Azure Event Hubs&lt;br&gt;&lt;font style=&quot;font-size:10px&quot; color=&quot;#545B64&quot;&gt;search + click events&lt;/font&gt;" style="image;aspect=fixed;html=1;points=[];align=center;fontSize=12;fontColor=#232F3E;verticalLabelPosition=bottom;verticalAlign=top;image=img/lib/azure2/analytics/Event_Hubs.svg;" vertex="1" parent="1"><mxGeometry x="347" y="1134" width="64" height="64" as="geometry"/></mxCell>
<mxCell id="n-lake" value="Azure Storage&lt;br&gt;&lt;font style=&quot;font-size:10px&quot; color=&quot;#545B64&quot;&gt;analytics lake&lt;/font&gt;" style="image;aspect=fixed;html=1;points=[];align=center;fontSize=12;fontColor=#232F3E;verticalLabelPosition=bottom;verticalAlign=top;image=img/lib/azure2/storage/Storage_Accounts.svg;" vertex="1" parent="1"><mxGeometry x="530" y="1134" width="64" height="64" as="geometry"/></mxCell>
<mxCell id="n-adx" value="Azure Data&lt;br&gt;Explorer&lt;br&gt;&lt;font style=&quot;font-size:10px&quot; color=&quot;#545B64&quot;&gt;relevance analysis&lt;/font&gt;" style="image;aspect=fixed;html=1;points=[];align=center;fontSize=12;fontColor=#232F3E;verticalLabelPosition=bottom;verticalAlign=top;image=img/lib/azure2/databases/Azure_Data_Explorer_Clusters.svg;" vertex="1" parent="1"><mxGeometry x="704.5" y="1134" width="64" height="64" as="geometry"/></mxCell>
<mxCell id="n-mon" value="Azure Monitor&lt;br&gt;&lt;font style=&quot;font-size:10px&quot; color=&quot;#545B64&quot;&gt;latency, zero-result rate&lt;/font&gt;" style="image;aspect=fixed;html=1;points=[];align=center;fontSize=12;fontColor=#232F3E;verticalLabelPosition=bottom;verticalAlign=top;image=img/lib/azure2/management_governance/Monitor.svg;" vertex="1" parent="1"><mxGeometry x="907.5" y="1134" width="64" height="64" as="geometry"/></mxCell>
<mxCell id="n-kv" value="Azure Key Vault" style="image;aspect=fixed;html=1;points=[];align=center;fontSize=12;fontColor=#232F3E;verticalLabelPosition=bottom;verticalAlign=top;image=img/lib/azure2/security/Key_Vaults.svg;" vertex="1" parent="1"><mxGeometry x="1106" y="1134" width="64" height="64" as="geometry"/></mxCell>
<mxCell id="e-0" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#232F3E;strokeWidth=2;labelBackgroundColor=#ffffff;fontSize=11;fontColor=#232F3E;endArrow=open;endFill=0;endSize=8;exitX=0.5;exitY=1;exitDx=0;exitDy=48;exitPerimeter=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="n-apim" target="n-searchfn"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell>
<object label="3" tooltip="3. API Management → Azure Functions" id="b-0"><mxCell style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#000000;strokeColor=#ffffff;fontColor=#ffffff;fontStyle=1;fontSize=12;" vertex="1" parent="1"><mxGeometry x="595.5" y="631" width="22" height="22" as="geometry"/></mxCell></object>
<mxCell id="e-1" value="protects" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#232F3E;strokeWidth=2;labelBackgroundColor=#ffffff;fontSize=11;fontColor=#232F3E;endArrow=open;endFill=0;endSize=8;dashed=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="n-waf" target="n-fd"><mxGeometry x="0" relative="1" as="geometry"></mxGeometry></mxCell>
<mxCell id="e-2" value="change feed" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#232F3E;strokeWidth=2;labelBackgroundColor=#ffffff;fontSize=11;fontColor=#232F3E;endArrow=open;endFill=0;endSize=8;exitX=1;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="n-cosmos" target="n-q"><mxGeometry x="0" relative="1" as="geometry"></mxGeometry></mxCell>
<mxCell id="e-3" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#232F3E;strokeWidth=2;labelBackgroundColor=#ffffff;fontSize=11;fontColor=#232F3E;endArrow=open;endFill=0;endSize=8;exitX=1;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="n-q" target="n-indexer"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell>
<mxCell id="e-4" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#232F3E;strokeWidth=2;labelBackgroundColor=#ffffff;fontSize=11;fontColor=#232F3E;endArrow=open;endFill=0;endSize=8;dashed=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="n-feed" target="n-reindex"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell>
<mxCell id="e-5" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#232F3E;strokeWidth=2;labelBackgroundColor=#ffffff;fontSize=11;fontColor=#232F3E;endArrow=open;endFill=0;endSize=8;exitX=1;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="n-eh" target="n-lake"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell>
<mxCell id="e-6" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#232F3E;strokeWidth=2;labelBackgroundColor=#ffffff;fontSize=11;fontColor=#232F3E;endArrow=open;endFill=0;endSize=8;exitX=1;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="n-lake" target="n-adx"><mxGeometry relative="1" as="geometry"></mxGeometry></mxCell>
<mxCell id="e-7" value="search" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#232F3E;strokeWidth=2;labelBackgroundColor=#ffffff;fontSize=11;fontColor=#232F3E;endArrow=open;endFill=0;endSize=8;exitX=0.5;exitY=0;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="n-shoppers" target="n-fd"><mxGeometry x="0.2" relative="1" as="geometry"><Array as="points"><mxPoint x="90.5" y="196"/></Array></mxGeometry></mxCell>
<object label="1" tooltip="1. Shoppers → Azure Front Door (search)" id="b-7"><mxCell style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#000000;strokeColor=#ffffff;fontColor=#ffffff;fontStyle=1;fontSize=12;" vertex="1" parent="1"><mxGeometry x="79.5" y="296" width="22" height="22" as="geometry"/></mxCell></object>
<mxCell id="e-8" value="cache miss" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#232F3E;strokeWidth=2;labelBackgroundColor=#ffffff;fontSize=11;fontColor=#232F3E;endArrow=open;endFill=0;endSize=8;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="n-fd" target="n-apim"><mxGeometry x="0" relative="1" as="geometry"><Array as="points"><mxPoint x="606.5" y="196"/></Array></mxGeometry></mxCell>
<object label="2" tooltip="2. Azure Front Door → API Management (cache miss)" id="b-8"><mxCell style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#000000;strokeColor=#ffffff;fontColor=#ffffff;fontStyle=1;fontSize=12;" vertex="1" parent="1"><mxGeometry x="595.5" y="471" width="22" height="22" as="geometry"/></mxCell></object>
<mxCell id="e-9" value="embed query" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#232F3E;strokeWidth=2;labelBackgroundColor=#ffffff;fontSize=11;fontColor=#232F3E;endArrow=open;endFill=0;endSize=8;exitX=1;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="n-searchfn" target="n-embed"><mxGeometry x="0.4" relative="1" as="geometry"><Array as="points"><mxPoint x="743" y="706"/><mxPoint x="743" y="622"/></Array></mxGeometry></mxCell>
<object label="4" tooltip="4. Azure Functions → Azure OpenAI (embed query)" id="b-9"><mxCell style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#000000;strokeColor=#ffffff;fontColor=#ffffff;fontStyle=1;fontSize=12;" vertex="1" parent="1"><mxGeometry x="812.5" y="611" width="22" height="22" as="geometry"/></mxCell></object>
<mxCell id="e-10" value="hybrid query" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#232F3E;strokeWidth=2;labelBackgroundColor=#ffffff;fontSize=11;fontColor=#232F3E;endArrow=open;endFill=0;endSize=8;exitX=1;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="n-searchfn" target="n-ais"><mxGeometry x="-0.2" relative="1" as="geometry"><Array as="points"><mxPoint x="695" y="706"/><mxPoint x="695" y="454"/></Array></mxGeometry></mxCell>
<object label="5" tooltip="5. Azure Functions → Azure AI Search (hybrid query)" id="b-10"><mxCell style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#000000;strokeColor=#ffffff;fontColor=#ffffff;fontStyle=1;fontSize=12;" vertex="1" parent="1"><mxGeometry x="812.5" y="443" width="22" height="22" as="geometry"/></mxCell></object>
<mxCell id="e-11" value="re-rank" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#232F3E;strokeWidth=2;labelBackgroundColor=#ffffff;fontSize=11;fontColor=#232F3E;endArrow=open;endFill=0;endSize=8;exitX=0.5;exitY=1;exitDx=0;exitDy=48;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="n-searchfn" target="n-rank"><mxGeometry x="0" relative="1" as="geometry"><Array as="points"><mxPoint x="606.5" y="790"/></Array></mxGeometry></mxCell>
<object label="6" tooltip="6. Azure Functions → Azure Machine Learning (re-rank)" id="b-11"><mxCell style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#000000;strokeColor=#ffffff;fontColor=#ffffff;fontStyle=1;fontSize=12;" vertex="1" parent="1"><mxGeometry x="595.5" y="779" width="22" height="22" as="geometry"/></mxCell></object>
<mxCell id="e-12" value="curation rules" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#232F3E;strokeWidth=2;labelBackgroundColor=#ffffff;fontSize=11;fontColor=#232F3E;endArrow=open;endFill=0;endSize=8;exitX=1;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="n-merch" target="n-cosmos"><mxGeometry x="0.1" relative="1" as="geometry"><Array as="points"><mxPoint x="144.5" y="545"/><mxPoint x="144.5" y="912"/><mxPoint x="724" y="912"/><mxPoint x="724" y="990"/></Array></mxGeometry></mxCell>
<mxCell id="e-13" value="bulk feed" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#232F3E;strokeWidth=2;labelBackgroundColor=#ffffff;fontSize=11;fontColor=#232F3E;endArrow=open;endFill=0;endSize=8;exitX=0.5;exitY=1;exitDx=0;exitDy=48;exitPerimeter=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="n-pim" target="n-feed"><mxGeometry x="0.5" relative="1" as="geometry"><Array as="points"><mxPoint x="90.5" y="990"/></Array></mxGeometry></mxCell>
<mxCell id="e-14" value="updates" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#232F3E;strokeWidth=2;labelBackgroundColor=#ffffff;fontSize=11;fontColor=#232F3E;endArrow=open;endFill=0;endSize=8;exitX=0.5;exitY=1;exitDx=0;exitDy=48;exitPerimeter=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="n-pim" target="n-cosmos"><mxGeometry x="-0.4" relative="1" as="geometry"><Array as="points"><mxPoint x="90.5" y="829"/><mxPoint x="761" y="829"/><mxPoint x="761" y="936"/><mxPoint x="778" y="936"/></Array></mxGeometry></mxCell>
<mxCell id="e-15" value="embed product" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#232F3E;strokeWidth=2;labelBackgroundColor=#ffffff;fontSize=11;fontColor=#232F3E;endArrow=open;endFill=0;endSize=8;exitX=0.5;exitY=0;exitDx=0;exitDy=0;exitPerimeter=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="n-indexer" target="n-embed"><mxGeometry x="0.6" relative="1" as="geometry"><Array as="points"><mxPoint x="1173" y="622"/></Array></mxGeometry></mxCell>
<mxCell id="e-16" value="upsert" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#232F3E;strokeWidth=2;labelBackgroundColor=#ffffff;fontSize=11;fontColor=#232F3E;endArrow=open;endFill=0;endSize=8;exitX=0.5;exitY=0;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=1;entryDx=0;entryDy=48;entryPerimeter=0;" edge="1" parent="1" source="n-indexer" target="n-ais"><mxGeometry x="-0.4" relative="1" as="geometry"><Array as="points"><mxPoint x="1173" y="936"/><mxPoint x="1233" y="936"/><mxPoint x="1233" y="556"/><mxPoint x="879.5" y="556"/></Array></mxGeometry></mxCell>
<mxCell id="e-17" value="rebuild index" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#232F3E;strokeWidth=2;labelBackgroundColor=#ffffff;fontSize=11;fontColor=#232F3E;endArrow=open;endFill=0;endSize=8;exitX=0.5;exitY=0;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=1;entryDx=0;entryDy=48;entryPerimeter=0;" edge="1" parent="1" source="n-reindex" target="n-ais"><mxGeometry x="-0.4" relative="1" as="geometry"><Array as="points"><mxPoint x="554.5" y="936"/><mxPoint x="939.5" y="936"/><mxPoint x="939.5" y="556"/><mxPoint x="879.5" y="556"/></Array></mxGeometry></mxCell>
<mxCell id="e-18" value="events" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;strokeColor=#232F3E;strokeWidth=2;labelBackgroundColor=#ffffff;fontSize=11;fontColor=#232F3E;endArrow=open;endFill=0;endSize=8;dashed=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;exitPerimeter=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="n-apim" target="n-eh"><mxGeometry x="0.1" relative="1" as="geometry"><Array as="points"><mxPoint x="444.8" y="538"/><mxPoint x="444.8" y="1166"/></Array></mxGeometry></mxCell>
      </root>
    </mxGraphModel>
  </diagram>
</mxfile>
