Shromažďování telemetrických dat pro analýzu provozu vyhledávání

Analýza provozu vyhledávání je vzor pro shromažďování telemetrie o interakcích uživatelů s vaší aplikací Azure Cognitive Search, jako jsou události kliknutí iniciované uživatelem a vstupy z klávesnice. Pomocí těchto informací můžete určit efektivitu vašeho vyhledávacího řešení, včetně oblíbených hledaných termínů, míry prokliků a vstupů dotazů, které vrátí nulové výsledky.

Tento model využívá závislost na Přehledy (funkce Azure Monitor )ke shromažďování uživatelských dat. Vyžaduje přidání instrumentace do klientského kódu, jak je popsáno v tomto článku. Nakonec budete potřebovat mechanismus vytváření sestav pro analýzu dat. Doporučujeme použít Power BI, ale můžete použít řídicí panel aplikace nebo jakýkoli nástroj, který se připojuje ke službě Application Přehledy.

Poznámka

Vzor popsaný v tomto článku je pro pokročilé scénáře a data clickstream vygenerovaná kódem, který přidáte do klienta. Oproti tomu protokoly služby se naopak zadat bez kódu. Povolení protokolování se doporučuje ve všech scénářích. Další informace najdete v tématu Shromažďování a analýza dat protokolu.

Identifikace relevantních vyhledávacích dat

Pokud chcete mít užitečné metriky pro analýzu provozu vyhledávání, je potřeba protokolovat některé signály od uživatelů vaší vyhledávací aplikace. Tyto signály signalizuje obsah, který uživatele zajímá a který považují za relevantní. K analýzám provozu vyhledávání patří:

  • Uživatelem generované události vyhledávání: Zajímavé jsou pouze vyhledávací dotazy iniciované uživatelem. Jiné žádosti o vyhledávání, například ty, které se používají k naplnění vlastností nebo načítání interních informací, nejsou důležité. Nezapomeňte instrumentovat pouze uživatelem iniciované události, abyste se vyhnuli nekose nebo odchylkám ve výsledcích.

  • Uživatelem generované události kliknutí: Událost kliknutí na stránce výsledků hledání obecně znamená, že dokument je relevantním výsledkem konkrétního vyhledávacího dotazu.

Propojením událostí hledání a kliknutí s ID korelace získáte hlubší přehled o tom, jak dobře funkce hledání vaší aplikace provádí.

Přidání analýzy provozu vyhledávání

Na stránce portálu vaší služby Azure Cognitive Search otevřete stránku Vyhledávání Analýza provozu která vám umožní získat přístup k taháku pro využití tohoto vzoru telemetrie. Na této stránce můžete vybrat nebo vytvořit prostředek Application Přehledy, získat instrumentační klíč, kopírovat fragmenty kódu, které si můžete přizpůsobit pro své řešení, Power BI stáhnout sestavu Power BI vytvořenou prostřednictvím schématu, která se odráží ve vzoru.

Vyhledávací Analýza provozu na portálu

1. Nastavení nastavení Přehledy

Vyberte existující prostředek application Přehledy nebo vytvořte nový, pokud ho ještě nemáte. Pokud použijete stránku Analýza provozu, můžete zkopírovat instrumentační klíč, který vaše aplikace potřebuje pro připojení k aplikaci Přehledy.

Jakmile budete mít prostředek Application Přehledy, můžete aplikaci zaregistrovat podle pokynů pro podporované jazyky a platformy. Registrace znamená jednoduše přidání instrumentačního klíče z application Přehledy do kódu, který nastaví přidružení. Klíč najdete na portálu nebo na stránce Hledat Analýza provozu, když vyberete existující prostředek.

Zástupce, který funguje pro některé Visual Studio typy projektů, se projeví v následujících krocích. Vytvoří prostředek a zaregistruje aplikaci několika kliknutími.

  1. Pro Visual Studio a ASP.NET řešení otevřete řešení a vyberte Project > Přidat telemetrii Přehledy aplikace.

  2. Klikněte na Začít.

  3. Zaregistrujte aplikaci tak, že účet Microsoft, předplatné Azure a prostředek služby Application Přehledy (výchozí je nový prostředek). Klikněte na Zaregistrovat.

