Как выполнить MOSS FullTextSqlQuery и отфильтровать результаты людей по управляемому свойству Skills? - PullRequest
3 голосов
/ 19 февраля 2010

У меня возникли проблемы с 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 ]

2 голосов
/ 04 марта 2010

Итак, с помощью Марка Камерона (Microsoft Developer Developer Support) я выяснил, что для некоторых полных текстовых поисков с помощью API объектной модели ManagedProperty необходимо включить , задав для свойства FullTextQueriable значение правда. Ниже приведен метод, который решил эту проблему для меня. Он может быть включен в консольное приложение или в качестве приемника функций в области фермы или веб-приложения.

    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);
            }
        }
    }
0 голосов
/ 22 февраля 2010
SELECT AccountName, Skills
from scope()
where freetext(defaultproperties,'+Bob')
And ("scope" = 'People')
And (CONTAINS(Skills, 'Numchucks*'))

используйте * в конце.

У вас также есть несколько вариантов:

В следующем списке указаны дополнительные элементы запроса, которые поддерживается только с синтаксисом поиска SQL используя класс FullTextSqlQuery:

FREETEXT ()

СОДЕРЖИТ ()

LIKE

Источник

...