SharePoint 2013 Enterprise Search. Часть 2. Создание обработчика контента

Часть 1. Логическая архитектура поиска в SharePoint 2013
Часть 2. Создание дополнительного обработчика контента для поиска в SharePoint 2013

Поиск в SharePoint 2013 допускает наличие дополнительного обработчика контента при его индексировании. В этом посте я опишу процесс создания такого обработчика.

Дополнительный обработчик должен быть реализован в виде WCF-сервиса, который будет принимать указанные в его настройках входные свойства и возвращать выходные свойства.

Сначала небольшое введение про сами свойства. Они бывают двух видов: Свойства для обхода (Crawled Property) и Управляемые свойства (Managed Property).

Свойства для обхода (Crawled Property)

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

Свойства для обхода автоматически добавляются при создании новых столбцов в списках/библиотеках и их имена имеют следующий формат: **ows_**InternalName (InternalName - внутреннее имя поля). Свойство будет создано при обходе содержимого.

Свойства для обхода могут быть ассоциированы с управляемыми свойствами.

Получение списка свойств для обхода

Чтобы просмотреть список всех доступных свойств для обхода на странице администрирования поиска в разделе Queries and Results надо перейти по ссылке Search Schema:

SharePoint 2013 Managed|Crawled Propeties

SharePoint 2013 Managed|Crawled Propeties

Используя PowerShell, можно получить список с помощью командлета Get-SPEnterpriseSearchMetadataCrawledProperty примерно так:

$ssa = Get-SPEnterpriseSearchServiceApplication
Get-SPEnterpriseSearchMetadataCrawledProperty -SearchApplication $ssa

Управляемые свойства (Managed Property)

Управляемые свойства используются для уточнения результатов поиска, а также для управления моделью ранжирования содержимого.

Получение списка управляемых свойств

Просмотреть управляемые свойства можно там же где и свойства для обхода (см. выше).

Для получения списка управляемых свойств с помощью PowerShell, необходимо использовать командлет Get-SPEnterpriseSearchMetadataManagedProperty:

$ssa = Get-SPEnterpriseSearchServiceApplication
Get-SPEnterpriseSearchMetadataManagedProperty -SearchApplication $ssa

При создании дополнительного обработчика содержимого использоваться будут именно управляемые свойства (Managed Property).

Обработчик контента

Теперь перейдем к созданию самого обработчика. Для этого в Visual Studio создадим новый WCF-сервис аналогично инструкции на MSDN:

SharePoint 2013 Custom Content Processing Project

Метод ProcessItem(Item item)

В обработчик передается один аргумент типа Microsoft.Office.Server.Search.ContentProcessingEnrichment.Item. Вот его диаграмма:

Microsoft.Office.Server.Search.ContentProcessingEnrichment.Item

Microsoft.Office.Server.Search.ContentProcessingEnrichment.Item

Содержимое объекта item может выглядеть примерно вот так:

Чтение свойств индексируемого файла

Байты, представляющие индексируемое содержимое можно получить через свойство item.RawData. Остальные свойства, например имя файла ("FileName"), можно получить, используя следующий код:

// Имя свойства
var fileNamePropName = "FileName";
// Само свойство
var fileNameProp = item.ItemProperties.FirstOrDefault(p => p.Name == fileNamePropName);
// Значение свойства
var fileName = fileNameProp == null
                    ? string.Empty // По умолчанию string.Empty
                    : (string) fileNameProp.ObjectValue;

Сначала получаем экземпляр AbstractProperty и затем, если оно не равно null, получаем его значение. При это надо помнить, что вместо одного значения, можно получить массив, который будет содержать различные варианты этого значения. Например, свойство "Author" может быть представлено в виде массива, если значение ссылается на системную учетную запись (SHAREPOINT\System). В моем случае это были значения: "System account" и "Vitaly Zhukov".

Задание значений для выходных свойств

Класс AbstractProperty является абстрактным, поэтому для задания свойств не подходит. Здесь нам поможет класс Microsoft.Office.Server.Search.ContentProcessingEnrichment.PropertyTypes.Property<T>, унаследованное от AbstractProperty:

Microsoft.Office.Server.Search.ContentProcessingEnrichment.PropertyTypes.Property

