Abfrageverfeinerung in SharePoint

In diesem Artikel erfahren Sie, wie Sie die SharePoint-Features zur Abfrageeinschränkung bei der Arbeit mit Suchabfragen und Suchergebnissen programmgesteuert einsetzen können.

Mithilfe von Features zur Abfrageeinschränkung können Sie Endbenutzern passende Einschränkungsoptionen für ihre Abfragen bereitstellen. Die Features erlauben es Endbenutzern, Suchergebnisse anhand von spezifisch für die Ergebnisse berechneten Einschränkungsdaten detaillierter einzugrenzen. Die Einschränkungsdaten werden von der Indexkomponente berechnet, basierend auf aggregierten Statistiken zu den verwalteten Eigenschaften aller Ergebnisse einer Suchabfrage.

Die Abfrageeinschränkung wird typischerweise für Metadaten verwendet, die den indizierten Elementen zugeordnet sind, z. B. das Erstellungsdatum, der Autor und Personennamen, die in dem Element vorhanden sind. Mit den entsprechenden Einschränkungsoptionen können Sie eine Abfrage so präzisieren, dass nur Elemente dargestellt werden, die innerhalb einer bestimmten Zeitspanne erstellt wurden oder einen bestimmten Dateityp aufweisen.

Verwenden von Einschränkungen im Abfrageobjektmodell

An der Abfrageeinschränkung sind zwei Abfragen beteiligt:

  1. Sie können anfordern, dass eine Gruppe von Einschränkungen in den Suchergebnissen zurückgegeben wird, indem Sie der Abfrage des Endbenutzers eine Einschränkungsspezifikation hinzufügen . Eine Einschränkungsspezifikation ist die Eingabe für die Refiners -Eigenschaft. Diese Abfrage wird gegen den Suchindex ausgeführt. Die Suchergebnisse bestehen aus relevanten Ergebnissen und Einschränkungsdaten.
  2. Sie können die Einschränkungsdaten verwenden, um einen Drilldown in die Suchergebnisse auszuführen, indem Sie eine eingeschränkte Abfrage erstellen. Fügen Sie der Abfrage die RefinementFilters-Eigenschaft hinzu, damit die endgültigen Suchergebnisse sowohl die Anforderungen des ursprünglichen Abfragetexts des Endbenutzers als auch der ausgewählten Einschränkungsoption aus den Einschränkungsdaten erfüllen.

In den folgenden Abschnitten werden diese Schritte ausführlich beschrieben un Codebeispiele bereitgestellt.

Hinzufügen von Einschränkungen zu der Abfrage des Benutzers mithilfe von Einschränkungsspezifikationen

Sie können die angeforderten Abfrageeinschränkung mithilfe der Refiners-Eigenschaft der KeywordQuery-Klasse angeben. Verwenden Sie die folgende Syntax, um die angeforderten Abfrageeinschränkungen anzugeben:

<refiner>[,<refiner>]*

Jede refiner weist das folgende Format auf:

<refiner-name>[(parameter=value[,parameter=value]*)]?

Dabei gilt Folgendes:

  • <refiner-name> ist der Name der verwalteten Eigenschaft, die der Einschränkung zugeordnet ist. Diese verwaltete Eigenschaft muss im Suchschema auf Refinable oder Sortable festgelegt sein.
  • Die optionale Liste von parameter=value-Paaren gibt die nicht standardmäßigen Konfigurationswerte für die benannte Einschränkung an. Wenn ein Parameter für eine Einschränkung nicht innerhalb der Klammern aufgeführt ist, erhalten Sie von der Suchschemakonfiguration die Standardeinstellung. In Tabelle 1 sind mögliche Werte für die parameter=value-Paare aufgeführt.

Hinweis

Bei der Angabe von Einschränkungen müssen Sie zumindest einen Wert refiner-name angeben, also eine verwaltete Eigenschaft.

Beispiel

Refiners = "FileType"

