Уточнение запросов в SharePoint

Узнайте, как использовать программное уточнение запросов SharePoint при работе с поисковыми запросами и результатами.

Функции уточнения запросов можно использовать для предоставления пользователям параметров уточнения, релевантных для их запросов. Пользователь может использовать данные уточнения, рассчитанные для результатов поиска, для их детализации. Данные уточнения рассчитываются компонентом индекса на основе объединенной статистики управляемых свойств для всех результатов поискового запроса.

Как правило уточнение запроса используется для метаданные, связанные с индексированных элементов, таких как Дата создания, автор или типов файлов, которые отображаются в элементе. С помощью параметров уточнения результатов поиска, можно уточнить запрос для отображения только элементы, созданные в течение определенного периода времени или отображаемые элементы только из определенного типа файлов.

Использование уточнений в объектной модели запросов

Состоит из двух запросов уточнение запроса:

  1. Можно запросить для набора уточнений возвращаемых в результатах поиска путем добавления спецификации уточнения запроса конечного пользователя. Спецификация уточнения имеет входные данные для свойства Refiners . Этот запрос будет выполняться для индекса поиска. Результаты поиска будет состоять из релевантные результаты и данных уточнения.
  2. Вы можете воспользоваться данными уточнения для детализации результатов поиска, создав уточненный запрос. Добавьте свойство 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 форматами:
  • YYYY-MM-DD
  • YYYY-MM-DDThh:mm:ss
  • YYYY-MM-DDThh:mm:ss:Z
Значения формата задают следующее.
  • YYYY - год из четырех цифр. Поддерживаются только цифрами.
  • MM - месяца из двух цифр. 01 = января.
  • DD - из двух цифр день месяца (от 01 до 31).
  • T буква "T".
  • hh - час из двух цифр (00 - 23). Указывает A.M. или P.M., не разрешено.
  • mm - из двух цифр минуты (от 00 до 59).
  • ss - из двух цифр второй (от 00 до 59).
Важно! Все значения даты и времени должны быть указаны в формате UTC, то есть по Гринвичу (GMT). Идентификатор зоны UTC (конечный знак "Z") является необязательным.
sort
Определяет порядок сортировки контейнеров в уточнении строчного типа.
Синтаксис
sort=<property>/<direction>
Атрибуты выполняют следующие действия:
  • <property> - указывает алгоритм сортировки. Допустимы следующие строчная значения:
    • frequency Сортировка в порядке появления в контейнерах.
    • name Сортировка по имени метки.
    • number - рассматривается как числовых строк и использует числовой сортировки. Это значение можно использовать для указания отдельных значений, например, чтобы выполнить сортировку числовые значения, содержащиеся в управляемое свойство типа String.
  • <direction> - указывает направление сортировки. Допустимы следующие строчная значения:
    • descending
    • ascending
Пример
sort=name/ascending
Значение по умолчанию: Default frequency/descending.
filter
Определяет порядок фильтрации контейнеров в уточнении типа String перед их возвращением клиенту.
Синтаксис
filter=<bins>/<freq>/<prefix>[<levels>]
Атрибуты выполняют следующие действия:
  • <bins> - указывает максимальное число возвращаемых контейнеров.
    После сортировки корзин в уточнении типа, этот атрибут используется для усечения все конечные ячейки. Например если ячейки = 10, возвращаются только первые 10 ячеек, в соответствии с указанным алгоритм сортировки.
  • <freq> - ограничивает число возвращаемых контейнеров.
    Этот атрибут используется для удаления контейнеров с низким значением счетчика частоты. Например, freq= 2 указывает, что только контейнеры с двумя или более членами возвращаются.
  • <prefix> — указывает, что возвращаются только контейнеры, имена которых начинаются с данного префикса.
    Подстановочный знак "*" будет соответствовать всем именам.
    Пример
    filter=30/2/*
  • <levels> - задает уровни таксономии.
    Этот атрибут используется для фильтрации иерархических выходных данных уточнения на основе уровней таксономии. Атрибут должен быть положительным целым числом n. Значение по умолчанию: n=0. Если n>0, будут возвращены только записи уточнения, содержащие менее n символов разделителя пути таксономии ("/"). Если n=0, фильтрация уровня не выполняется. Разделителем уровня является символ косой черты ("/").
    Необходимо учитывать издержки производительности при использовании большого навигатора таксономии. Фильтрация выполняется в процессе обработки результатов.
Примечание. Этот параметр применяет фильтрацию результатов на уровне приложения. Это отличается от параметра cutoff, который применяет ограничения в каждом разделе индекса для повышения производительности.
cutoff
Ограничения для данных, который должен передаваться и обработки для уточнения глубокой строки. Вы можете настроить уточнения для возвращения только самые точные значения (контейнеры).
Примечание. Эта ограничивающая фильтрация выполняется в пределах каждого раздела индекса. Это отличается от параметра filter, который выполняет только фильтрацию результатов. Эти два параметра можно применять совместно.
Синтаксис
cutoff=<frequency>/<minbins>/<maxbins>
Атрибуты выполняют следующие действия:
  • <maxbins> - ограничивает число контейнеров.
    Этот параметр ограничивает число уникальных значений (контейнеры), которые будут возвращены для уточнения. Это основной способ для повышения производительности поиска при возвращении уточнений строку с большим количеством ячеек. При значении «0» используется значение по умолчанию, заданное в схеме поиска.
  • <frequency> - ограничивает число контейнеров по частоте.
    Если число вхождений значения уточнения в результирующий набор меньше или равно значению frequency, значение уточнения не возвращается. При значении «0» используется значение по умолчанию определяется в схеме поиска.
  • <minbins> - задает минимальное значение ограничения по частоте.
    Если количество значений уникальных уточнения запроса меньше, чем это значение, не ограничения частота не выполняется и с этого раздела поиска возвращаются все значения уточнения. При использовании Отсечка по частоте этот параметр можно использовать для указания минимальное число уникальных уточнения значения, которые будут возвращены независимо от того, число вхождений. Значение по умолчанию этот атрибут является «0», которое указывает частоту сканирования выполняется независимо от количества уникальных навигатор значения. При значении «0» используется значение по умолчанию, заданное в схеме индекса.
Примечание. Используйте <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++;
        }
    }
}

См. также

Другие ресурсы