如何:将已爬网属性映射到托管属性

通过企业级搜索管理对象模型中的 Schema 对象,可以访问为共享服务提供程序 (SSP) 的搜索服务配置的托管属性。有关 Schema 对象的详细信息,请参阅管理元数据

下面的过程说明如何将已爬网属性映射到托管属性。

设置应用程序以使用企业级搜索管理对象模型

  1. 在应用程序中,设置对以下 DLL 的引用:

    • Microsoft.SharePoint.dll

    • Microsoft.Office.Server.dll

    • Microsoft.Office.Server.Search.dll

  2. 在控制台应用程序的类文件中,使用其他命名空间指令在代码顶部附近添加下面的 using 语句。

    using Microsoft.SharePoint;
    using Microsoft.Office.Server.Search.Administration;
    

验证是否在 args[] 参数中传递了属性映射所必需的值,如果没有,则显示使用信息

  1. 创建一个函数,以便将使用信息写出到控制台窗口。

    static void Usage()
    {
        Console.WriteLine("Map Crawled Property to Managed Property Sample");
        Console.WriteLine("Usage: PropertyMappingSample.exe <cPropGUID> <cPropName> <cPropVType> <mPropPID>");
        Console.WriteLine("<cPropGUID> - The GUID identifying the crawled property.");
        Console.WriteLine("<cPropName> - The crawled property name.");
        Console.WriteLine("<cPropVType> - The variant type of the crawled proeprty.");
        Console.WriteLine("<mPropName> - The name of the managed property.");
    }
    
  2. 在控制台应用程序的 Main() 函数中,添加代码以检查 args[] 参数中的项数是否等于 4;如果不等于 4(这意味着并未在 args[] 中传递创建属性映射所需的全部值),则调用在上一步中定义的 Usage() 函数。

    if (args.Length != 4)
    {
        Usage();
        return;
    }
    

创建属性映射

  1. 使用以下代码创建本地变量,以存放在 args[] 参数中传递的属性映射的值。

    Guid cPropGUID = new Guid(args[0]);
    string cPropName = args[1];
    int vType = Convert.ToInt32(args[2]);
    string mPropName = args[3];
    
  2. 使用以下代码,针对 SSP 的搜索上下文检索 Schema 对象。有关检索搜索上下文的方法的详细信息,请参阅如何:返回搜索服务提供程序的搜索上下文

    /*
    Replace <SiteName> with the name of a site using the SSP
    */
    SearchContext context;
    string strURL = "http://<SiteName>";
    using(SPSite site = new SPSite(strURL))
    {
    context = SearchContext.GetContext(site);
    }
    Schema sspSchema = new Schema(context);
    
  3. 通过使用下面的代码检索托管属性的集合:

    ManagedPropertyCollection properties = sspSchema.AllManagedProperties;
    
  4. 使用在 args[3] 参数中指定的名称检索托管属性。

    ManagedProperty mProp = properties[mPropName];
    
  5. 使用前几步的值创建 Mapping 类的实例。

    Mapping newMapping = new Mapping(cPropGUID, cPropName, vType, mProp.PID);
    
  6. 检索针对该托管属性的映射集合,检查以了解在步骤 5 中创建的映射是否与集合中的任何现有映射相匹配,如果是,则使用下面的代码中在控制台中显示该信息。

    MappingCollection mappings = mProp.GetMappings();
    if(mappings.Contains(newMapping))
    {
        Console.WriteLine("Mapping failed: requested mapping already exists.");
        return;
    }
    
  7. 如果新映射与集合中的任何现有映射都不匹配,则使用下面的代码将新映射添加到托管属性的映射集合中。

    mappings.Add(newMapping);
    mProp.SetMappings(mappings);
    Console.WriteLine(cPropName + "crawled property mapped to " + mProp.Name + " managed property.");
    return;
    

示例

以下是控制台应用程序类示例的完整代码。

先决条件

  • 确保已创建了共享服务提供程序。

项目引用

运行此示例之前,在控制台应用程序代码项目中添加下面的项目引用:

  • Microsoft.SharePoint

  • Microsoft.Office.Server

  • Microsoft.Office.Server.Search

using System;
using System.Collections;
using System.Text;
using Microsoft.Office.Server.Search.Administration;
using Microsoft.SharePoint;

namespace PropertyMappingSample
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                if (args.Length != 4)
                {
                    Usage();
                    return;
                }

                Guid cPropGUID = new Guid(args[0]);
                string cPropName = args[1];
                int vType = Convert.ToInt32(args[2]);
                string mPropName = args[3];
                /*
                    Replace <SiteName> with the name of
                    a site that uses the SSP
                */
                string strURL = "http://<SiteName>";
                SearchContext context;
                using(SPSite site = new SPSite(strURL))
                {
                   context = SearchContext.GetContext(site);
                }
                Schema sspSchema = new Schema(context);
                ManagedPropertyCollection properties = sspSchema.AllManagedProperties;
                ManagedProperty mProp = properties[mPropName];
                Mapping newMapping = new Mapping(cPropGUID, cPropName, vType, mProp.PID);
                MappingCollection mappings = mProp.GetMappings();
                if(mappings.Contains(newMapping))
                {
                   Console.WriteLine("Mapping failed: requested mapping already exists.");
                    return;
                }
                mappings.Add(newMapping);
                mProp.SetMappings(mappings);
                Console.WriteLine(cPropName + "crawled property mapped to " + mProp.Name + " managed property.");
            }
            catch (Exception ex1)
            {
                Console.WriteLine(ex1.ToString());
                Usage();
            }
        }

        static void Usage()
        {
            Console.WriteLine("Map Crawled Property to Managed Property Sample");
            Console.WriteLine("Usage: PropertyMappingSample.exe <cPropGUID> <cPropName> <cPropVType> <mPropName>");
            Console.WriteLine("<cPropGUID> - The GUID identifying the crawled property.");
            Console.WriteLine("<cPropName> - The crawled property name.");
            Console.WriteLine("<cPropVType> - The variant type of the crawled proeprty.");
            Console.WriteLine("<mPropName> - The name of the managed property.");
        }
    }
}

See Also

概念

管理元数据

搜索管理对象模型入门