Sie können auch die erweiterte Syntax verwenden, um die Einschränkungseinstellungen anzupassen:

Refiners = "FileType,Write(discretize=manual/2013-01-01/2013-08-22/2013-09-15/2013-09-21/2013-09-22),companies"

Tabelle 1: Liste von Parametern für Einschränkungen

Parameter Beschreibung
deephits
Überschreibt die standardmäßige Anzahl von Treffern, die als Grundlage für die Berechnung der Einschränkung verwendet wird. Wenn Einschränkungen erstellt werden, werden alle Ergebnisse für die Abfrage ausgewertet. Bei Verwendung dieses Parameters wird in der Regel die Suchleistung verbessert.
Syntax
deephits=<integer value>
Beispiel
price(deephits=1000)
Hinweis: Dieses Limit gilt innerhalb jeder Indexpartition. Da die Aggregation über alle Suchpartitionen hinweg durchgeführt wird, liegt die Anzahl der tatsächlich ausgewerteten Treffer höher als dieser Wert.
discretize
Legt benutzerdefinierte Intervalle (Einschränkungsbins) für numerische Einschränkungen fest.
Syntax
discretize=manual/<threshold>/<threshold>[/<threshold>]*
Beispiel
write(discretize=manual/2013-01-01/2013-08-22/2013-09-15/2013-09-21/2013-09-22)
Das Attribut <threshold> gibt den Schwellenwert für die einzelnen Einschränkungsbins an.
Es gibt ein Intervall für alle Elemente unterhalb des ersten angegebenen Schwellenwerts, ein Intervall zwischen jedem aufeinanderfolgenden Schwellenwert, und ein Intervall für alle Elemente überhalb dem letzten Schwellenwert.
Für eine Einschränkung des Typs DateTime geben Sie den Schwellenwert gemäß einem der folgenden ISO 8601-kompatiblen Formate an:
  • YYYY-MM-DD
  • YYYY-MM-DDThh:mm:ss
  • YYYY-MM-DDThh:mm:ss:Z
Die Formatwerte geben Folgendes an:
  • YYYY - Vierziffrige Jahresangabe. Es werden nur vierziffrige Jahresangaben unterstützt.
  • MM - Zweiziffriger Monat. 01 = Januar.
  • DD - Zweiziffriger Tag des Monats (01 bis 31).
  • T - Den Buchstaben „T".
  • hh - Zweiziffrige Stundenangabe (00 bis 23). Die Angabe von A.M. oder P.M. ist nicht zulässig.
  • mm - Zweiziffrige Minutenangabe (00 bis 59).
  • ss - zweiziffrige Sekundenangabe (00 bis 59)
Wichtig: Alle Datums-/Uhrzeitwerte müssen gemäß der UTC-Zone (Coordinated Universal Time, koordinierte Weltzeit) angegeben werden, die auch als Greenwich Mean Time (GMT) bezeichnet wird. Der Bezeichner für die UTC-Zeitzone (ein nachstehendes „Z“) ist optional.
sort
Legt die Sortierreihenfolge der Bins in einer Einschränkung des Typs „String“ fest.
Syntax
sort=<property>/<direction>
Die Attribute tun Folgendes:
  • <property>: Gibt den Sortierungsalgorithmus an. Gültig sind die unten aufgeführten Werte (klein geschrieben).
    • frequency - Sortiert nach Anzahl der Vorkommen innerhalb der Bins.
    • name - Anordnung nach Bezeichnungsname.
    • number - Behandelt die Zeichenfolgen als numerisch und verwendet die numerische Sortierung. Dieser Wert kann hilfreich sein, um diskrete Werte anzugeben, beispielsweise, um eine numerische Sortierung für einen Wert auszuführen, der in einer verwalteten Eigenschaft des Typs String enthalten ist.
  • <direction>: Gibt die Sortierrichtung an. Gültig sind die unten aufgeführten Werte (klein geschrieben).
    • descending
    • ascending
