Как мне выполнить MOSS FullTextSqlQuery и отфильтровать результаты people по свойству Skills managed?

StackOverflow https://stackoverflow.com/questions/2293066

Вопрос

У меня возникли проблемы с MOSS FulltextSqlQuery при попытке отфильтровать результаты People по свойству Skills Managed с использованием предиката 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 ?Просмотр консоли = просмотр свойств для обхода и категория = Люди

У кого-нибудь есть какие-нибудь идеи?

Это было полезно?

Решение

Итак, с помощью Марка Кэмерона (служба поддержки разработчиков 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:

БЕСПЛАТНЫЙ ТЕКСТ()

СОДЕРЖИТ()

Нравится

Источник

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top