V tuto chvíli je vaše aplikace nastavená pro monitorování aplikací, což znamená, že se všechna načtení stránky sledují s výchozími metrikami. Další informace o předchozích krocích najdete v tématu Povolení Přehledy telemetrie na straně serveru.

2. Přidání instrumentace

V tomto kroku instrumentovat vlastní vyhledávací aplikaci pomocí prostředku Application Přehledy, který jste vytvořili v kroku výše. Tento proces se musí provést ve čtyřech krocích, počínaje vytvořením klienta telemetrie.

Krok 1: Vytvoření klienta telemetrie

Vytvořte objekt, který odesílá události do třídy Application Přehledy. Instrumentaci můžete přidat do kódu aplikace na straně serveru nebo kódu na straně klienta spuštěného v prohlížeči, vyjádřené zde jako varianty jazyka C# a JavaScript (pro jiné jazyky najdete úplný seznam podporovaných platforem a architektur. Zvolte přístup, který vám poskytne požadovanou hloubku informací.

Telemetrie na straně serveru zachycuje metriky v aplikační vrstvě, například v aplikacích spuštěných jako webová služba v cloudu nebo jako místní aplikace v podnikové síti. Telemetrie na straně serveru zachycuje události hledání a kliknutí, pozici dokumentu ve výsledcích a informace o dotazech, ale shromažďování dat bude vymezeno na informace dostupné v této vrstvě.

V klientovi můžete mít další kód, který manipuluje se vstupy dotazů, přidává navigaci nebo zahrnuje kontext (například dotazy iniciované z domovské stránky a stránky produktu). Pokud toto řešení popisuje, můžete zvolit instrumentaci na straně klienta, aby telemetrie odrážela další podrobnosti. Způsob, jakým se tyto další podrobnosti shromažďují, jdou nad rámec tohoto modelu, ale další pokyny najdete v tématu Přehledy pro webové stránky.

Použití jazyka C#

V jazyce C# by měl být instrumentační klíč definovaný v konfiguraci vaší aplikace, například appsettings.json, pokud je váš projekt ASP.NET. Pokud si nejste jistí umístěním klíče, vraťte se k pokynům k registraci.

private static TelemetryClient _telemetryClient;

// Add a constructor that accepts a telemetry client:
public HomeController(TelemetryClient telemetry)
{
    _telemetryClient = telemetry;
}

Použití JavaScriptu

Aktuální fragment kódu (uvedený níže) je verze 5, verze je kódovaná ve fragmentu kódu jako sv:"#" a aktuální verze je k dispozici také na GitHub.

