Sharepoint Search Scopes (Области поиска)

При поиске в Sharepoint возникает необходимость манипулирования областями поиска.

Как я уже писал ранее, области поиска редактируются на странице  http://SERVER_ADMIN/_layouts/viewscopesssp.aspx?mode=ssp

Области поиска

Области поиска

На это страничке создаём собственную область поиска (К примеру MyScope) и добавляем к ней правило (К примеру, если нам необходим поиск по записям SPList на сервере, то мы создаём Тип правила области — Запрос Свойства, в свойстве выбираем contentclass = STS_ListItem_101000, где 101000 — тип Вашего списка).

Теперь вы можете в поисковом запросе указывать на Вашу область и искать по её содержимому.

Если Вам необходимо использовать другие объекты узла sharepoint, воспользуйтесь следующей таблицей:

  • Search Query: urn:content-class:SPSSearchQuery
  • News Listing: urn:content-class:SPSListing:News
  • People: urn:content-class:SPSPeople
  • Category: urn:content-classes:SPSCategory
  • Listing: urn:content-classes:SPSListing
  • Person Listing: urn:content-classes:SPSPersonListing
  • Text Listing: urn:content-classes:SPSTextListing
  • Site Listing: urn:content-classes:SPSSiteListing
  • Site Registry Listing: urn:content-classes:SPSSiteRegistry
  • Site: STS_Web
  • List: STS_List
  • List Item: STS_ListItem
  • Events: STS_List_Events
  • Tasks: STS_List_Tasks
  • Announcements: STS_List_Announcements
  • Discussions: STS_List_DiscussionBoard
  • Contacts: STS_List_Contacts
  • Links: STS_List_Links
  • Document Library: STS_List_DocumentLibrary
  • Document Library Items: STS_ListItem_DocumentLibrary
  • Picture Library: STS_List_PictureLibrary
  • Picture Library Items: STS_ListItem_PictureLibrary
  • Site Collections: STS_Site

Соответствия скопированы здесь.

Реклама

Search in Sharepoint

Вот я и добрался до поиска в Sharepoint, скажу сразу, что поначалу всё очень запутанно и непросто.

Для начала немного выдержек из SDK:

Синтаксис запросов.

Классификация условно делится на работу с объектной моделью (ОМ) и веб-сервисом поиска.

Поиск в Windows SharePoint Services через ОМ поддерживает три типа синтаксиса для поддержки различных построителей запросов:

  1. Windows SharePoint Services Search Keyword Syntax (условия поиска передаются непосредственно в службу поиска)
  2. Windows SharePoint Services Search SQL Syntax (расширенный синтаксис SQL-диалекта запросов к базам данных)
  3. Windows SharePoint Services Search URL Syntax (все параметры отсылаются в URL и обрабатываеются непосредственно на странице поиска)

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

Доступ к сервису и его методам производится по адресу:

http://Server_Name/%5BSite_Name/%5D_vti_bin/spsearch.asmx

С веб-сервисами мне ещё не пришлось разбираться, поэтому описание пока будет опущенно.

А вот с объектной моделью поработать удалось.

Итак, конфигурация моей рабочей станции:

  • Microsoft SQL Server 2008 Express Edition with Advanced Tools
  • Microsoft Windows Sharepoint Services 3.0 SP1 (v. 12.0.0.6318)
  • Microsoft Search Server 2008 Express Edition

