RSS

Monthly Archives: 九月 2011

为SharePoint搜索创建自定义优化参数

当我们使用SharePoint 2010所提供的搜索功能时,在搜索结果的左侧,有一个搜索结果优化区域。通过这个区域,用户可以进一步的精简搜索结果。比如,仅仅显示类型为Word文件的搜索结果,或者仅仅显示作者为“kaneboy”的搜索结果。

image

这个优化区域内置了最常见的几个精简项目,包括类型(搜索结果是何种类型)、来源(搜索结果来自于哪个网站)、作者、修改日期等。如果在文档管理系统中使用了SharePoint 2010新的托管元数据服务中的术语来定义了企业关键字,那么这些关键字也会自动出现在优化区域中。

除了内置的这些精简项目,管理员可以添加更多的额外精简项目。不过如果希望某个属性能作为一个精简项目,管理员需要首先将它定义为搜索服务中的托管属性。

比如,在文档系统中,我们定义了一个专门的字段,“技术等级”,来描述所有技术文档的难度。这个字段的内部名称是“TechLevel”。

image

首先,在SharePoint 2010搜索管理中对所有内容进行一次完全爬网。如果爬网引擎发现了爬网内容有一个额外的字段,它会将这个字段作为已爬网属性存储到搜索数据库中。

接下来,我们需要将这个已爬网属性定义为托管属性。从SharePoint 2010管理中心里面,通过“管理服务应用程序 – Search Service Application – 元数据属性”,就打开了元数据属性管理界面。点击“新建托管属性”。

为新托管属性取名为“TechLevel”,然后,我们需要将它与已经存在的那个已爬网属性关联起来。点击“添加映射”按钮,然后搜索“TechLevel”(因为这是那个字段的内部名称),找到这个已爬网属性。将它与新托管属性建立起映射。

image

最后这个新托管属性的定义如下。

image

定义好了托管属性之后,对内容源进行第二次完全爬网!这是完全必要、不可或缺的,否则,内容的这个托管属性中将不会包含任何有效的值。

完成第二次爬网之后,打开搜索结果页面,编辑此页面,找到页面上的“精简面板”Web部件,编辑它的属性。这个Web部件的作用就是显示页面上的优化区域。

image

展开这个Web部件属性中的“优化”区域,将“筛选器类别定义”中的内容全部复制出来。把“使用默认配置”选项清除,否则我们做的任何修改都不会生效。

image

随便找一个XML文本编辑器,按照下面的格式,创建一段XML文本。在下面的示例XML中,“MappedProperty”属性的值需要设置为托管属性的名称(TechLevel),“Title”属性决定了这个优化选项显示在页面左侧的抬头。

<Category Title=”技术等级”
Description=”文档的技术等级”
Type=”Microsoft.Office.Server.Search.WebControls.ManagedPropertyFilterGenerator”
MetadataThreshold=”1″
NumberOfFiltersToDisplay=”4″
MaxNumberOfFilters=”20″
SortBy=”Frequency”
SortDirection=”Descending”
SortByForMoreFilters=”Name”
SortDirectionForMoreFilters=”Ascending”
ShowMoreLink=”True”
MappedProperty=”TechLevel
MoreLinkText=”显示更多”
LessLinkText=”显示更少”/>

把上面的XML文本,插入到从Web部件属性面板“筛选器类别定义”中复制出来的XML文本里面,需要插入到“<FilterCategories>”这个节点里面。

image

然后将新的XML文本内容复制回Web部件属性面板“筛选器类别定义”文本框,确定即可。保存并刷新页面,就能看到大功告成了。

image

 

Posted by on 2011/09/23 in 未分类

1 Comment

如何“正确”为SharePoint字段命名

当大家需要扩展一个SharePoint列表/文档库的数据结构时,就会为列表/文档库创建新的字段(栏)。不管是直接为列表/文档库新建字段,还是在网站集里面创建网站栏,作为管理员,最好使用一些“最佳实践”来为字段命名。使用正确的字段名,在未来的配置、管理、开发过程中,都可以节省很多的时间和精力。

每个SharePoint字段实际上有两个名称,一个是“标题”(Title,有时候也把它叫做“显示名称”),一个是“内部名称”(Internal Name)。平时用户在列表视图界面上看到的,都是字段的标题。字段的内部名称可以看作是字段的唯一标识。如果你曾经使用SharePoint对象模型,通过代码从列表中获取数据,那么对“内部名称”这个概念一定很熟悉。基本上,SharePoint对“内部名称”的格式有非常严格的要求,它只能由英文字母、数字和下划线字组成,且不能包含空格。但是“标题”则没有这么多限制,通常我们会使用中文作为字段的“标题”,而且“标题”中很可能会包含空格。当一个字段被创建之后,它的“内部名称”就被固定下来了,但是“标题”则可以在之后被随时修改。

var list = site.Lists[“任务”];
var titleField = list.Fields.GetFieldByInternalName(“Title”); // 使用字段的内部名称来获取一个字段
var statusField = list.Fields.GetField(“状态”); // 使用字段的标题来获取一个字段,注意,GetField()会先尝试内部名称,然后再尝试使用标题进行查找

怎么知道一个字段的内部名称呢?最简单的方法就是对一个字段进行编辑,然后观察浏览器地址栏中的URL地址。比如,当我们编辑“状态”字段时,在地址栏就能看到一个“Field=Status”参数,这表示“状态”字段的内部名称是“Status”。

image

当我们在Visual Studio 2010中开发SharePoint应用程序时,也可以通过VS内置的SharePoint Explorer来查看一个字段的详细信息。在VS2010的“服务器资源管理器”中点击“添加SharePoint连接”,就能打开一个SharePoint网站。

image

通过展开列表节点,就能直接查看列表的所有字段,以及字段的各种属性。内部名称这个属性也能直接看到。

image

但是当管理员创建一个字段时,在页面UI上并不能分别输入新字段的标题和内部名称。在新建字段的界面上,只有一个“栏名”文本框。

image

SharePoint系统会使用管理员输入在“栏名”文本框内的内容作为新字段的标题,然后根据这个标题,调用System.Xml.XmlConvert.Encode()方法,来将标题自动转换成内部名称。这样,才能让转换后的内部名称符合SharePoint对内部名称命名的规范。

比如,如果管理员使用页面UI创建一个标题为“Live ID”的字段,这个字段的内部名称会被自动命名为“Live_x0020_ID”。如果管理员创建一个标题为“技术等级”的字段,它的内部名称将是“_x6280__x672f__x7b49__x7ea7_”。

但是这种自动转换后的内部名称的格式非常不好看,也不易记忆。实际上,管理员应该始终使用一个符合内部名称规范的名称,来创建字段,这样这个新字段的内部名称和标题都相同。然后,管理员再回过头去修改这个字段,将其标题修改为更符合用户习惯的名字。由于内部名称一旦确定就不再更改,所以字段的内部名称将始终保持为初始值。

比如,我们要创建一个“技术等级”字段。最好的方法,是使用“TechLevel”为名,来新建一个字段。

image

这时,这个字段的标题,和内部名称,都将是“TechLevel”。

image

然后,在界面上将这个字段名称修改为“技术等级”。这样,用户将看到这个字段的名字叫做“技术等级”,但由于字段的内部名称会始终保持原始值,所以这个字段的内部名称仍然为“TechLevel”。

image

如果我们要在代码里面创建新字段,也应该使用类似的方法。

image

为字段命名一个好记、易识别的内部名称,无论是在我们的自定义代码中,还是在SharePoint Search里面,都要或得更好的便利性。

 

Posted by on 2011/09/23 in 未分类

Leave a comment