3

CONTAINS 述語を使用して Skills 管理プロパティで People の結果をフィルタリングしようとすると、MOSS FulltextSqlQuery で問題が発生します。実演してみましょう:

フィルターを使用しないクエリは、期待される結果を返します。

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 述語を使用してこれを達成できることは認識していますが、これが Skills プロパティの CONTAINS 述語で機能しない理由を知りたいです。「複数値」として示されるカスタムのクロールされたプロパティで CONTAINS 述語を使用することに成功しました。Skills プロパティ (複数の値を持つように見えますが) は、SSP 管理サイトの [クロールされたプロパティ] ページでそのように示されていません。

http:///ssp/admin/_layouts/schema.aspx?ConsoleView=crawledPropertiesView&category=People

誰にもアイデアはありますか?

4

2 に答える 2

2

そのため、Mark Cameron (Microsoft SharePoint Developer Support) の助けを借りて、FullTextQueriable プロパティを true に設定することにより、ManagedProperty オブジェクト モデル API を使用して、特定の管理プロパティを全文検索で有効にする必要があることを突き止めました。以下は、この問題を解決した方法です。これは、コンソール アプリに含めることも、ファームまたは Web アプリケーション スコープのフィーチャー レシーバーとして含めることもできます。

    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);
            }
        }
    }
于 2010-03-04T15:16:25.457 に答える