Abfrageeinschränkung 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.
Features zum Einschränken von Abfragen geben dem Benutzer relevante Einschränkungsoptionen für seine Abfragen an die Hand. Der Benutzer kann damit einen Drilldown in die Suchergebnisse ausführen, indem er für die Ergebnisse berechnete Einschränkungsdaten verwendet. Einschränkungsdaten werden durch die Indexkomponente basierend auf der Aggregation von Statistiken für verwaltete Eigenschaften für alle Ergebnisse einer Suchabfrage berechnet.
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:
- Sie können anfordern, dass eine Reihe von Einschränkungen in den Suchergebnissen zurückgegeben wird, indem Sie eine Einschränkungsspezifikation zu der Abfrage des Benutzers 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.
- 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 die RefinementFilters-Eigenschaft zu der Abfrage hinzu, sodass die endgültigen Suchergebnisse sowohl den Anforderungen des ursprünglichen Abfragetexts des Benutzers als auch der ausgewählten Einschränkungsoption aus den Einschränkungsdaten entspricht.
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änkungen 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 dieparameter=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: Diese Grenze gilt innerhalb jeder Indexpartition. Die tatsächliche Anzahl von Treffern, die ausgewertet werden, ist aufgrund der Aggregation über Suchpartitionen hinweg größer 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:
|
sort |
Legt die Sortierreihenfolge der Bins in einer Einschränkung des Typs „String“ fest. Syntax sort=<property>/<direction> Die Attribute tun Folgendes:
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:
|
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: Die Filterung auf Basis des Parameters „cutoff“ wird innerhalb jeder Indexpartition durchgefü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:
|
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änkungsbins unterteilt sind. Diese Daten befinden sich in der RefinementResults-Tabelle ( RefinementResults ) innerhalb der ResultTableCollection . Ein Einschränkungsbin stellt einen bestimmten Wert oder Wertebereich 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 angeben, 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 bereits im Abschnitt Beispiel: Einschränkungsdaten erwähnt, ist in den zu dieser Einschränkungsoption gehörenden Einschränkungsdaten der Parameter RefinerName auf Filetype gesetzt und der Parameter 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
- Konfigurieren der Eigenschaften des Einschränkungs-Webparts in SharePoint
- Übersicht über das Suchschema in SharePoint