Для примера предположим, что у нас есть управляемые свойства "ImageUrl" (ссылка на изображение товара) и "Category" (категория товара), которые будут заполняться исходя из содержимого индексированного файла. Оба свойства имеют текстовый тип. Задавать их значения можно примерно так:

// Ссылка на изображение
Property<string> imageUrl = new Property<string> {
    Name = "ImageUrl",
    Value = "http://site/images/image.png"
};
// Категория
Property<string> category = new Property<string> {
    Name = "Category",
    Value = "Телевизор"
};
// Добавляем свойства
processedItemHolder.ItemProperties.Add(imageUrl);
processedItemHolder.ItemProperties.Add(category);

Теперь эти свойства можно использовать для:

  • уточнения поиска (для этого подходят только управляемые свойства);
  • поиска, если они ассоциированы со свойствами для обхода;
  • вывода их значения в результатах поиска;

Еще раз про свойства обработчика

В обработчике могут быть использованы только управляемые свойства (Managed Property) для параметров InputProperties и OutputProperties. Входные свойства (InputProperties), будут переданы только те, которые указаны. Если их нет, то ничего передано не будет (никаких свойств с null-значениями). Выходные свойства (OutputProperties) можно передавать какие угодно, но в индекс попадут только те, которые явно указаны в параметрах обработчика. Между собой входные и выходные свойства никак не связаны, входные свойства можно вообще не передавать, а выходные формировать на основе файла, подлежащего индексации.

Регистрация обработчика

Созданный сервис можно зарегистрировать с помощью следующего PowerShell-скрипта (из MSDN):

# Получаем экземпляр службы поиска
$ssa = Get-SPEnterpriseSearchServiceApplication
# Получаем конфигурацию наполнения индекса
$config = New-SPEnterpriseSearchContentEnrichmentConfiguration
# Добавляем новый обработчик
$config.Endpoint = http:http://sp2013:54927/ContentProcessing.svc
# Указываем входные параметры. Их может не быть вовсе
$config.InputProperties = "Author", "Filename"
# Указываем выходные параметры
$config.OutputProperties = "Author"
# Указываем, передавать ли в обработчик индексируемый файл
$config.SendRawData = $True
# Максимальный размер передаваемого файла
$config.MaxRawDataSize = 8192
# Сохраняем конфигурацию в службе поиска
Set-SPEnterpriseSearchContentEnrichmentConfiguration –SearchApplication $ssa –ContentEnrichmentConfiguration $config

При задании конфигурации все краулеры должны быть остановлены, иначе вылетит исключение, примерно вот такое:

Set-SPEnterpriseSearchContentEnrichmentConfiguration : Cannot bind parameter 'ContentEnrichmentConfiguration'.
Cannot convert the "$ssa = Get-SPEnterpriseSearchServiceApplication" value of type "System.String" to
type "Microsoft.Office.Server.Search.Cmdlet.PipeBind.ContentEnrichmentConfigurationPipeBind".
At line:1 char:1
+ Set-SPEnterpriseSearchContentEnrichmentConfiguration -SearchApplication $ssa
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Set-SPEnterpris...ntConfiguration], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.Office.Server.Search.Cmdlet.SetContentEnrichmentConfiguration

Говорится в нем о несоответствии типа, хотя дело в другом.

Важным моментом является то, что дополнительный обработчик может быть только один. С одной стороны это хорошо - бардака в такой конфигурации просто быть не может, но и гибкость страдает.

Вывод управляемых свойств в результатах поиска

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

http://sharepointserver/_api/search/query/querytext='keyword'&selectproperties='ManagedPropertyName':

Подробнее про параметры запроса здесь.

Виталий Жуков

Виталий Жуков

SharePoint архитектор, разработчик, тренер, Microsoft MVP (Office Development). Более 15 лет опыта работы с SharePoint, Dynamics CRM, Office 365, и другими продуктами и сервисами Microsoft.

Смотрите также

Новый сайт группы SharePoint. Как это работает

Новый сайт группы SharePoint. Как это работает

SharePoint 2019 Preview

SharePoint 2019 Preview

Управление большими списками/библиотеками в SharePoint

Управление большими списками/библиотеками в SharePoint

SharePoint 2013/2016. Настройка хлебных крошек

SharePoint 2013/2016. Настройка хлебных крошек

SharePoint 2016. Кастомизация меню SuiteBar

SharePoint 2016. Кастомизация меню SuiteBar