Beispiel
sort=name/ascending
Standard: frequency/descending
filter
Definiert, wie Bins innerhalb einer Einschränkung des Typs String gefiltert werden, bevor sie an den Client zurückgegeben werden.
Syntax
filter=<bins>/<freq>/<prefix>[<levels>]
Die Attribute tun Folgendes:
  • <bins>: Gibt an, wie viele Bins maximal zurückgegeben werden.
    Verwenden Sie dieses Attribut nach der Sortierung der Bins innerhalb der Einschränkung, um nachfolgende Bins abzuschneiden. Bei bins=10 werden gemäß des angegebenen Sortieralgorithmus beispielsweise nur die ersten 10 Bins zurückgegeben.
  • <freq>: Beschränkt die Anzahl der zurückgegebenen Bins.
    Verwenden Sie dieses Attribut, um Bins zu entfernen, die nur selten vorkommen. freq=2 bedeutet beispielsweise, dass nur die Bins mit 2 oder mehr Mitgliedern zurückgegeben werden.
  • <prefix>: Legt fest, dass nur Bins zurückgegeben werden, deren Name mit dem angegebenen Präfix beginnt.
    Das Platzhalterzeichen „*" gibt alle Namen zurück.
    Beispiel
    filter=30/2/*
  • <levels>: Gibt die Taxonomieebenen an.
    Mithilfe dieses Attributs können Sie die Ausgabe hierarchischer Einschränkungen auf Basis von Taxonomieebenen filtern. Der Attributwert muss eine positive ganze Zahl n sein. Der Standardwert lautet n=0. Bei n>0 werden nur Einschränkungenseinträge zurückgegeben, die weniger als n Taxonomiepfadtrennzeichen ("/") enthalten. Wenn n=0 gesetzt ist, wird keine Ebenenfilterung angewendet. Das Ebenentrennzeichen ist ein Schrägstrich („/").
    Beachten Sie die Leistungskosten bei der Verwendung eines großen Taxonomienavigators. Die Filterung wird als Teil der Ergebnisverarbeitung durchgeführt.
Hinweis: Dieser Parameter wendet anwendungsspezifische ergebnisseitige Filterung an. Damit unterscheidet er sich vom Parameter „cutoff“, der aus Leistungsgründen Grenzwerte auf jede Indexpartition anwendet.
cutoff
Schränkt die Daten ein, die für tiefe Zeichenfolgeneinschränkungen übertragen und verarbeitet werden müssen. Sie können die Einschränkungen so konfigurieren, dass nur die relevantesten Werte (Bins) zurückgegeben werden.
Hinweis: Diese Trennfilterung wird innerhalb jeder Indexpartition ausgeführt. Damit unterscheidet sich dieser Parameter vom Parameter filter, der ausschließlich eine ergebnisseitige Filterung durchführt. Sie können die beiden Parameter miteinander kombinieren.
Syntax
cutoff=<frequency>/<minbins>/<maxbins>
Die Attribute tun Folgendes:
  • <maxbins>: Schränkt die Anzahl der Bins ein.
    Dieser Parameter schränkt die Anzahl eindeutiger Werte (Bins) ein, die für eine Einschränkung zurückgegeben werden. Dies ist die bevorzugte Methode, um die Suchleistung zu steigern, wenn Zeichenfolgeneinschränkungen mit einer großen Anzahl von Bins zurückgegeben werden. „0" bedeutet, dass der im Suchschema angegebene Standardwert verwendet wird.
  • <frequency>: Schränkt die Anzahl der Bins basierend auf der Häufigkeit ihres Vorkommens ein.
    Wenn die Anzahl der Vorkommnisse eines Einschränkungswerts in einem Resultset kleiner oder gleich dem Häufigkeitswert ist, wird der Einschränkungswert nicht zurückgegeben. „0" bedeutet, dass der Standardwert gemäß des Suchschemas verwendet wird.
  • <minbins>: Legt den Mindestwert für die häufigkeitsbasierte Einschränkung fest.
    Wenn die Anzahl eindeutiger Einschränkungswerte für die Abfrage niedriger als dieser Wert ist, wird keine Häufigkeitsabtrennung durchgeführt, und alle Einschränkungswerte werden von dieser Suchpartition zurückgegeben. Wenn eine Abtrennung nach Häufigkeit verwendet wird, kann dieser Parameter verwendet werden, um eine minimale Anzahl von eindeutigen Einschränkungswerten anzugeben, die zurückgegeben werden, unabhängig von der Anzahl von Vorkommnissen. Der Standarwert dieses Attributs ist „0"; dadurch wird angegeben, dass die Häufigkeitsabtrennung unabhängig von der Anzahl eindeutiger Navigatorwerte durchgeführt wird. „0" bedeutet, dass der im Indexschema angegebene Standardwert verwendet wird.
Hinweis: Verwenden Sie <Häufigkeit> und <Minbins> mit Bedacht. Wir empfehlen Ihnen, nur den Parameter <maxbins> zu verwenden.

Beispiel: Hinzufügen von Einschränkungen

Im folgenden CSOM-Beispiel wird gezeigt, wie drei Einschränkungen programmgesteuert angefordert werden: FileType, Write und Companies. Write stellt das Datum der letzten Änderung für das Element dar und verwendet die erweiterte Syntax, um Datums-/Uhrzeitbins mit fester Größe zurückzugeben.

using (var context = new ClientContext("http://<serverName>/<siteCollectionPath>"))
{
    var query = new KeywordQuery(context)
    {
        QueryText = "home",
        Refiners = "FileType,Write(discretize=manual/2013-01-01/2013-08-22/2013-09-
            15/2013-09-21/2013-09-22),companies"
    };

    var executor = new SearchExecutor(context);
    var results = executor.ExecuteQuery(query);

    context.ExecuteQuery();

    ResultTable relevantResultsTable = results.Value[0];
    ResultTable refinerResultsTable = results.Value[1];
    Console.WriteLine(refinerResultsTable.RowCount + " refinement options:");
    foreach (var refinementOption in refinerResultsTable.ResultRows)
    {
        Console.WriteLine("RefinerName: '{0}' RefinementName: '{1}'
            RefinementValue: '{2}' RefinementToken: '{3}' RefinementCount: '{4}'",
            refinementOption["RefinerName"],
            refinementOption["RefinementName"],
            refinementOption["RefinementValue"],
            refinementOption["RefinementToken"],
            refinementOption["RefinementCount"]
        );
    }
}

Verstehen der Einschränkungsdaten im Suchergebnis

Wenn Sie die Abfrageeinschränkung für eine verwaltete Eigenschaft in Ihrer Abfrage aktiviert haben, enthält das Abfrageergebnis Einschränkungsdaten, die in Einschränkungscontainer unterteilt sind. Diese Daten befinden sich in der RefinementResults-Tabelle ( RefinementResults ) innerhalb der ResultTableCollection . Ein Einschränkungscontainer stellt einen bestimmten Wert oder Wertbereich für die verwaltete Eigenschaft dar. Die RefinementResults-Tabelle enthält eine Zeile pro Einschränkungsbin und enthält die Spalten, wie in Tabelle 2 angegeben.

Tabelle 2: Für Einschränkungsbins zurückgegebene Daten

Parameter Beschreibung
RefinerName Der Name der Abfrageeinschränkung.
RefinementName Die Zeichenfolge, die das Einschränkungsbin darstellt. Diese Zeichenfolge wird in der Regel verwendet, wenn Einschränkungsoptionen für die Benutzer auf einer Suchergebnisseite präsentiert werden.
RefinementValue Eine implementierungsspezifische formatierte Zeichenfolge, die die Einschränkung darstellt. Diese Daten werden zum Debuggen zurückgegeben und sind normalerweise für den Client nicht erforderlich.
RefinementToken Eine Zeichenfolge, die das für RefinerName zu verwendende Einschränkungsbin darstellt, wenn Sie eine eingeschränkte Abfrage ausführen.
RefinementCount Die Anzahl der Ergebnisse für dieses Einschränkungsbin. Diese Daten stellen die Anzahl von Elementen (einschließlich Duplikaten) im Suchergebnis mit einem Wert für die angegebene verwaltete Eigenschaft dar, der in dieses Einschränkungsbin fällt.

Beispiel: Einschränkungsdaten

Tabelle 3 unten enthält zwei Zeilen mit Einschränkungsdaten. Die erste Zeile enthält Einschränkungsdaten für indizierte Elemente, wobei der Dateityp HTML ist. Die zweite Zeile enthält Einschränkungsdaten für indizierte Elemente, wobei der Zeitpunkt der letzten Bearbeitung zwischen 21.09.2013 und 22.09.2013 liegt.

Tabelle 3: Format und Inhalt der Einschränkungsdaten

RefinerName RefinementName RefinementValue RefinementToken RefinementCount
FileType HTML HTML "????68746d6c" 50553
Schreiben Von 2013-09-21T00:00:00Z bis 2013-09-22T00:00:00Z Von 2013-09-21T00:00:00Z bis 2013-09-22T00:00:00Z range(2013-09-21T00:00:00Z, 2013-09-22T00:00:00Z) 37

Erstellen einer Einschränkungsabfrage

Ein Suchergebnis stellt Einschränkungsoptionen in der Form von Zeichenfolgenwerten oder Wertebereichen dar. Jeder Zeichenfolgenwert oder numerische Wertebereich wird als Einschränkungsbin bezeichnet, und jeder Einschränkungsbin weist einen zugewiesenen RefinementToken-Wert auf. Eine Einschränkungsoption ist einer verwalteten Eigenschaft zugeordnet, die vom RefinerName-Wert bereitgestellt wird.

Sowohl der Wert RefinementToken als auch der Wert RefinerName ist verkettet, sodass eine refinement filter-Zeichenfolge erstellt wird. Diese Zeichenfolge stellt einen Filter dar, der verwendet werden kann, um Suchergebnisse so einzuschränken, dass nur Elemente enthalten sind, bei denen eine verwaltete Eigenschaft einen Wert innerhalb eines Einschränkungsbin aufweist. Kurz ausgedrückt:

refinement filter = <RefinerName>:<RefinementToken>

Sie können einen oder mehrere Einschränkungsfilter für eine eingeschränkte Abfrage bereitstellen, indem Sie der RefinementFilters-Eigenschaft der KeywordQuery-Klasse Einschränkungsfilter hinzufügen. Mit mehreren Einschränkungsfiltern können Sie einen Drilldown über mehrere Stufen in Suchergebnisse bereitstellen und eine Einschränkung auf Eigenschaften mit mehreren Werten anwenden. Sie können beispielsweise die Abfrage auf Elemente mit zwei Autoren einschränken, von denen jeder von einem Einschränkungsbin dargestellt wird, aber Elemente ausschließen, die nur einen der Autoren enthalten.

Beispiel 1: Erstellen einer eingeschränkten Abfrage für Dateien des Typs HTML

Das folgende CSOM-Beispiel demonstriert, wie Sie programmgesteuert eine Einschränkung implementieren können, die die Suchergebnisse ausschließlich auf Dateien des Typs HTML eingrenzt. Wie in Beispiel: Einschränkungsdaten erwähnt, ist RefinerName für Einschränkungsdaten im Zusammenhang mit dieser Einschränkungsoption auf Filetype und RefinementToken auf "???? 68746d6c".

using (var context = new ClientContext("http://<serverName>/<siteCollectionPath>"))
{
    var query = new KeywordQuery(context)
    {
        QueryText = "home"
    };

    query.RefinementFilters.Add("FileType:\\"????68746d6c\\"");
    var executor = new SearchExecutor(context);
    var results = executor.ExecuteQuery(query);

    context.ExecuteQuery();

    ResultTable relevantResultsTable = results.Value[0];
    var resultCount = 1;
    foreach (var relevantResult in relevantResultsTable.ResultRows)
    {
        Console.WriteLine("Relevant result number {0} has file type {1}.",
            resultCount, relevantResult["FileType"]);
            resultCount++;
    }
}

Beispiel 2: Erstellen einer eingeschränkten Abfrage auf Basis von zuvor abgerufenen Einschränkungsdaten

Im folgenden CSOM-Beispiel wird veranschaulicht, wie eine Abfrage mit einer Einschränkungsspezifikation ausgeführt wird, um Einschränkungsdaten zu erstellen, die anschließend zum Durchführen einer Einschränkung verwendet werden. In diesem Beispiel wird der Prozess simuliert, bei dem ein Benutzer die erste Einschränkungsoption auswählt.

using (var context = new ClientContext("http://<serverName>/<siteCollectionPath>"))
{
    // Step 1: Run the query with refiner spec to provide refinement data in search result
    var query = new KeywordQuery(context)
    {
        QueryText = "home",
        Refiners = "FileType,Write(discretize=manual/2013-01-01/2013-08-22/2013-09-15/2013-09-21/2013-09-22),companies"
    };

    Console.WriteLine("Run query '{0}' with refiner spec '{1}'.", query.QueryText, query.Refiners);
    var executor = new SearchExecutor(context);
    var results = executor.ExecuteQuery(query);
    context.ExecuteQuery();

    // The query has been run and we can now look at the refinement data, to view the
    // refinement options
    ResultTable relevantResultsTable = results.Value[0];
    ResultTable refinerResultsTable = results.Value[1];
    Console.WriteLine("Got back {0} refinement options in the result:",
        refinerResultsTable.RowCount);

    foreach (var refinementOption in refinerResultsTable.ResultRows)
    {
        Console.WriteLine("RefinerName: '{0}' RefinementName: '{1}'
            RefinementValue: '{2}' RefinementToken: '{3}' RefinementCount: '{4}'",
            refinementOption["RefinerName"],
            refinementOption["RefinementName"],
            refinementOption["RefinementValue"],
            refinementOption["RefinementToken"],
            refinementOption["RefinementCount"]
        );
    }

    // Step 2: Run the refined query with refinement filter to drill down into
    // the search results. This example uses the first refinement option in the refinement
    // data, if available. This simulates an end user selecting this refinement option.
    var refinementOptionArray = refinerResultsTable.ResultRows.ToArray();

    if (refinementOptionArray.Length > 0)
    {
        var firstRefinementOption = refinementOptionArray[6];
        // Construct the refinement filter by concatenation
        var refinementFilter = firstRefinementOption["RefinerName"] + ":" +
            firstRefinementOption["RefinementToken"];
        var refinedQuery = new KeywordQuery(context)
        {
            QueryText = query.QueryText
        };
        refinedQuery.RefinementFilters.Add(refinementFilter);
        refinedQuery.SelectProperties.Add("FileType");
        refinedQuery.SelectProperties.Add("Write");
        refinedQuery.SelectProperties.Add("Companies");
        Console.WriteLine("Run query '{0}' with refinement filter '{1}'",
            refinedQuery.QueryText, refinementFilter);
        var refinedResults = executor.ExecuteQuery(refinedQuery);
        context.ExecuteQuery();
        ResultTable refinedRelevantResultsTable = refinedResults.Value[0];
        var resultCount = 1;
        foreach (var relevantResult in refinedRelevantResultsTable.ResultRows)
        {
            Console.WriteLine("Relevant result number {0} has FileType='{1}',
                Write='{2}', Companies='{3}'",
                resultCount,
                relevantResult["FileType"],
                relevantResult["Write"],
                relevantResult["Companies"]
            );
            resultCount++;
        }
    }
}

Siehe auch

Sonstige Ressourcen