Отличная подборка книг

Было бы классно найти все в электронном виде:

http://agileconsulting.ru/wiki/index.php?title=Books


Zlob.DNS Changer!

Вчера столкнулся с проблемой: моя ОСь (Windows Vista x86) постоянно искала сеть, из-за чего были проблемы с пропускной способностью интернет-канала; настройки подключения у меня выставлены на автоматическое получение от ADSL роутера, но в DNS писались довольно таки странные IP адреса, наподобие 85.255.115.107.

Проблема решилась великолепной утилитой Malwarebytes’ Anti-Malware. Советую всем скачать и пользоваться абсолютно бесплатно. Спасибо за внимание.


Как не показывать asp:DataPager когда записей меньше чем одна страница

Речь идёт о ASP.NET контроле DataPager (System.Web.UI.WebControls.DataPager из System.Web.Extensions версии 3.5.0.0).

Если DataPager связан у Вас с контролом ListView (System.Web.UI.WebControls.ListView из System.Web.Extensions версии 3.5.0.0), то всё реализуется достаточно просто:

DataPager1.Visible = ((DataPager1.PageSize < DataPager1.TotalRowCount) && ListViewSearchResult.Visible);


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.