SharePoint 2016. Кастомизация SuiteBar

SharePoint 2016. Кастомизация SuiteBar

Домашняя страница сайта SharePoint

Домашняя страница сайта SharePoint

Презентация и скрипты со встречи сообщества по SharePoint и Office 365

Презентация и скрипты со встречи сообщества по SharePoint и Office 365

PowerShell DSC. SharePoint

PowerShell DSC. SharePoint

PowerShell DSC. Сертификат для шифрования пароля

PowerShell DSC. Сертификат для шифрования пароля

PowerShell DSC. Учетные записи

PowerShell DSC. Учетные записи

Встреча сообщества по SharePoint и Office 365

Встреча сообщества по SharePoint и Office 365

SharePoint 2016. QR-code

SharePoint 2016. QR-code

Возможности SharePoint 2010/2013/2016

Возможности SharePoint 2010/2013/2016

Gmail IIS SMTP relay

Gmail IIS SMTP relay

SharePoint 2016. Извещения мозаикой

SharePoint 2016. Извещения мозаикой

Сертификация SharePoint по-новому

Сертификация SharePoint по-новому

SharePoint. Получение списка сайтов

SharePoint. Получение списка сайтов

Планирование фермы SharePoint

Планирование фермы SharePoint

Обзор SharePoint Education. Часть 3

Обзор SharePoint Education. Часть 3

SharePoint Excel Services. Отображение диаграммы на странице

SharePoint Excel Services. Отображение диаграммы на странице

SharePoint 2016 Release Candidate

SharePoint 2016 Release Candidate

Обзор SharePoint Education. Часть 2

Обзор SharePoint Education. Часть 2

Обзор SharePoint Education. Часть 1

Обзор SharePoint Education. Часть 1

SharePoint 2013 Образование. Установка и настройка

SharePoint 2013 Образование. Установка и настройка

SharePoint 2016 IT Preview

SharePoint 2016 IT Preview

SharePoint и SMS. Часть 2. Регистрация OMS-сервиса

SharePoint и SMS. Часть 2. Регистрация OMS-сервиса

SharePoint и SMS. Часть 1. Создание OMS веб-сервиса

SharePoint и SMS. Часть 1. Создание OMS веб-сервиса

SharePoint Day: 14 декабря, Москва

SharePoint Day: 14 декабря, Москва

RuSUG 17.10.2013. Презентация с моего доклада о новом поиске в SharePoint 2013

RuSUG 17.10.2013. Презентация с моего доклада о новом поиске в SharePoint 2013

SharePoint 2013 Ribbon API. Версии 14.3 и 15.4

SharePoint 2013 Ribbon API. Версии 14.3 и 15.4

Встреча RuSUG 17-го октября

Встреча RuSUG 17-го октября

SharePoint 2013. Служба ServiceDesk за 8 часов либо правильный проект

SharePoint 2013. Служба ServiceDesk за 8 часов либо правильный проект

SharePoint 2010/2013. Локализация данных

SharePoint 2010/2013. Локализация данных

Список возможностей SharePoint 2013

Список возможностей SharePoint 2013

SharePoint 2013. Типы полей

SharePoint 2013. Типы полей

SharePoint 2013 Enterprise Search. Часть 1. Логическая архитектура

SharePoint 2013 Enterprise Search. Часть 1. Логическая архитектура

SharePoint Ribbon. Создание многоуровневого меню

SharePoint Ribbon. Создание многоуровневого меню

SharePoint Ribbon. Использование ColorPicker'а

SharePoint Ribbon. Использование ColorPicker'а

Разработка для SharePoint. Как это было и как это будет

Разработка для SharePoint. Как это было и как это будет

SharePoint. История социализма за 10 лет

SharePoint. История социализма за 10 лет

SharePoint 2013 Preview

SharePoint 2013 Preview

Использование штрихкодов в SharePoint 2010

Использование штрихкодов в SharePoint 2010

Unable to locate the xml-definition for FieldName

Unable to locate the xml-definition for FieldName

SharePoint 2010. Апрельский накопительный пакет обновлений

SharePoint 2010. Апрельский накопительный пакет обновлений

Не удалось найти XML-файл в указанном расположении

Не удалось найти XML-файл в указанном расположении

Служба синхронизации профилей пользователей. Ошибки