<script type="text/javascript">
!function(T,l,y){var S=T.location,k="script",D="instrumentationKey",C="ingestionendpoint",I="disableExceptionTracking",E="ai.device.",b="toLowerCase",w="crossOrigin",N="POST",e="appInsightsSDK",t=y.name||"appInsights";(y.name||T[e])&&(T[e]=t);var n=T[t]||function(d){var g=!1,f=!1,m={initialize:!0,queue:[],sv:"5",version:2,config:d};function v(e,t){var n={},a="Browser";return n[E+"id"]=a[b](),n[E+"type"]=a,n["ai.operation.name"]=S&&S.pathname||"_unknown_",n["ai.internal.sdkVersion"]="javascript:snippet_"+(m.sv||m.version),{time:function(){var e=new Date;function t(e){var t=""+e;return 1===t.length&&(t="0"+t),t}return e.getUTCFullYear()+"-"+t(1+e.getUTCMonth())+"-"+t(e.getUTCDate())+"T"+t(e.getUTCHours())+":"+t(e.getUTCMinutes())+":"+t(e.getUTCSeconds())+"."+((e.getUTCMilliseconds()/1e3).toFixed(3)+"").slice(2,5)+"Z"}(),iKey:e,name:"Microsoft.ApplicationInsights."+e.replace(/-/g,"")+"."+t,sampleRate:100,tags:n,data:{baseData:{ver:2}}}}var h=d.url||y.src;if(h){function a(e){var t,n,a,i,r,o,s,c,u,p,l;g=!0,m.queue=[],f||(f=!0,t=h,s=function(){var e={},t=d.connectionString;if(t)for(var n=t.split(";"),a=0;a<n.length;a++){var i=n[a].split("=");2===i.length&&(e[i[0][b]()]=i[1])}if(!e[C]){var r=e.endpointsuffix,o=r?e.location:null;e[C]="https://"+(o?o+".":"")+"dc."+(r||"services.visualstudio.com")}return e}(),c=s[D]||d[D]||"",u=s[C],p=u?u+"/v2/track":d.endpointUrl,(l=[]).push((n="SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details)",a=t,i=p,(o=(r=v(c,"Exception")).data).baseType="ExceptionData",o.baseData.exceptions=[{typeName:"SDKLoadFailed",message:n.replace(/\./g,"-"),hasFullStack:!1,stack:n+"\nSnippet failed to load ["+a+"] -- Telemetry is disabled\nHelp Link: https://go.microsoft.com/fwlink/?linkid=2128109\nHost: "+(S&&S.pathname||"_unknown_")+"\nEndpoint: "+i,parsedStack:[]}],r)),l.push(function(e,t,n,a){var i=v(c,"Message"),r=i.data;r.baseType="MessageData";var o=r.baseData;return o.message='AI (Internal): 99 message:"'+("SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details) ("+n+")").replace(/\"/g,"")+'"',o.properties={endpoint:a},i}(0,0,t,p)),function(e,t){if(JSON){var n=T.fetch;if(n&&!y.useXhr)n(t,{method:N,body:JSON.stringify(e),mode:"cors"});else if(XMLHttpRequest){var a=new XMLHttpRequest;a.open(N,t),a.setRequestHeader("Content-type","application/json"),a.send(JSON.stringify(e))}}}(l,p))}function i(e,t){f||setTimeout(function(){!t&&m.core||a()},500)}var e=function(){var n=l.createElement(k);n.src=h;var e=y[w];return!e&&""!==e||"undefined"==n[w]||(n[w]=e),n.onload=i,n.onerror=a,n.onreadystatechange=function(e,t){"loaded"!==n.readyState&&"complete"!==n.readyState||i(0,t)},n}();y.ld<0?l.getElementsByTagName("head")[0].appendChild(e):setTimeout(function(){l.getElementsByTagName(k)[0].parentNode.appendChild(e)},y.ld||0)}try{m.cookie=l.cookie}catch(p){}function t(e){for(;e.length;)!function(t){m[t]=function(){var e=arguments;g||m.queue.push(function(){m[t].apply(m,e)})}}(e.pop())}var n="track",r="TrackPage",o="TrackEvent";t([n+"Event",n+"PageView",n+"Exception",n+"Trace",n+"DependencyData",n+"Metric",n+"PageViewPerformance","start"+r,"stop"+r,"start"+o,"stop"+o,"addTelemetryInitializer","setAuthenticatedUserContext","clearAuthenticatedUserContext","flush"]),m.SeverityLevel={Verbose:0,Information:1,Warning:2,Error:3,Critical:4};var s=(d.extensionConfig||{}).ApplicationInsightsAnalytics||{};if(!0!==d[I]&&!0!==s[I]){var c="onerror";t(["_"+c]);var u=T[c];T[c]=function(e,t,n,a,i){var r=u&&u(e,t,n,a,i);return!0!==r&&m["_"+c]({message:e,url:t,lineNumber:n,columnNumber:a,error:i}),r},d.autoExceptionInstrumented=!0}return m}(y.cfg);function a(){y.onInit&&y.onInit(n)}(T[t]=n).queue&&0===n.queue.length?(n.queue.push(a),n.trackPageView({})):a()}(window,document,{
src: "https://js.monitor.azure.com/scripts/b/ai.2.min.js", // The SDK URL Source
// name: "appInsights", // Global SDK Instance name defaults to "appInsights" when not supplied
// ld: 0, // Defines the load delay (in ms) before attempting to load the sdk. -1 = block page load and add to head. (default) = 0ms load after timeout,
// useXhr: 1, // Use XHR instead of fetch to report failures (if available),
crossOrigin: "anonymous", // When supplied this will add the provided value as the cross origin attribute on the script tag
// onInit: null, // Once the application insights instance has loaded and initialized this callback function will be called with 1 argument -- the sdk instance (DO NOT ADD anything to the sdk.queue -- As they won't get called)
cfg: { // Application Insights Configuration
    instrumentationKey: "<YOUR INSTRUMENTATION KEY>"
}});
</script>

Poznámka

Kvůli čitelnosti a omezení možných chyb JavaScriptu jsou všechny možné možnosti konfigurace uvedené na novém řádku výše v kódu fragmentu kódu. Pokud nechcete změnit hodnotu okomentované řádky, můžete ji odebrat.

Krok 2: Vyžádání ID vyhledávání pro korelaci

Pokud chcete korelovat požadavky hledání s kliknutími, je potřeba mít ID korelace, které souvisí s těmito dvěma odlišnými událostmi. Azure Cognitive Search vám poskytne ID vyhledávání, když si ho vyžádáte pomocí hlavičky PROTOKOLU HTTP.

Id vyhledávání umožňuje korelaci metrik vygenerované Azure Cognitive Search pro samotný požadavek s vlastními metrikami, které se přihlašují do služby Application Přehledy.

Použití jazyka C# (novější v11 SDK)

Nejnovější sada SDK vyžaduje použití kanálu HTTP k nastavení hlavičky, jak je podrobně uvedené v této ukázce.

// Create a custom policy to add the correct headers
public class SearchIdPipelinePolicy : HttpPipelineSynchronousPolicy
{
    public override void OnSendingRequest(HttpMessage message)
    {
        message.Request.Headers.SetValue("x-ms-azs-return-searchid", "true");
    }
}
// This sample uses the .NET SDK https://www.nuget.org/packages/Azure.Search.Documents

SearchClientOptions clientOptions = new SearchClientOptions();
clientOptions.AddPolicy(new SearchIdPipelinePolicy(), HttpPipelinePosition.PerCall);

var client = new SearchClient("<SearchServiceName>", "<IndexName>", new AzureKeyCredential("<QueryKey>"), options: clientOptions);

Response<SearchResults<SearchDocument>> response = await client.SearchAsync<SearchDocument>(searchText: searchText, searchOptions: options);
string searchId = string.Empty;
if (response.GetRawResponse().Headers.TryGetValues("x-ms-azs-searchid", out IEnumerable<string> headerValues))
{
    searchId = headerValues.FirstOrDefault();
}

Použití jazyka C# (starší verze sady SDK v10)

// This sample uses the .NET SDK https://www.nuget.org/packages/Microsoft.Azure.Search

var client = new SearchIndexClient(<SearchServiceName>, <IndexName>, new SearchCredentials(<QueryKey>));

// Use HTTP headers so that you can get the search ID from the response
var headers = new Dictionary<string, List<string>>() { { "x-ms-azs-return-searchid", new List<string>() { "true" } } };
var response = await client.Documents.SearchWithHttpMessagesAsync(searchText: searchText, searchParameters: parameters, customHeaders: headers);
string searchId = string.Empty;
if (response.Response.Headers.TryGetValues("x-ms-azs-searchid", out IEnumerable<string> headerValues))
{
    searchId = headerValues.FirstOrDefault();
}

Použití JavaScriptu (volání rozhraní REST API)

request.setRequestHeader("x-ms-azs-return-searchid", "true");
request.setRequestHeader("Access-Control-Expose-Headers", "x-ms-azs-searchid");
var searchId = request.getResponseHeader('x-ms-azs-searchid');

Krok 3: Události prohledávání protokolu

Pokaždé, když uživatel vydá žádost o vyhledávání, byste ji měli protokolovat jako událost hledání s následujícím schématem pro vlastní událost Přehledy aplikace. Nezapomeňte protokolovat pouze uživatelem generované vyhledávací dotazy.

  • SearchServiceName:(string) název vyhledávací služby
  • SearchId:(guid) jedinečný identifikátor vyhledávacího dotazu (dodává se v odpovědi hledání)
  • IndexName:(řetězec) index vyhledávací služby, který se má dotazovat
  • QueryTerms:(řetězec) hledaný termín zadaný uživatelem
  • ResultCount:(int) počet vrácených dokumentů (dodává se v odpovědi hledání)
  • ScoringProfile: (řetězec) název použitého hodnotiovacího profilu, pokud se používá

Poznámka

Vyžádejte si počet dotazů generovaných uživatelem přidáním parametru $count=true do vyhledávacího dotazu. Další informace najdete v tématu Hledání dokumentů (REST).

Použití jazyka C#

var properties = new Dictionary <string, string> 
{
    {"SearchServiceName", <service name>},
    {"SearchId", <search Id>},
    {"IndexName", <index name>},
    {"QueryTerms", <search terms>},
    {"ResultCount", <results count>},
    {"ScoringProfile", <scoring profile used>}
};
_telemetryClient.TrackEvent("Search", properties);

Použití JavaScriptu

appInsights.trackEvent("Search", {
  SearchServiceName: <service name>,
  SearchId: <search id>,
  IndexName: <index name>,
  QueryTerms: <search terms>,
  ResultCount: <results count>,
  ScoringProfile: <scoring profile used>
});

Krok 4: Protokolování událostí kliknutí

Pokaždé, když uživatel klikne na dokument, je to signál, který se musí protokolovat pro účely analýzy vyhledávání. K protokolování Přehledy událostí s následujícím schématem použijte vlastní události application Přehledy:

  • ServiceName:(string) název vyhledávací služby
  • SearchId:(guid) jedinečný identifikátor souvisejícího vyhledávacího dotazu
  • DocId:(řetězec) identifikátor dokumentu
  • Pozice:(int) pořadí dokumentu na stránce výsledků hledání

Poznámka

Pozice odkazuje na kardinalitu v aplikaci. Toto číslo můžete volně nastavit, pokud je vždy stejné, aby bylo možné provést porovnání.

Použití jazyka C#

var properties = new Dictionary <string, string> 
{
    {"SearchServiceName", <service name>},
    {"SearchId", <search id>},
    {"ClickedDocId", <clicked document id>},
    {"Rank", <clicked document position>}
};
_telemetryClient.TrackEvent("Click", properties);

Použití JavaScriptu

appInsights.trackEvent("Click", {
    SearchServiceName: <service name>,
    SearchId: <search id>,
    ClickedDocId: <clicked document id>,
    Rank: <clicked document position>
});

3. Analýza v Power BI

Po instrumentování aplikace a ověření correctly connected to Application Přehledy (Aplikace Přehledy) si stáhnete předdefinovanou šablonu sestavy pro analýzu dat v Power BI desktopu. Sestava obsahuje předdefinované grafy a tabulky, které jsou užitečné pro analýzu dalších dat zachycených pro analýzu provozu vyhledávání.

  1. V levém Azure Cognitive Search řídicího panelu klikněte v části Nastavení na Prohledat analýzu provozu.

  2. Na stránce Prohledat analýzu provozu klikněte v kroku 3 na získat Power BI Desktop a nainstalujte Power BI.

    Získání Power BI sestav

  3. Na stejné stránce klikněte na Stáhnout Power BI sestavu.

  4. Sestava se otevře v Power BI Desktop a zobrazí se výzva k připojení k aplikaci Přehledy a zadání přihlašovacích údajů. Informace o připojení najdete na Azure Portal vašich aplikačních Přehledy prostředků. Jako přihlašovací údaje zadejte stejné uživatelské jméno a heslo, které používáte pro přihlášení na portál.

    Připojte se k Application Insights

  5. Klikněte na Načíst.

Sestava obsahuje grafy a tabulky, které vám pomůžou dělat informovanější rozhodnutí, abyste zlepšili výkon a relevance hledání.

Metriky zahrnovaly následující položky:

  • Objem hledání a nejoblíbenější páry termínů a dokumentů: termíny, které mají za následek kliknutí na stejný dokument, seřazené podle kliknutí.
  • Hledání bez kliknutí: výrazy pro dotazy s nejvyšším ohledem na to, že se neregistruje žádná kliknutí

Následující snímek obrazovky ukazuje, jak může vypadat integrovaná sestava, pokud jste použili všechny prvky schématu.

Power BI řídicí panel pro Azure Cognitive Search

Další kroky

Instrumentovat vyhledávací aplikaci k získání výkonných a přehledných dat o vyhledávací službě

Další informace o službě Application Přehledy najdete na stránce s cenami, kde najdete další informace o různých úrovních služby.

Přečtěte si další informace o vytváření úžasných sestav. Podrobnosti najdete v Power BI Desktop s aplikacemi.