Как выполнить MOSS FullTextSqlQuery и отфильтровать результаты людей по управляемому свойству Skills?
У меня возникли проблемы с MOSS FulltextSqlQuery при попытке отфильтровать результаты People в Управляемом свойстве Skills с использованием предиката CONTAINS. Позвольте мне продемонстрировать:
Запрос без фильтров возвращает ожидаемый результат:
SELECT AccountName, Skills
from scope()
where freetext(defaultproperties,'+Bob')
And ("scope" = 'People')
Результат
Total Rows: 1
ACCOUNTNAME: MYDOMAIN\Bob
SKILLS: Numchucks | ASP.Net | Application Architecture
Но когда я добавляю предикат CONTAINS, я больше не получаю ожидаемый результат:
SELECT AccountName, Skills
from scope()
where freetext(defaultproperties,'+Bob')
And ("scope" = 'People')
And (CONTAINS(Skills, 'Numchucks'))
Результат
Total Rows: 0
Я понимаю, что могу сделать это, используя предикат SOME ARRAY, но мне хотелось бы знать, почему это не работает с предикатом CONTAINS для свойства Skills. Я успешно использовал предикат CONTAINS с пользовательским свойством для обхода, которое обозначено как "Многозначный". Свойство Skills (хотя оно может быть многозначным) не указывается как таковое на странице свойств для обхода на сайте администратора SSP:
HTTP:///ssp/admin/_layouts/schema.aspx ConsoleView=crawledPropertiesView& категория =People
У кого-нибудь есть идеи?
2 ответа
Поэтому с помощью Марка Кэмерона (Поддержка разработчиков Microsoft SharePoint) я выяснил, что некоторые управляемые свойства должны быть включены для полнотекстового поиска с использованием API объектной модели ManagedProperty, установив для свойства FullTextQueriable значение true. Ниже приведен метод, который решил эту проблему для меня. Он может быть включен в консольное приложение или в качестве приемника функций для фермы или веб-приложения.
using Microsoft.Office.Server;
using Microsoft.Office.Server.Search.Administration;
private void EnsureFullTextQueriableManagedProperties(ServerContext serverContext)
{
var schema = new Schema(SearchContext.GetContext(serverContext));
var managedProperties = new[] { "SKILLS", "INTERESTS" };
foreach (ManagedProperty managedProperty in schema.AllManagedProperties)
{
if (!managedProperties.Contains(managedProperty.Name.ToUpper()))
continue;
if (managedProperty.FullTextQueriable)
continue;
try
{
managedProperty.FullTextQueriable = true;
managedProperty.Update();
Log.Info(m => m("Successfully set managed property {0} to be FullTextQueriable", managedProperty.Name));
}
catch (Exception e)
{
Log.Error(m => m("Error updating managed property {0}", managedProperty.Name), e);
}
}
}
SELECT AccountName, Skills
from scope()
where freetext(defaultproperties,'+Bob')
And ("scope" = 'People')
And (CONTAINS(Skills, 'Numchucks*'))
используйте * в конце.
У вас также есть несколько вариантов, чтобы попробовать:
В следующем списке указаны дополнительные элементы запроса, которые поддерживаются только синтаксисом поиска SQL с использованием класса FullTextSqlQuery:
СВОБОДНЫЙ ТЕКСТ()
СОДЕРЖИТ()
ЛАЙК