Служба синхронизации профилей пользователей. Ошибки

Делаем сайт на SharePoint 2010. Построение иерархии страниц

Делаем сайт на SharePoint 2010. Построение иерархии страниц

Делаем сайт на SharePoint 2010. Брендинг Wiki-страниц

Делаем сайт на SharePoint 2010. Брендинг Wiki-страниц

Делаем сайт на SharePoint 2010. Оптимизация

Делаем сайт на SharePoint 2010. Оптимизация

Делаем сайт на SharePoint 2010. Брендинг

Делаем сайт на SharePoint 2010. Брендинг

Обработка большого количества элементов в SharePoint

Обработка большого количества элементов в SharePoint

Получение уникальных значений поля списка

Получение уникальных значений поля списка

DeskWork 5. Функциональность (продолжение)

DeskWork 5. Функциональность (продолжение)

Сокрытие информации о пользователе создавшем/изменившем элемент

Сокрытие информации о пользователе создавшем/изменившем элемент

Error : Code blocks are not allowed in this file

Error : Code blocks are not allowed in this file

SharePoint Client Object Model. Управляемый код

SharePoint Client Object Model. Управляемый код

Использование контрола HtmlEditor. Часть 3

Использование контрола HtmlEditor. Часть 3

SharePoint 15 SDK

SharePoint 15 SDK

PeopleEditor и Internet Explorer 9

PeopleEditor и Internet Explorer 9

Использование контрола HtmlEditor. Часть 2

Использование контрола HtmlEditor. Часть 2

Использование контрола HtmlEditor. Часть 1

Использование контрола HtmlEditor. Часть 1

Пропадающий контрол выбора представления списка

Пропадающий контрол выбора представления списка

Развертывание библиотеки документов с файлами

Развертывание библиотеки документов с файлами

Отключенные учетные записи и PeoplePicker

Отключенные учетные записи и PeoplePicker

Пропадающий TextBox в Telerik Reporting

Пропадающий TextBox в Telerik Reporting

Длительные операции в SharePoint. Request timed out

Длительные операции в SharePoint. Request timed out

Длительные операции в SharePoint. Изнутри

Длительные операции в SharePoint. Изнутри

Длительные операции в SharePoint. Снаружи

Длительные операции в SharePoint. Снаружи

DeskWork. Версия 5.1

DeskWork. Версия 5.1

DeskWork 5. Часть 2. Функциональность

DeskWork 5. Часть 2. Функциональность

DeskWork 5. Часть 1. Установка

DeskWork 5. Часть 1. Установка

SharePoint 2010. Random ListItem

SharePoint 2010. Random ListItem

Custom ListDefinition. Отключаем диалоги

Custom ListDefinition. Отключаем диалоги

SharePoint 2010 UpdatePanel. Request Notification

SharePoint 2010 UpdatePanel. Request Notification

Получение размера вложений SPListItem'а

Получение размера вложений SPListItem'а

SharePoint 2010. Переопределение форм типа содержимого

SharePoint 2010. Переопределение форм типа содержимого

SharePoint 2007/2010. Привязываем EventReceiver к типу содержимого

SharePoint 2007/2010. Привязываем EventReceiver к типу содержимого

Изменяем appSettings в config-файле

Изменяем appSettings в config-файле

SharePoint 2010. Добавляем сборку в пакет

SharePoint 2010. Добавляем сборку в пакет

SharePoint 2007/2010. The security validation for this form is invalid

SharePoint 2007/2010. The security validation for this form is invalid

SharePoint 2010. JavaScript IntelliSence

SharePoint 2010. JavaScript IntelliSence

SharePoint 2010. Локализация SiteDefinition

SharePoint 2010. Локализация SiteDefinition

SharePoint 2007. Получение данных из нескольких списков и узлов

SharePoint 2007. Получение данных из нескольких списков и узлов

SharePoint 2007. Максимальное/минимальное значение поля в списке

SharePoint 2007. Максимальное/минимальное значение поля в списке

SharePoint 2007. Свой контрол на панели свойств веб-парта

SharePoint 2007. Свой контрол на панели свойств веб-парта

SharePoint 2007. База данных содержимого

SharePoint 2007. База данных содержимого

SharePoint 2007. Проверка на наличие элемента в списке

SharePoint 2007. Проверка на наличие элемента в списке