zoukankan      html  css  js  c++  java
  • MSDN Visual系列:MOSS企业级搜索之四——创建内容源用于爬网业务数据

    原文:http://msdn2.microsoft.com/en-us/library/bb430246.aspx

    内容源通常被认为是一块区域(location),其中包含我们想要爬网或索引的资源。在MOSS中,默认提供了多种类型的区域:如SharePoint网站集,网站,共享文件夹,Exchange公共文件夹,通过BDC得到的数据等。本文将观注的是BDC类型的数据,讨论创建和配置一个业务数据型的内容源的步骤。同时我们还将通过编程来完成该步骤。其中将会用到新的搜索配置管理API中的若干类。

    在应用程序定义文件中的IDEnumerator

    一个实体的实例如果要能够被索引,那么就需要在应用程序定义文件中的实体(entity)一层上实现一个额外的方法。这个方法必须是IDEnumerator类型的,而且必须返回该实例的主键。


    <Method Name="EmployeeIDEnumerator">
       
    <Properties> 
          
    <Property Name="RdbCommandType" Type="System.String">
             Text
          
    </Property>
          
    <Property Name="RdbCommandText" Type="System.String">
             Select EmployeeID from HumanResources.vEmployee
          
    </Property>
       
    </Properties>
       
    <Parameters>
          
    <Parameter Direction="Return" Name="EmployeeIDs">
             
    <TypeDescriptor TypeName="System.Data.IDataReader, System.Data, 
               Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
     
               Name
    ="Employees" IsCollection="true">
                
    <TypeDescriptors>
                   
    <TypeDescriptor TypeName="System.Data.IDataRecord, 
                     System.Data, Version=2.0.3600.0, Culture=neutral, 
                     PublicKeyToken=b77a5c561934e089"
     Name="Employee">
                      
    <TypeDescriptors>
                         
    <TypeDescriptor TypeName="System.Int32" IdentifierName=
                           "EmployeeID"
     Name="EmployeeID" />
                      
    </TypeDescriptors>
                   
    </TypeDescriptor>
                
    </TypeDescriptors>
             
    </TypeDescriptor>
          
    </Parameter>
       
    </Parameters>
       
    <MethodInstances>
         
    <MethodInstance Name="EmployeeIDEnumeratorInstance" Type="IdEnumerator" 
           ReturnParameterName
    ="EmployeeIDs" />
         
    </MethodInstances>
    </Method>

    通过SSP的管理站点,可以将应用程序定义文件导入到BDC元数据库中。然后我们就可以创建一个业务数据型的内容源,并指向可用的业务数据应用程序。

    管理搜索和BDC所必需的引用

    开发人员可以创建应用程序来通过编程方式处理所有我们在浏览器中所做的管理操作。下面的代码必须在MOSS服务器上运行,需要引用的dll有:Microsoft.SharePoint.dll, Microsoft.Office.Server.dll, Microsoft.Office.Server.Search.dll, Microsoft.SharePoint.Portal.dll, 和 System.Web.dll。下面是使用到的命名空间。

    // -- Namespaces used for the search administration classes
    using Microsoft.Office.Server;
    using Microsoft.Office.Server.Administration;
    using Microsoft.Office.Server.Search;
    using Microsoft.Office.Server.Search.Administration;
    // -- Namespaces used to access the Business Data Catalog
    using Microsoft.Office.Server.ApplicationRegistry.MetadataModel;
    using Microsoft.Office.Server.ApplicationRegistry.Infrastructure;
    using Microsoft.Office.Server.ApplicationRegistry.SystemSpecific.Db;

    连接到SSP和搜索上下文

    在我们操作各种类型的内容源之前,先要获取当前SSP和搜索的上下文。下面的代码展示了该过程。本例假设共享服务的名称为“SharedServices1”。

    private ServerContext serverctx = null;
    private SearchContext searchctx = null;
    private void Form1_Load(object sender, EventArgs e)
    {
      serverctx 
    = ServerContext.GetContext("SharedServices1");
      searchctx 
    = SearchContext.GetContext(serverctx);
    }

    列出所有已有的内容源

    我们可以通过创建Content类的实例来获取到现有内容源的列表。在其构造器中需要传递一个SearchContext的引用作为参数。接着,我们就可以通过循环得到所有的内容源。每个内容源都有一个或多个起始地址。

    Content content = new Content(this.searchctx);
    foreach (ContentSource contentsource in content.ContentSources)
    {
      TreeNode node 
    = treeViewContentSources.Nodes.Add(contentsource.Name);
      node.Tag 
    = contentsource;
      
    foreach (object startaddress in contentsource.StartAddresses)
      {
         node.Nodes.Add(startaddress.ToString());
      }
    }

    获取爬网状态

    在ContentSource类这个级别上暴露了很多信息,比如爬网状态和定时爬网计划等。

    ContentSource contentsource = (ContentSource)node.Tag;
    labelCrawlStatus.Text 
    = contentsource.CrawlStatus.ToString();
    labelCrawlStarted.Text 
    = contentsource.CrawlStarted.ToString();
    labelCrawlCompleted.Text 
    = contentsource.CrawlCompleted.ToString();

    开始爬网

    可用的方法有两个:完全爬网和增量爬网。这两个方法都是ContentSource 类提供的。

    contentsource.StartFullCrawl();
    contentsource.StartIncrementalCrawl();

    获取业务数据应用程序

    所有BDC的功能都通过其丰富的对象模型予以提供(位于Microsoft.SharePoint.Portal.dll中的Microsoft.Office.Server.ApplicationRegistry命名空间)。如果我们的代码不是运行在SharePoint Server的上下文环境中,那么SqlSessionProvider的实例和方法SetSharedResourceProviderToUser的调用就会在其内部与SSP上下文钩(hooks up)在一起。ApplicationRegistry类暴露了一个GetLobSystemInstances方法,其中包括了所有在BDC中可用的业务数据应用程序。

    SqlSessionProvider.Instance().SetSharedResourceProviderToUse
      (
    "SharedServices1");
    NamedLobSystemInstanceDictionary instances 
    = 
      ApplicationRegistry.GetLobSystemInstances();
    foreach (LobSystemInstance app in instances.Values)
    {
       comboBoxBDCApps.Items.Add(app.Name);
    }

    创建一个内容源

    我们可以通过在对象ContentSourceCollection级别上调用Create方法来创建一个内容源。我们可以创建一个BDC特定的URI来指向业务数据应用程序,只需要调用由类型BusinessDataContentSource提供的静态方法ConstructStartAddress即可。这个URI会被添加到ContentSource实例的StartAddresCollection对象中。最后,调用一下Update方法,将所有改动保存到数据库中。

    Uri bdcuri = BusinessDataContentSource.ConstructStartAddress
       (
    this.searchctx.Name, comboBoxBDCApps.SelectedItem.ToString());                
    Content content 
    = new Content(this.searchctx);
    BusinessDataContentSource contentsource 
    = 
      (BusinessDataContentSource)content.ContentSources.Create
      (
    typeof(BusinessDataContentSource),textBoxContentSourceName.Text);
    contentsource.StartAddresses.Add(bdcuri);
    contentsource.Update(); 

    SharePoint Server提供的爬网器可以被指到一个区域上,并按顺序索引该区域中的可用内容。只需要在SSP级别上创建并配置一个内容源即可。下面是可以被创建的各种不同类型的内容源:

    • SharePoint网站集
    • 网站
    • 共享文件夹
    • Exchange Server公共文件夹
    • 业务数据
    • Lotus Notes数据库 (仅在预先做了相关安装后有效)

    业务数据通常以结构化的方式存储在一个关系型数据库中(如SQL Server),或者存储在LOB(line-of-business)系统中(如SAP或Microsoft Dynamics CRM),可以通过标准的一致的方法使用BDC中间层获取到。开发人员可以通过发布一个XML文件(应用程序定义文件)的方法将这些业务数据模型化。该文件中必须包括一个很重要的IDEnumerator类型的方法,用于爬网和索引数据。该方法必须返回记录中所有的主键,以便用于索引。爬网器会为每个主键生成一个概括页面,并在该页中对内容按照该主键进行索引。

    图一,本文中用到的搜索相关的类

    查看视频

  • 相关阅读:
    前端模块的前生今世
    variable fonts
    node
    webpack tree shaking
    es6 proxy浅析
    如何实现优美的骨架屏
    阿里巴巴Java开发手册建议创建HashMap时设置初始化容量,但是多少合适呢?
    新来个技术总监,禁止我们使用Lombok!
    2020年Java程序员应该学习的10大技术
    为啥HashMap的默认容量是16?
  • 原文地址:https://www.cnblogs.com/Sunmoonfire/p/785316.html
Copyright © 2011-2022 走看看