Уточнение запросов в SharePoint
Узнайте, как использовать программное уточнение запросов SharePoint при работе с поисковыми запросами и результатами.
Функции уточнения запросов можно использовать для предоставления пользователям параметров уточнения, релевантных для их запросов. Пользователь может использовать данные уточнения, рассчитанные для результатов поиска, для их детализации. Данные уточнения рассчитываются компонентом индекса на основе объединенной статистики управляемых свойств для всех результатов поискового запроса.
Как правило уточнение запроса используется для метаданные, связанные с индексированных элементов, таких как Дата создания, автор или типов файлов, которые отображаются в элементе. С помощью параметров уточнения результатов поиска, можно уточнить запрос для отображения только элементы, созданные в течение определенного периода времени или отображаемые элементы только из определенного типа файлов.
Использование уточнений в объектной модели запросов
Состоит из двух запросов уточнение запроса:
- Можно запросить для набора уточнений возвращаемых в результатах поиска путем добавления спецификации уточнения запроса конечного пользователя. Спецификация уточнения имеет входные данные для свойства Refiners . Этот запрос будет выполняться для индекса поиска. Результаты поиска будет состоять из релевантные результаты и данных уточнения.
- Вы можете воспользоваться данными уточнения для детализации результатов поиска, создав уточненный запрос. Добавьте свойство RefinementFilters в запрос, чтобы окончательные результаты поиска соответствовали требованиям как исходного текста запроса пользователя, так и выбранного параметра уточнения данных уточнения.
В следующих разделах описываются эти действия подробно и предоставлены примеры кода.
Добавление уточнений в запросы конечных пользователей с помощью спецификаций уточнений
Можно указать уточнения запроса с помощью свойства Refiners класса KeywordQuery . Используйте следующий синтаксис для указания уточнения запроса:
<refiner>[,<refiner>]*
Каждое свойство refiner
имеет следующий формат:
<refiner-name>[(parameter=value[,parameter=value]*)]?
Где:
<refiner-name>
это имя управляемого свойства, связанного с уточнением. Это управляемое свойство должно иметь значение Refinable или Sortable в схеме поиска.- В необязательном списке пар
parameter=value
указаны значения конфигурации, отличные от значений по умолчанию, для именованного уточнения. Если параметр для уточнения не указан в скобках, конфигурация схемы поиска предоставляет параметр по умолчанию. В таблице 1 перечислены возможные значения для парparameter=value
.
Примечание
При указании уточнений необходимо как минимум указать имя управляемого свойства refiner-name
.
Пример
Refiners = "FileType"
Также можно использовать расширенный синтаксис, чтобы настроить параметры уточнения:
Refiners = "FileType,Write(discretize=manual/2013-01-01/2013-08-22/2013-09-15/2013-09-21/2013-09-22),companies"
Таблица 1. Список параметров для уточнений
Параметр | Описание |
---|---|
deephits |
Переопределяет по умолчанию число попаданий, который используется в качестве основы для уточнения вычислений. Когда производятся уточнений, будет выполняться вычисление всех результатов для запроса. Как правило с помощью этого параметра улучшит производительность поиска. Синтаксис deephits=<integer value> Пример price(deephits=1000) Примечание. Это ограничение применяется в пределах каждого раздела индекса. Фактическое число вычисленных совпадений будет больше, чем это значение из-за объединения в разделах поиска. |
discretize |
Задает нестандартные интервалы (контейнеры уточнения) для числовых уточнений. Синтаксис discretize=manual/<threshold>/<threshold>[/<threshold>]* Пример write(discretize=manual/2013-01-01/2013-08-22/2013-09-15/2013-09-21/2013-09-22) Атрибут <threshold> Задает пороговое значение для каждого контейнера уточнения. Существует один интервал для всех значений ниже первого заданного порогового значения, по одному интервалу между каждыми двумя последовательными пороговыми значениями и один интервал для всех значений выше последнего порогового значения. Для уточнения типа DateTime, пороговое значение указывается в соответствии с одним из следующих ISO 8601 форматами:
|
sort |
Определяет порядок сортировки контейнеров в уточнении строчного типа. Синтаксис sort=<property>/<direction> Атрибуты выполняют следующие действия:
sort=name/ascending Значение по умолчанию: Default frequency/descending. |
filter |
Определяет порядок фильтрации контейнеров в уточнении типа String перед их возвращением клиенту. Синтаксис filter=<bins>/<freq>/<prefix>[<levels>] Атрибуты выполняют следующие действия:
|
cutoff |
Ограничения для данных, который должен передаваться и обработки для уточнения глубокой строки. Вы можете настроить уточнения для возвращения только самые точные значения (контейнеры). Примечание. Эта ограничивающая фильтрация выполняется в пределах каждого раздела индекса. Это отличается от параметра filter, который выполняет только фильтрацию результатов. Эти два параметра можно применять совместно. Синтаксис cutoff=<frequency>/<minbins>/<maxbins> Атрибуты выполняют следующие действия:
|
Пример. Добавление уточнений
В следующем примере CSOM показано, как программно запросить три уточнения: FileType, Write и Companies. Write представляет дату последнего изменения элемента и использует расширенный синтаксис для возврата фиксированного размера ячеек даты и времени.
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"]
);
}
}
Понимание данных уточнения в результатах поиска
Если вы включили уточнение запроса для управляемого свойства в запросе, результат запроса содержит данные уточнения разделены на корзины уточнения. Эти данные находятся в таблице RefinementResults ( RefinementResults ) в ResultTableCollection . Одна ячейка уточнения представляет определенное значение или диапазон значений для управляемого свойства. Таблица RefinementResults содержит одну строку для каждого контейнера уточнения и содержит столбцы, как указано в таблице 2.
Таблица 2. Данные, возвращаемые для контейнеров уточнения
Параметр | Описание |
---|---|
RefinerName | Имя средства уточнения запросов. |
RefinementName | Строка, представляющая контейнера уточнения. Эта строка обычно используется при проведении параметры уточнения результатов поиска для пользователей на странице результатов поиска. |
RefinementValue | Форматированная строка от реализации, представляющий уточнение. Эти данные возвращаются для отладки и обычно не является обязательным для клиента. |
RefinementToken | Строка, представляющая контейнера уточнения для использования с RefinerName при выполнении уточненного запроса. |
RefinementCount | Количество результатов для этого контейнера уточнения. Число элементов (включая дубликатов) представляет эти данные в результатах поиска со значением для данного управляемого свойства, попадает в этом контейнера уточнения. |
Пример: уточняющие данные
В представленной ниже таблице 3 содержит две строки данных уточнения. Первая строка уточнения для сохранения данных индексированных элементов которой параметр тип файла имеет HTML-код. Второй строке содержит уточнения результатов поиска, данные для индексированных элементов, где время последнего изменения из 2013/09/21 до 2013/09/22.
Таблица 3. Формат и содержимое данных уточнения
RefinerName | RefinementName | RefinementValue | RefinementToken | RefinementCount |
---|---|---|---|---|
FileType | HTML | HTML | "????68746d6c" | 50553 |
Запись | С 2013-09-21T00:00:00Z до 2013-09-22T00:00:00Z | Из 2013-09-21T00:00:00Z до 2013-09-22T00:00:00Z | диапазон (2013-09-21T00:00:00Z 2013-09-22T00:00:00Z) | 37 |
Создание уточненного запроса
Результат поиска представляет параметры уточнения результатов поиска в виде строковые значения или диапазоны значений. Каждый строковое значение или числовое значение диапазона называется контейнера уточненияи каждой корзины уточнения имеет значение связанного RefinementToken. Параметр уточнения связан с управляемым свойством, предоставляемый значение RefinerName.
Как RefinementToken, так и RefinerName значения объединяются для создания refinement filter строки. Эта строка представляет фильтр, который можно использовать для ограничения элементов результатов поиска для включения только элементы которых управляемого свойства имеет значение внутри контейнера уточнения. В short:
refinement filter = <RefinerName>:<RefinementToken>
Уточняющие фильтры для уточненного запроса можно обеспечить путем добавления фильтров уточнения свойство RefinementFilters класса KeywordQuery . Несколько фильтров уточнения позволяют предоставьте многоуровневой перехода в результатах поиска, для применения уточнения на многозначные свойства. Например можно уточнить запрос для элементов, которые имеют два автора - каждый из которых представлен контейнера уточнения -, но исключить элементы, которые имеют только один из авторов.
Пример 1. Создание уточненного запроса для типов файлов HTML
В следующем примере CSOM показано, как программно выполнить уточнение, чтобы ограничить результаты поиска только HTML-файлами. Как упомянуто в разделе Пример: данные уточнения, в данных уточнения, связанных с этим вариантом уточнения, для RefinerName задано значение Filetype, а для RefinementToken — значение "????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++;
}
}
Пример 2. Создание уточненного запроса с помощью полученных ранее данных уточнения
В следующем примере CSOM показано, как выполнить запрос с помощью спецификации уточнения для создания данных уточнения, который впоследствии используется для выполнения уточнения результатов поиска. В этом примере моделирует процесс конечный пользователь при выборе первого параметра уточнения результатов поиска.
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++;
}
}
}