Итак, объектная модель, для начала посмотрим на пространство имён Microsoft.SharePoint.Search.Query

  1. Query — базовый класс, использовать его у нас не получится.
  2. KeywordQuery — класс для получения результатов поиска, аналогичных по функционалу поисковому окошечку справа вверху в WSS. Что я имею ввиду:

    DataTable resultsDataTable = new DataTable();
    using (SPSite site = new SPSite("http://server"))
    {
    KeywordQuery query = new KeywordQuery(site);
    query.QueryText = queryText;
    query.ResultTypes = ResultType.RelevantResults;
    ResultTableCollection resultTables = query.Execute();if (resultTables.Count > 0)
    {
    ResultTable relevantResults = resultTables[ResultType.RelevantResults];
    resultsDataTable.Load(relevantResults, LoadOption.OverwriteChanges);
    }}
    return resultsDataTable;* This source code was highlighted with Source Code Highlighter.

    queryText — тот текст, который Вы забили бы в окошко поиска
    resultsDataTable — поля в DataTable будут примерно такими: Title, Path, Author и т.д. ни на что большее расчитывать не прийдется
    Может пригодится для кастомизации страницы поиска WSS.

  3. FullTextSqlQuery — немного более расширенный функционал, предоставляет нам более расширенные возможности, во-первых потому-что поддерживает T-SQL-подобный синтаксис, а во вторых потому что предоставляет доступ к full-text’овому поиску (по словоформам и проч.), используя следующие операторы: FREETEXT(), CONTAINS().

    DataTable resultsDataTable = new DataTable();
    using (SPSite site = new SPSite("http://server"))
    {

    string queryText = "SELECT title, path, author, contenttype from Scope()";
    FullTextSqlQuery query = new FullTextSqlQuery(site);
    query.QueryText = queryText;
    query.ResultTypes = ResultType.RelevantResults;
    ResultTableCollection resultTables = query.Execute();
    if (resultTables.Count > 0)
    {
    ResultTable relevantResults = resultTables[ResulType.RelevantResults];
    resultsDataTable.Load(relevantResults, LoadOption.OverwriteChanges);
    }
    }return resultsDataTable;* This source code was highlighted with Source Code Highlighter.

    Scop’ы можно редактировать (по адресу http://SERVER_ADMIN/_layouts/viewscopesssp.aspx?mode=ssp). Всё  великолепно,  можно производить деление на страницы (копать сюда: query.StartRow, query.RowLimit, relevantResults.TotalRows(независимо от ограничений RowLImit)), сортировку, фильтрацию и проч., НО когда необходимо будет вывести результаты  по полям Вашего контент-тайпа Вы упрётесь в стену, и вот тогда мы переходим к пространству имён Microsoft.Office.Server.Search.Query и аналогичной иерархии классов.

Microsoft.Office.Server.Search.Query

Для того, чтобы искать по полям Вашего контент-тайпа, необходимо зарегестрировать т.н. бегунки (crawlers), в помощь Вам вот такой метод:

private static void SetMapping(SearchContext context, string crawledPropertyName, string managedPropertyName, ManagedDataType managedDataType)
{
Schema sspSchema = new Schema(context);
//получаем управляемые свойства
ManagedPropertyCollection mproperties = sspSchema.AllManagedProperties;CategoryCollection cc = sspSchema.AllCategories;
//ищем бегунок
CrawledProperty cProp = null;
foreach (Category category in cc)
{
foreach (CrawledProperty property in category.GetAllCrawledProperties())
{
if (property.Name == crawledPropertyName)
{
cProp = property;
break;
}}
}if (cProp == null)
throw new Exception("Свойство для поиска " + crawledPropertyName + " не найдено");ManagedProperty mProp = null;
if (mproperties.Contains(managedPropertyName))
{
mProp = mproperties[managedPropertyName];
}
else
{
mProp = mproperties.Create(managedPropertyName, managedDataType);
}Mapping newMapping = new Mapping(cProp.Propset, cProp.Name, cProp.VariantType, mProp.PID);
MappingCollection mappings = mProp.GetMappings();
if (mappings.Contains(newMapping))
{
//если сопоставление уже есть уходим
return;
}
mappings.Add(newMapping);
mProp.SetMappings(mappings);
mProp.EnabledForScoping = true;
mProp.Update();
}* This source code was highlighted with Source Code Highlighter.

Пользоваться им таким образом:

SearchContext context;
using (SPSite site = web.Site)
{
context = SearchContext.GetContext(site);
}
SetMapping(context, "ows_FileLeafRef", "FileLeafRef", ManagedDataType.Text);
SetMapping(context, "ows_ChangesDateTime", "ChangesDateTime", ManagedDataType.DateTime);
* This source code was highlighted with Source Code Highlighter.

Кстати, я так и не смог найти типы в бегунках, поэтому пришлось написать свой нумератор для этих целей:

enum CrawledPropertyVariantType
{
Integer = 20,
Text = 31
}
* This source code was highlighted with Source Code Highlighter.

И после регистрации необходимых Вам полей, надо переиндексировать области поиска:

//Обновим области поиска
Scopes scopes = new Scopes(context);
scopes.StartCompilation();Content sspContent = new Content(context);
ContentSourceCollection sspContentSources = sspContent.ContentSources;
foreach (ContentSource cs in sspContentSources)
{
cs.StartFullCrawl();
}
//через время всё обновится* This source code was highlighted with Source Code Highlighter.

Ссылки по теме:

  • http://www.codeplex.com/sct — Search Community Toolkit. Подборка ресурсов на кодеплексе посвященных поиску в sharepoint.

Про поиск на примере SQL Server 2008 Express Edition и Search Server 2008 Express Edition

Примерно 1,5 года назад баловался с full-text search на SQL Server 2005 Express Edition with Advanced Tools. Тогда столкнулся с очень большими проблемами настройки того самого full-text search для русского языка. На днях передо мной снова встала задача использования полнотекстовых запросов, для этого я решил поставить (для установки мне потребовались net 3.5 sp1, msi 4.5, powershell [, vs2008sp1]) SQL Server 2008 Express Edition with Advanced Tools (отличается от Express Edition тем, что включает в себе функции полнотекстового поиска и службы репликации), и не встретил никаких проблем по данному вопросу. Всё очень замечательно и удобно. А если в связке с ним использовать Search Server 2008 Express Edition (базируется на WSS3.0SP1), то мы получаем отличную поисковую платформу с обширным функционалом в масштабах предприятия или веб-сервера.

Напомню, про ограничения Express версии SQL Server, они не изменились со времен 2005-ой версии:

  • 1 поддерживаемый процессор (но может быть установлен на любой сервер)
  • 1 Гб адресуемой памяти
  • 4 Гб максимальный размер базы