SharePoint站点中的列表和文档库都具有其特定专有的属性。当爬网器索引这些容器中的内容时,这些定制的元数据都会被搜集起来。管理员可以把这些自定义的元数据暴露给用户,以便可以在搜索中心中用于检索。在高级搜索页面中有一个属性选取器,可以选取这些托管属性。
我们可以在高级搜索页面的属性选取器中添加一个托管属性,只需要扩展一下附加在选取属性的高级搜索框上的XML即可。PropertyDef元素用于注册托管属性,PropertyRef元素作为ResultType元素的子节点用于使该属性可见。
用于添加一个托管属性到属性选取器的XML
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<LangDefs>
<LangDef DisplayName="Arabic" LangID="1"/>
…
</LangDefs>
<Languages>
<Language LangRef="12"/>
…
</Languages>
<PropertyDefs>
<PropertyDef Name="Path" DataType="text" DisplayName="URL"/>
…
<PropertyDef Name="ProjectCode" DataType="text"
DisplayName="Project Code"/>
</PropertyDefs>
<ResultTypes>
<ResultType DisplayName="All Results" Name="default">
<Query/>
<PropertyRef Name="Author" />
…
<PropertyRef Name="ProjectCode" />
</ResultType>
<ResultType DisplayName="Documents" Name="documents">
<Query>IsDocument=1</Query>
<PropertyRef Name="Author" />
…
</ResultType>
<ResultType DisplayName="Word Documents" Name="worddocuments">
<Query>FileExtension='doc' Or FileExtension='docx'
Or FileExtension='dot'</Query>
<PropertyRef Name="Author" />
<PropertyRef Name="Company"/>
…
</ResultType>
…
</ResultTypes>
</root>
用于托管属性编程的引用和命名空间
我们必须使下面的样例代码运行在装有MOSS的服务器上。该代码需要引用到Microsoft.SharePoint.dll,Microsoft.Office.Server.dll,Microsoft.Office.Server.Search.dll和System.Web.dll。添加下列的namespace:
using Microsoft.Office.Server;
using Microsoft.Office.Server.Administration;
using Microsoft.Office.Server.Search;
using Microsoft.Office.Server.Search.Administration;
连接到共享服务SSP(Shared Services Provider)和搜索上下文
在编程访问受管理属性前,我们必须先引用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);
}
获取列表的托管属性
托管属性是Schema类的实例 。该类包含一个名为AllManagedProperties的属性,可以通过循环读取并显示所有独立的ManagedProperty实例。GetMappings方法调用后会得到每个已爬网属性对应的托管属性。
Schema schema = new Schema(this.searchContext);
foreach (ManagedProperty prop in schema.AllManagedProperties)
{
TreeNode node = treeViewManagedProperties.Nodes.Add(prop.Name);
node.Tag = prop;
foreach (Mapping mapping in prop.GetMappings())
{
node.Nodes.Add(mapping.CrawledPropertyName);
}
}