Как выполнить 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:

СВОБОДНЫЙ ТЕКСТ()

СОДЕРЖИТ()

ЛАЙК

Источник

Другие вопросы по тегам