В поисковом сервисе SharePoint 2010 (не Foundation) присутствует механизм, позволяющий отображать подсказки при вводе текста в поисковую строку на странице центра поиска, как показано на рисунке ниже.
Подсказки накапливаются во встроенном словаре поисковой службы SharePoint следующим образом:
если пользователи ввели в поисковую строку один и тот же запрос более шести раз, и на странице с результатами по этому запросу сделали переход по более чем шести результатам, то данный запрос (слово или фраза) в дальнейшем будут добавлены в словарь подсказок.
Для того, чтобы это произошло, существует встроенный TimerJob, который называется «Prepare Query Suggestions». По умолчанию он запускается 1 раз в день.
После этого нужно запустить “Prepare Query Suggestions” TimerJob и «Ваша фраза» гарантированно добавится в словарь подсказок.
В качестве аргументов нашего метода setRecordClick() используется три значения:
Например:
getSuggestions(“влади”);
В результате получаем набор подсказок, см. рисунок ниже.
если пользователи ввели в поисковую строку один и тот же запрос более шести раз, и на странице с результатами по этому запросу сделали переход по более чем шести результатам, то данный запрос (слово или фраза) в дальнейшем будут добавлены в словарь подсказок.
Для того, чтобы это произошло, существует встроенный TimerJob, который называется «Prepare Query Suggestions». По умолчанию он запускается 1 раз в день.
Добавление подсказок
Используем Powershell
С помощью Powershell мы можем сами добавлять слова и фразы в словарь подсказок.
В начале получаем имя поисковой службы, которая будет использоваться для работы с подсказками:
Get-SPEnterpriseSearchServiceApplication
Теперь
добавляем наши подсказки:
$searchSSA = Get-SPEnterpriseSearchServiceApplication "Приложение службы поиска"
New-SPEnterpriseSearchLanguageResourcePhrase -SearchApplication $searchSSA -Language RU-RU -Type QuerySuggestionAlwaysSuggest -Name "Наша фраза"
Start-SPTimerJob -Identity "Prepare Query Suggestions"
С помощью командлета Start-SPTimerJob -Identity "Prepare Query Suggestions" мы запускаем TimerJob для добавления подсказок в словарь.
После этого, можно выполнить следующий командлет, для получения всего списка подсказок:
Get-SPEnterpriseSearchQuerySuggestionCandidates -SearchApplication $searchSSA
После этого, можно выполнить следующий командлет, для получения всего списка подсказок:
Get-SPEnterpriseSearchQuerySuggestionCandidates -SearchApplication $searchSSA
Используем серверный код для непосредственного добавления подсказок в словарь
Здесь и далее в примерах для работы потребуется объявить референсы на сборку Microsoft.Office.Server.Search и использовать пространства имен:
- Microsoft.Office.Server.Search.Administration
- Microsoft.Office.Server.Search.Query
SearchServiceApplication searchApp = farm.Services.GetValue<SearchQueryAndSiteSettingsService>().Applications.GetValue<SearchServiceApplication>("Приложение службы поиска") as SearchServiceApplication; Ranking ranking = new Ranking(searchApp); LanguageResourcePhraseList suggestions = ranking.LanguageResources["RU-RU"].QuerySuggestionsAlwaysSuggestList; suggestions.AddPhrase(“Ваша фраза”, String.Empty);
Используем серверный код для добавления подсказок с использованием стандартного механизма
Описание работы стандартного механизма приведено в самом первом разделе. Чтобы им воспользоваться мы должны использовать нативный метод RecordClick.
Хотя этот метод присутсвует в списке доступных на странице веб-сервиса Searh.asmx, но воспользоваться им не удасться, т.к. на msdn явно указано, что: «This member is reserved for internal use and is not intended to be used directly from your code.»
Поэтому нам остается использовать только одноименный метод в службе поиска: SearchServiceApplicationProxy.RecordClick Method
private void setRecordClick(string queryStr, string clickedUrl, string ResultsUrl) { Guid siteGuid = SPContext.Current.Web.Site.ID; using (SPSite site = new SPSite(siteGuid)) { SPServiceContext serviceContext = SPServiceContext.GetContext(site); SearchServiceApplicationProxy searchAppProxy = ((SearchServiceApplicationProxy)SearchServiceApplicationProxy.GetProxy(serviceContext)); string queryId = Guid.NewGuid().ToString(); string sessionId = Guid.NewGuid().ToString(); QueryInfo info = new QueryInfo(); info.QueryGuid = queryId; info.SiteGuid = site.ID.ToString(); info.SessionId = sessionId; info.UserName = System.Threading.Thread.CurrentPrincipal.Identity.Name; info.QueryString = queryStr; info.StartItem = 1; info.ClickTime = DateTime.Now; info.ClickedUrl = clickedUrl; info.ResultsUrl = ResultsUrl; info.ClientType = QueryLogClientType.ObjectModel; info.SearchTime = DateTime.Now; // Send a Click QueryInfo info.LogType = QueryLogType.Click; searchAppProxy.RecordClick(info); } }
В качестве аргументов нашего метода setRecordClick() используется три значения:
- queryStr – значение поискового запроса
- clickedUrl – значение URL адреса, по которому пользователь перешел, выбрав один из результатов на странице результатов поиска
- ResultsUrl - значение URL адреса самой страницы результатов поиска
После выполнения нашего метода, вся информация накапливается в промежуточном словаре и обрабатывается внутренним механизмом SharePoint. Т.о. SharePoint «сам решит» нужно ли добавлять подсказки, сформированные из ваших «рекордкликов» или нет.
Получение подсказок
В стандартном поисковом веб-сервисе Search.asmx присутствует метод GetQuerySuggestions, который позволяет получать подсказки.
Ниже привожу примеры как это делать через клиентский и серверный код.
Работаем «на клиенте» (JavaScript)
Для примера я воспользуюсь js-библиотекой SPServices. На странице проекта в документации приведена информация о поддержке работы с методом GetQuerySuggestions: http://spservices.codeplex.com/wikipage?title=Search
Для работы (помимо подключения js-библиотеки SPServices) потребуется подключить на страницу еще и jQuery (см.рекомендации по используемой версии jQuery на странице http://spservices.codeplex.com/documentation).
Напишем функцию получения подсказок:
function getSuggestions(input) { var queryText = "<QueryPacket xmlns='urn:Microsoft.Search.Query' Revision='1000'>" queryText += "<Query>" queryText += "<PreQuerySuggestions>" queryText += "true" queryText += "</PreQuerySuggestions>" queryText += "<Context>" queryText += "<QueryText language='RU-RU' type='STRING'>" queryText += input queryText += "</QueryText>" queryText += "</Context>" queryText += "<Range>" queryText += "<Count>" queryText += "20" queryText += "</Count>" queryText += "</Range>" queryText += "</Query>" queryText += "</QueryPacket>"; $().SPServices({ operation: "GetQuerySuggestions", queryXml: queryText, completefunc: function (xData, Status) { var outTxt = ""; $(xData.responseXML).find("GetQuerySuggestionsResult").each(function () { //т.к. ответ от веб-сервиса приходит в формате XML, то его нужно преобразовать var xmlDoc = $.parseXML($(this)[0].xml); var x = $(xmlDoc); x.find("string").each(function () { outTxt += $(this).text() + ','; }); }); alert(outTxt); } }); }В качестве аргумента функции передаем фразу, по которой хотим получить подсказки.
Например:
getSuggestions(“влади”);
В результате получаем набор подсказок, см. рисунок ниже.
Работаем на стороне сервера (C#)
Сам метод получения подсказок выглядит следующим образом:private static List<string> getSuggestionsList(string input) { List<string> result = new List<string>(); Guid siteGuid = SPContext.Current.Web.Site.ID; using (SPSite site = new SPSite(siteGuid)) { SPServiceContext serviceContext = SPServiceContext.GetContext(site); SearchServiceApplicationProxy searchAppProxy = ((SearchServiceApplicationProxy)SearchServiceApplicationProxy.GetProxy(serviceContext)); string queryId = Guid.NewGuid().ToString(); string sessionId = Guid.NewGuid().ToString(); KeywordQueryProperties info = new KeywordQueryProperties(); info.RowLimit = 10; info.Culture = System.Globalization.CultureInfo.CreateSpecificCulture("RU-RU"); info.QueryText = input; System.Collections.Specialized.StringCollection sugg = searchAppProxy.GetQuerySuggestions(info, 8, true, false, false); foreach (string s in sugg) { result.Add(s); } } return result; }Описание входных параметров метода GetQuerySuggestions приведены на msdn.
Получение исправлений (SpellingSuggestion)
Всем известен функционал предложения исправлений поискового запроса пользователя, который мы часто видим на странице результатов центра поиска в виде подсказки «Возможно, Вы имели ввиду: …» или “Did you mean:…”
Ниже я привел метод, который позволяет получать такие подсказки:
private static string getSpellCheck(string input) { string result = ""; Guid siteGuid = SPContext.Current.Web.Site.ID; using (SPSite site = new SPSite(siteGuid)) { SPServiceContext serviceContext = SPServiceContext.GetContext(site); SearchServiceApplicationProxy searchAppProxy = ((SearchServiceApplicationProxy)SearchServiceApplicationProxy.GetProxy(serviceContext)); string queryId = Guid.NewGuid().ToString(); string sessionId = Guid.NewGuid().ToString(); KeywordQueryProperties info = new KeywordQueryProperties(); info.RowLimit = 10; info.Culture = System.Globalization.CultureInfo.CreateSpecificCulture("RU-RU"); info.QueryText = input; var sugg = searchAppProxy.Execute(info); result = sugg.SpellingSuggestion; if (!string.IsNullOrEmpty(result)&&result == input) result = ""; } return result; }В результатах запроса Microsoft.Office.Server.Search.Query.ResultTableCollection есть свойство SpellingSuggestion, которое как раз и выводит исправления. Чтобы его получить, нам достаточно выполнить сам запрос Execute(), и считать данное свойство. Таким образом, передавая в качестве аргумента текст «ивонов», мы получаем исправленное «иванов»:
Полезные ссылки:
- http://www.itidea.nl/index.php/example-of-using-the-spservices-search-web-service/
- http://blogs.technet.com/b/bestleon/archive/2011/10/26/use-recordclick-to-add-queryinfo-to-auto-query-suggestion-in-sharepoint-2010.aspx
- http://weblogs.asp.net/ricardoperes/adding-suggestions-to-the-sharepoint-2010-search-programatically