Сортировка результатов поиска в SharePoint
Программная сортировка результатов поиска (по рангу, по значению управляемого свойства, по формуле или в случайном порядке) с помощью объектной модели запросов в SharePoint.
Результаты поиска для SharePoint можно сортировать четырьмя способами:
Сортировка результатов поиска по рангу: позволяет сортировать результаты поиска по степени релевантности.
Сортировка результатов поиска по значению управляемого свойства: позволяет сортировать результаты поиска, на основе значения одного или нескольких управляемых свойств.
Сортировка результатов поиска по формуле: позволяет сортировать результаты поиска по формуле, указанной в запросе.
Сортировка результатов поиска в случайном порядке: позволяет сортировать результаты запроса в случайном порядке или добавлять случайный компонент порядок сортировки.
В этой статье основное внимание уделяется программной сортировке результатов поиска. Чтобы узнать, как сортировать результаты поиска с помощью правил запросов SharePoint, см. указанные ниже статьи.
Изменение ранжированных результатов поиска в управлении правилами запросов
Изменение ранжированных результатов поиска при создании правил запросов для управления веб-контентом
Задание сортировки в запросе
При использовании объектной модели запросов можно выбрать критерии сортировки, предоставив спецификацию сортировки с помощью свойства SortList класса KeywordQuery . Свойство SortList является типом SortCollection, который представляет коллекцию объектов Sort.
Объект Sort определяет способ сортировки результатов поиска; он состоит из значения, по которому требуется упорядочить результаты поиска (Свойство), и направления, в котором вы хотите упорядочить результаты (Направление). Направление относится к типу SortDirection() и может быть возрастающим или убывающим.
Если в SortList несколько значений, сортировка выполняется на основе последовательности, в которой отображаются значения. Это означает, что каждый объект Sort представляет уровень порядка сортировки. Любой последующий уровень не изменяет порядок результатов, отличный от предыдущего уровня, но может влиять на внутренний порядок результатов с одинаковыми значениями сортировки для предыдущих уровней.
Помимо объектной модели запросов SharePoint также предоставляет службу поиска REST, которую можно использовать для запросов индекса поиска с помощью клиента или мобильных приложений. Служба поиска REST поддерживает HTTP-запросы POST и GET. Дополнительные сведения о создании URI для этих запросов см. в разделе Запросы с помощью службы REST поиска.
Сортировка результатов поиска по рангу
По умолчанию результаты поиска сортируются по степени релевантности. Это означает, что SharePoint помещает наиболее релевантные результаты в начале набора результатов поиска. При сортировке по рангу результаты всегда выводятся в порядке убывания релевантности. Но вы можете изменить порядок сортировки на возрастающий с помощью SortDirection().
Также можно влиять на вычисление ранга в строке запроса одним из двух способов:
С помощью оператора XRANK, доступные в Справочник по синтаксису языка запросов по ключевым словам (KQL) и справочник по синтаксису языка запросов FAST (FQL). Применение условного ранга повышение с учетом Если условия запроса можно использовать XRANK.
Выбрав вес релевантности для динамического ранжирования. При использовании FQL, можно указать вес отдельных релевантности для каждого оператора STRING.
Сортировка результатов поиска по значению управляемого свойства
Можно задать сортировку результатов поиска на основе значения одного или нескольких управляемых свойств. Это означает, что SharePoint выполняет сортировку на основе всех результатов, соответствующих запросу.
Можно выполнять сортировку на основе текстовых и числовых свойств. Для текстовых свойств порядок сортировки основан на стандартной сортировке текстовой строки. С другой стороны, для числовых свойств (включая управляемые свойства типа DateTime) сортировка основана на числовом значении.
Пример
Следующем примере показано, как для сортировки результатов поиска с помощью Size управляемого свойства.
using (var context = new ClientContext("http://localhost"))
{
var query = new KeywordQuery(context)
{
QueryText = "home"
};
query.SortList.Add("Size", SortDirection.Descending);
var executor = new SearchExecutor(context);
var results = executor.ExecuteQuery(query);
context.ExecuteQuery();
foreach (var result in results.Value[0].ResultRows)
{
Console.WriteLine(result["Title"] + " Size:" + result["Size"]);
}
}
Кроме того, можно использовать REST API службы поиска для сортировки результатов поиска с использованием свойства Size с помощью указанного ниже вызова.
http://localhost/_api/search/query?querytext='home'&sortlist='size:descending'
Сортировка результатов поиска по формуле
Можно задать сортировку результатов поиска на основе спецификации, в которой значения для сортировки создаются с помощью математической формулы.
Сортировка по формуле компонента это расширение одноуровневая и многоуровневой сортировка функциональные возможности для результатов поиска. Позволяет задать формулу управляемого свойства в качестве критерия сортировки.
При сортировке по формуле можно применять математические операции к значению одного или нескольких управляемых свойств для каждого элемента в результатах запроса.
Ниже приведены примеры, которые можно реализовать с помощью формулы задание сортировки результатов поиска.
Алгоритм K ближайших соседей для классификации документов.
Евклидово или манхэттенское расстояние для расчета географических расстояний.
Предпочитаемое значение. Например, для сортировки документов на основании того, насколько сильно отличается значение данного управляемого свойства от предпочитаемого значения.
Сортировка по формуле компонента не включает контроля статистических динамических параметров ранга, таких как частота употребления или степень сходства.
Формула вычисляется слева направо и использует стандартный приоритет математических операторов. То есть функции и круглые скобки оцениваются первыми, операции умножения и деления выполняются следующими, а операции сложения и вычитания — последними.
Важно!
[!Важно!] Конечный результат формулы должен быть в диапазоне от 32-разрядное целое число со знаком. В противном случае порядок сортировки неверно.
Настройка формулы сортировки в запросе
В спецификации сортировки запроса указывается формула сортировки вместо управляемого свойства.
Спецификация сортировки имеет следующий формат: [formula:<sort-formula>]
В этом формате <формула сортировки> является выражением формулы сортировки.
Примечание.
Квадратные скобки являются частью синтаксиса спецификации сортировки.
Направление сортировки по умолчанию по убыванию. Можно также использовать формулу, которая сортирует в порядке возрастания значения, например, если формула указывает географических расстояний.
В следующем примере кода показано, как задать сортировки по формуле в порядке возрастания с помощью объектной модели запросов.
using (var context = new ClientContext("http://localhost"))
{
var query = new KeywordQuery(context)
{
QueryText = "home"
};
query.SortList.Add("[formula:abs(2000-size)]", SortDirection.Ascending);
var executor = new SearchExecutor(context);
var results = executor.ExecuteQuery(query);
context.ExecuteQuery();
foreach (var result in results.Value[0].ResultRows)
{
Console.WriteLine(result["Title"]);
}
}
Кроме того можно использовать для сортировки результатов поиска с помощью свойства Size с при следующем вызове Search REST API.
http://localhost/_api/search/query?querytext='home'&sortlist='[formula:abs(2000-size)]:ascending'
Использование управляемых свойств в формуле сортировки
Можно применять формулу сортировки для значений управляемых свойств типа Integer, Decimal, и Datetime(). Необходимо включить сортировку для указанного управляемого свойства в схеме поиска.
Для более управляемых свойств типа Decimal значение умножается на 10^(десятичные цифры) перед использованием в вычислении формулы.
Для управляемых свойств типа Datetime()(/previous-versions/office/developer/sharepoint-2010/ms500214(v%3Doffice.14)) значение преобразуется в число 100 наносекунд с 1 января 29000 г. до н.э., прежде чем использовать его в вычислении формулы. Количество дней в году: 366.
Выражения формулы сортировки
В таблице 1 перечислены функции, которые можно использовать в выражение формулы сортировки. Выражение не должно содержать пробелов.
Таблица 1. Функции для выражений формул сортировки
Function | Описание |
---|---|
+ |
Задает операцию сложения. |
- |
Задает операцию вычитания. |
* |
Задает операцию умножения. |
/ |
Задает деление. Примечание. По умолчанию деление на ноль вызывает исключение, а запрос возвращает сообщение об ошибке. С помощью оператора errtolast можно избежать ошибки запроса и вместо этого размещать элементы с ошибками в конце набора результатов. |
rank |
Специальное ключевое слово, представляющее динамический ранг элемента. Пример. abs(rank-100) В качестве критерия сортировки будет использоваться расстояние от значения ранга 100. |
[0-9.]+ |
Указывает, что числа можно задавать в формате целых значений или значений двойной точности. Примеры: 503, 3.14, 5.4352262 |
[a-z0-9]+] |
Указывает, что любые последовательность знаков, не распознается как имя функции обрабатывается как имя управляемого свойства. Необходимо включить сортировку для указанного управляемого свойства в схеме поиска. Пример: Определение управляемого свойства с именем height с включена сортировка. Это позволяет использовать «высота» в качестве выражения в формуле. Формула, будут использовать значение height управляемого свойства. |
( and ) |
Используется для группирования с целью обеспечения точного порядка вычислений. Пример: 4*(3+2) |
sqrt(n) |
Квадратный корень n. |
exp(n) |
Экспоненциальная функция, эквивалентная pow(2,71828182846,n) |
log(n) |
Естественный логарифм n. |
abs(n) |
Абсолютное значение n. |
ceil(n) |
Потолок n. То есть, если n не является целым числом, округление до следующего целого числа. Если n — целое число, используется значение n. |
floor(n) |
Пол n. То есть, если n не является целым числом, округляется вниз до следующего целого числа. Если n — целое число, используется значение n. |
round(n) |
Округление n до ближайшего четного целого числа. Также известно как "банковское округление" или "round-half-even". |
sin(n) |
Синус n радианов. |
cos(n) |
Косизон n радианов. |
tan(n) |
Тангенс n радианов. |
asin(n) |
Арксин, в радианах, n. |
acos(n) |
Арккозин, в радианах, n. |
atan(n) |
Арктангенс, в радианах, n. |
pow(x,y) |
Значение x , возведенное в степень y. Примечание. Значение y должно быть реальным числом. |
atan2(y,x) |
Арктангенс по двум аргументам от угла в радианах между положительным направлением оси x и указанной декартовой координатой (x,y). |
bucket(b,n1,n2,…) |
Оператор, который можно использовать для получения отдельных значений в указанных диапазонах распределения значений для выражения. Выражение b может быть управляемым свойством или любым другим выражением формулы. Аргументы n1, n2, ... представляют числовые пороговые значения. Можно указать любое число границ контейнеров. Примечание. Аргументы n1, n2, n3, ... необходимо упорядочить в следующем порядке: n1 < n2 < n3 < ... с n1 >= 0 . Указанное значение входного выражения b округляется вниз до ближайшей заданной числовой границы. Если указано значение меньше минимальной границы, результирующим значением будет ноль. |
errtolast(x) |
Оператор, который можно использовать для управления обработкой исключений формул; x может быть любым выражением формулы. Если вычисление этого выражения формулы ведет к математическому исключению для элемента в наборе результатов, например, к делению на ноль, эти элементы помещаются в конец списка сортировки, независимо от указанного направления сортировки. |
Характеристики производительности для сортировки по формуле
Использование формулы подразумевает, что вычисления формулы применяются ко всем соответствующим элементам в наборе результатов. Это значит, что производительность запроса зависит от числа соответствующих элементов.
Длинные формулы со многими операторами требуют больше времени на обработку, чем короткие формулы.
Использование сортировки по формуле для географических расстояний
Сортировку по формуле можно использовать для ранжирования на основании расстояний. Для этого требуется включить управляемые свойства, представляющие широту и долготу каждого элемента.
Например, можно использовать одну из следующих стандартных формул.
Манхэттенское расстояние.
Евклидово расстояние См. пример 2.
Формула haversine.
Важно!
Использование управляемых свойств типа Decimal или Float для представления значений широта и долгота.
Примеры
В приведенных ниже примерах показано, как задать формулу сортировки, с помощью объектной модели запросов.
Пример 1. Размещение элементов, значение управляемого свойства height которых ближе всего к 20, в начале набора результатов.
using (var context = new ClientContext("http://localhost"))
{
var query = new KeywordQuery(context)
{
QueryText = "home"
};
query.SortList.Add("[formula:abs(20-height)]", SortDirection.Ascending);
var executor = new SearchExecutor(context);
var results = executor.ExecuteQuery(query);
context.ExecuteQuery();
foreach (var result in results.Value[0].ResultRows)
{
Console.WriteLine(result["Title"]);
}
}
Кроме того можно использовать Search REST API для размещения элементов, которые имеют height управляемых свойств, наиболее близкого к 20 вверху списка результатов на следующий вызов.
http://localhost/_api/search/query?querytext='home'&sortlist='[formula:abs(20-height)]:ascending
Пример 2. Сортировка по true объемных евклидово из заданной позиции (например, положение пользователя) на основе сведений позицию, которая предоставляется в управляемых свойств latitude, longitude и height. Следующая формула позволяет трехмерной евклидово предположить, что базового положения представляет 50/100/200 (Широта и долгота и высота).
sqrt(pow(50-latitude,2)+pow(100-longitude,2)+pow(200-height,2))
Если вы хотите применить сортировку на основе расстояния (не сочетая расстояние с другими параметрами в формуле), можно удалить sqrt()
компонент, так как он не изменяет последовательность сортировки, но он повышает производительность запроса.
using (var context = new ClientContext("http://localhost"))
{
var query = new KeywordQuery(context)
{
QueryText = "home"
};
query.SortList.Add("[formula:pow(50-latitude,2)+pow(100-longitude,2)+pow(200-height,2)]", SortDirection.Ascending);
var executor = new SearchExecutor(context);
var results = executor.ExecuteQuery(query);
context.ExecuteQuery();
foreach (var result in results.Value[0].ResultRows)
{
Console.WriteLine(result["Title"]);
}
}
Пример 3. Round значения размера в сегменты, округления значения вниз до одно из следующих значений: 0, 5, 15, 50, 100; сортировать сначала наибольшего значения.
using (var context = new ClientContext("http://localhost"))
{
var query = new KeywordQuery(context)
{
QueryText = "home"
};
query.SortList.Add("[formula:bucket(size,5,15,50,100)]", SortDirection.Ascending);
var executor = new SearchExecutor(context);
var results = executor.ExecuteQuery(query);
context.ExecuteQuery();
foreach (var result in results.Value[0].ResultRows)
{
Console.WriteLine(result["Title"]);
}
}
Сортировка результатов поиска в случайном порядке
Существует и возможность сортировать результаты поиска в случайном порядке или добавлять случайный компонент в результаты сортировки.
Спецификация случайной сортировки имеет следующий формат: [random:seed=<seed>:hashfield=<managed property>]
Примечание.
Квадратные скобки являются частью синтаксиса спецификации сортировки.
В таблице 2 объясняются параметры спецификации сортировки в случайном порядке.
Табл. 2. Параметры спецификации сортировки в случайном порядке
Параметр | Описание | Required |
---|---|---|
Seed |
Начальное значение для создания случайного значения. Начальное значение — это входное значение для функции, которая создает случайное число. Это случайное число используется при окончательной сортировке. При использовании только начального значения вы получите случайно отсортированный результирующий набор запроса. Порядок сортировки для того же запроса (при использования того же начального значения) может изменяться после обновления индекса. |
Да |
Hashfield |
Управляемое свойство, которое используется в качестве значения хэш-функции для создания случайного значения. Этот параметр можно использовать, чтобы убедиться, что порядок сортировки для того же запроса (при использовании того же начального значения) не изменялся после обновления индекса. Управляемое свойство должно иметь тип Integer и значение Sortable(). В этом управляемом свойстве можно указать случайные или уникальные значения (например, порядковый номер, заполненный на этапе обработки элемента). |
Нет |
Если предоставляется одно и то же начальное значение для равнозначных запросов, то элементы будут упорядочиваться в одном и том же порядке. Это позволяет сохранять одинаковый порядок случайной сортировки при переходе по страницам результатов поиска. Чтобы сохранить один и тот же случайный порядок сортировки в случае, когда обновление индекса происходит неожиданно между запросами, используйте параметр hashfield.
Примеры
В приведенных ниже примерах показано, как задать сортировку в случайном порядке с помощью объектной модели запросов.
Пример 1. Сортировка весь результирующий набор в случайном порядке.
using (var context = new ClientContext("http://localhost"))
{
var query = new KeywordQuery(context)
{
QueryText = "home"
};
query.SortList.Add("[random:seed=5432]", SortDirection.Ascending);
var executor = new SearchExecutor(context);
var results = executor.ExecuteQuery(query);
context.ExecuteQuery();
foreach (var result in results.Value[0].ResultRows)
{
Console.WriteLine(result["Title"]);
}
}
Кроме того можно использовать API-Интерфейс REST поиска всей результаты сортируются в случайном порядке, с помощью следующих звонок.
http://localhost/_api/search/query?querytext='home'&sortlist='[random:seed=5432]:ascending
Пример 2. Сортировка весь результирующий набор в случайном порядке. Сохранение одной и той же в случайном порядке последовательности того же запроса с того же начального значения даже в том случае, если возникает коммутатору индекса. Настраиваемые управляемого свойства с именем hashvalue должен быть доступен в схеме поиска и заполнен случайного или последовательного числовых значений для всех индексированных элементов.
using (var context = new ClientContext("http://localhost"))
{
var query = new KeywordQuery(context)
{
QueryText = "home"
};
query.SortList.Add("[random:seed=6543:hashfield=hashvalue]", SortDirection.Ascending);
var executor = new SearchExecutor(context);
var results = executor.ExecuteQuery(query);
context.ExecuteQuery();
foreach (var result in results.Value[0].ResultRows)
{
Console.WriteLine(result["Title"]);
}
}