代码改变世界

MOSS Search学习记录(九):高级搜索定制(下)

2008-01-12 22:47  努力学习的小熊  阅读(3617)  评论(4编辑  收藏  举报
 

MOSS Search学习记录(九):高级搜索定制(下)

最后介绍高级搜索定制中最复杂的部分。在高级搜索页面中高级搜索框这个Web部件,有个属性选项卡。其中包含了一个高级搜索页面的XML描述配置文件。默认内容如下,我们一块一块来分析。

1.打开高级搜索页面,点击页面上的“网站操作——编辑页面”,进入到页面的编辑模式。

2点击高级搜索框WebPart的编辑菜单,选择“修改共享 Web 部件”,打开部件的属性配置窗口。

3.展开第三个配置部分“属性”。可以看到3可配置属性,显示属性、属性部分标签、属性。
    

4.显示属性


这个属性用来控制高级搜索页面中第三部分的显示和隐藏。

例如,将其设置为未选中状态,即不显示“添加属性限制”的部分,效果如下

5.属性部分标签


这个属性用来控制下图中红色部分的文本内容,如果内容为空的话则显示为默认文字“添加属性限制
”。

修改为“添加属性查询条件”,效果如下

6.属性


可以看出,属性的内容是一个
XML描述文件。

默认内容如下:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

     <LangDefs>

         <LangDef DisplayName="阿拉伯语" LangID="1"/>

         <LangDef DisplayName="孟加拉语" LangID="69"/>

         <LangDef DisplayName="保加利亚语" LangID="2"/>

         <LangDef DisplayName="加泰罗尼亚语" LangID="3"/>

         <LangDef DisplayName="中文" LangID="4"/>

         <LangDef DisplayName="克罗地亚语/塞尔维亚语" LangID="26"/>

         <LangDef DisplayName="捷克语" LangID="5"/>

         <LangDef DisplayName="丹麦语" LangID="6"/>

         <LangDef DisplayName="荷兰语" LangID="19"/>

         <LangDef DisplayName="芬兰语" LangID="11"/>

         <LangDef DisplayName="法语" LangID="12"/>

         <LangDef DisplayName="德语" LangID="7"/>

         <LangDef DisplayName="希腊语" LangID="8"/>

         <LangDef DisplayName="古吉拉特语" LangID="71"/>

         <LangDef DisplayName="希伯来语" LangID="13"/>

         <LangDef DisplayName="印地语" LangID="57"/>

         <LangDef DisplayName="匈牙利语" LangID="14"/>

         <LangDef DisplayName="冰岛语" LangID="15"/>

         <LangDef DisplayName="印度尼西亚语" LangID="33"/>

         <LangDef DisplayName="意大利语" LangID="16"/>

         <LangDef DisplayName="日语" LangID="17"/>

         <LangDef DisplayName="卡纳达语" LangID="75"/>

         <LangDef DisplayName="朝鲜语" LangID="18"/>

         <LangDef DisplayName="拉脱维亚语" LangID="38"/>

         <LangDef DisplayName="立陶宛语" LangID="39"/>

         <LangDef DisplayName="马来语" LangID="62"/>

         <LangDef DisplayName="马拉雅拉姆语" LangID="76"/>

         <LangDef DisplayName="马拉地语" LangID="78"/>

         <LangDef DisplayName="挪威语" LangID="20"/>

         <LangDef DisplayName="波兰语" LangID="21"/>

         <LangDef DisplayName="葡萄牙语" LangID="22"/>

         <LangDef DisplayName="旁遮普语" LangID="70"/>

         <LangDef DisplayName="罗马尼亚语" LangID="24"/>

         <LangDef DisplayName="俄语" LangID="25"/>

         <LangDef DisplayName="斯洛伐克语" LangID="27"/>

         <LangDef DisplayName="斯洛文尼亚语" LangID="36"/>

         <LangDef DisplayName="西班牙语" LangID="10"/>

         <LangDef DisplayName="瑞典语" LangID="29"/>

         <LangDef DisplayName="泰米尔语" LangID="73"/>

         <LangDef DisplayName="泰卢固语" LangID="74"/>

         <LangDef DisplayName="泰语" LangID="30"/>

         <LangDef DisplayName="土耳其语" LangID="31"/>

         <LangDef DisplayName="乌克兰语" LangID="34"/>

         <LangDef DisplayName="乌尔都语" LangID="32"/>

         <LangDef DisplayName="越南语" LangID="42"/>

     </LangDefs>

     <Languages>

         <Language LangRef="4"/>

         <Language LangRef="12"/>

         <Language LangRef="7"/>

         <Language LangRef="17"/>

         <Language LangRef="10"/>

     </Languages>

     <PropertyDefs>

         <PropertyDef Name="Path" DataType="text" DisplayName="URL"/>

         <PropertyDef Name="Size" DataType="integer" DisplayName="大小"/>

         <PropertyDef Name="Write" DataType="datetime" DisplayName="上次修改日期"/>

         <PropertyDef Name="FileName" DataType="text" DisplayName="名称"/>

         <PropertyDef Name="Description" DataType="text" DisplayName="说明"/>

         <PropertyDef Name="Title" DataType="text" DisplayName="标题"/>

         <PropertyDef Name="Author" DataType="text" DisplayName="作者"/>

         <PropertyDef Name="DocSubject" DataType="text" DisplayName="主题"/>

         <PropertyDef Name="DocKeywords" DataType="text" DisplayName="关键字"/>

         <PropertyDef Name="DocComments" DataType="text" DisplayName="备注"/>

         <PropertyDef Name="Manager" DataType="text" DisplayName="经理"/>

         <PropertyDef Name="Company" DataType="text" DisplayName="公司"/>

         <PropertyDef Name="Created" DataType="datetime" DisplayName="创建日期"/>

         <PropertyDef Name="CreatedBy" DataType="text" DisplayName="创建者"/>

         <PropertyDef Name="ModifiedBy" DataType="text" DisplayName="上次修改者"/>

     </PropertyDefs>

     <ResultTypes>

         <ResultType DisplayName="所有结果" Name="default">

              <Query/>

              <PropertyRef Name="Author" />

              <PropertyRef Name="Description" />

              <PropertyRef Name="FileName" />

              <PropertyRef Name="Size" />

              <PropertyRef Name="Path" />

              <PropertyRef Name="Created" />

              <PropertyRef Name="Write" />

              <PropertyRef Name="CreatedBy" />

              <PropertyRef Name="ModifiedBy" />

         </ResultType>

         <ResultType DisplayName="文档" Name="documents">

              <Query>IsDocument=1</Query>

              <PropertyRef Name="Author" />

              <PropertyRef Name="DocComments"/>

              <PropertyRef Name="Description" />

              <PropertyRef Name="DocKeywords"/>

              <PropertyRef Name="FileName" />

              <PropertyRef Name="Size" />

              <PropertyRef Name="DocSubject"/>

              <PropertyRef Name="Path" />

              <PropertyRef Name="Created" />

              <PropertyRef Name="Write" />

              <PropertyRef Name="CreatedBy" />

              <PropertyRef Name="ModifiedBy" />

              <PropertyRef Name="Title"/>

              <PropertyRef Name="Manager" />

              <PropertyRef Name="Company"/>

         </ResultType>

         <ResultType DisplayName="Word 文档" Name="worddocuments">

              <Query>FileExtension='doc' Or FileExtension='docx' Or FileExtension='dot'</Query>

              <PropertyRef Name="Author" />

              <PropertyRef Name="DocComments"/>

              <PropertyRef Name="Description" />

              <PropertyRef Name="DocKeywords"/>

              <PropertyRef Name="FileName" />

              <PropertyRef Name="Size" />

              <PropertyRef Name="DocSubject"/>

              <PropertyRef Name="Path" />

              <PropertyRef Name="Created" />

              <PropertyRef Name="Write" />

              <PropertyRef Name="CreatedBy" />

              <PropertyRef Name="ModifiedBy" />

              <PropertyRef Name="Title"/>

              <PropertyRef Name="Manager" />

              <PropertyRef Name="Company"/>

         </ResultType>

         <ResultType DisplayName="Excel 文档" Name="exceldocuments">

              <Query>FileExtension='xls' Or FileExtension='xlsx' Or FileExtension='xlt'</Query>

              <PropertyRef Name="Author" />

              <PropertyRef Name="DocComments"/>

              <PropertyRef Name="Description" />

              <PropertyRef Name="DocKeywords"/>

              <PropertyRef Name="FileName" />

              <PropertyRef Name="Size" />

              <PropertyRef Name="DocSubject"/>

              <PropertyRef Name="Path" />

              <PropertyRef Name="Created" />

              <PropertyRef Name="Write" />

              <PropertyRef Name="CreatedBy" />

              <PropertyRef Name="ModifiedBy" />

              <PropertyRef Name="Title"/>

              <PropertyRef Name="Manager" />

              <PropertyRef Name="Company"/>

         </ResultType>

         <ResultType DisplayName="演示文稿" Name="presentations">

              <Query>FileExtension='ppt'</Query>

              <PropertyRef Name="Author" />

              <PropertyRef Name="DocComments"/>

              <PropertyRef Name="Description" />

              <PropertyRef Name="DocKeywords"/>

              <PropertyRef Name="FileName" />

              <PropertyRef Name="Size" />

              <PropertyRef Name="DocSubject"/>

              <PropertyRef Name="Path" />

              <PropertyRef Name="Created" />

              <PropertyRef Name="Write" />

              <PropertyRef Name="CreatedBy" />

              <PropertyRef Name="ModifiedBy" />

              <PropertyRef Name="Title"/>

              <PropertyRef Name="Manager" />

              <PropertyRef Name="Company"/>

         </ResultType>

     </ResultTypes>

</root>

整体XML描述看起来很长,其实内容不多,很简单,包括如下几大部分。

<LangDefs>可搜索的语言

<Languages>提供选择的语言

<PropertyDefs>添加属性限制中属性字段的定义

<ResultTypes>结果类型定义

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

     <LangDefs>语言类型定义部分)

         <LangDef DisplayName="阿拉伯语" LangID="1"/>具体语言定义)

         ……

         <LangDef DisplayName="中文" LangID="4"/>

         ……

     </LangDefs>

     <Languages>提供搜索选择语言定义部分)

         <Language LangRef="4"/>可选搜索语言定义)

         ……

     </Languages>

     <PropertyDefs>搜索属性限制定义部分)

         ……

         <PropertyDef Name="Title" DataType="text" DisplayName="标题"/>属性限制定义)

         ……

     </PropertyDefs>

     <ResultTypes>结果类型定义部分)

         <ResultType DisplayName="所有结果" Name="default">具体结果类型定义)

              <Query/>查询条件)

              <PropertyRef Name="Author" />此结果类型可查询字段定义)

              <PropertyRef Name="Description" />

              <PropertyRef Name="FileName" />

              <PropertyRef Name="Size" />

              <PropertyRef Name="Path" />

              <PropertyRef Name="Created" />

              <PropertyRef Name="Write" />

              <PropertyRef Name="CreatedBy" />

              <PropertyRef Name="ModifiedBy" />

         </ResultType>

         <ResultType DisplayName="文档" Name="documents">

              <Query>IsDocument=1</Query>

              <PropertyRef Name="Author" />

              <PropertyRef Name="DocComments"/>

              <PropertyRef Name="Description" />

              <PropertyRef Name="DocKeywords"/>

              <PropertyRef Name="FileName" />

              <PropertyRef Name="Size" />

              <PropertyRef Name="DocSubject"/>

              <PropertyRef Name="Path" />

              <PropertyRef Name="Created" />

              <PropertyRef Name="Write" />

              <PropertyRef Name="CreatedBy" />

              <PropertyRef Name="ModifiedBy" />

              <PropertyRef Name="Title"/>

              <PropertyRef Name="Manager" />

              <PropertyRef Name="Company"/>

         </ResultType>

         <ResultType DisplayName="Word 文档" Name="worddocuments">

              <Query>FileExtension='doc' Or FileExtension='docx' Or FileExtension='dot'</Query>

              <PropertyRef Name="Author" />

              <PropertyRef Name="DocComments"/>

              <PropertyRef Name="Description" />

              <PropertyRef Name="DocKeywords"/>

              <PropertyRef Name="FileName" />

              <PropertyRef Name="Size" />

              <PropertyRef Name="DocSubject"/>

              <PropertyRef Name="Path" />

              <PropertyRef Name="Created" />

              <PropertyRef Name="Write" />

              <PropertyRef Name="CreatedBy" />

              <PropertyRef Name="ModifiedBy" />

              <PropertyRef Name="Title"/>

              <PropertyRef Name="Manager" />

              <PropertyRef Name="Company"/>

         </ResultType>

         <ResultType DisplayName="Excel 文档" Name="exceldocuments">

              <Query>FileExtension='xls' Or FileExtension='xlsx' Or FileExtension='xlt'</Query>

              <PropertyRef Name="Author" />

              <PropertyRef Name="DocComments"/>

              <PropertyRef Name="Description" />

              <PropertyRef Name="DocKeywords"/>

              <PropertyRef Name="FileName" />

              <PropertyRef Name="Size" />

              <PropertyRef Name="DocSubject"/>

              <PropertyRef Name="Path" />

              <PropertyRef Name="Created" />

              <PropertyRef Name="Write" />

              <PropertyRef Name="CreatedBy" />

              <PropertyRef Name="ModifiedBy" />

              <PropertyRef Name="Title"/>

              <PropertyRef Name="Manager" />

              <PropertyRef Name="Company"/>

         </ResultType>

         <ResultType DisplayName="演示文稿" Name="presentations">

              <Query>FileExtension='ppt'</Query>

              <PropertyRef Name="Author" />

              <PropertyRef Name="DocComments"/>

              <PropertyRef Name="Description" />

              <PropertyRef Name="DocKeywords"/>

              <PropertyRef Name="FileName" />

              <PropertyRef Name="Size" />

              <PropertyRef Name="DocSubject"/>

              <PropertyRef Name="Path" />

              <PropertyRef Name="Created" />

              <PropertyRef Name="Write" />

              <PropertyRef Name="CreatedBy" />

              <PropertyRef Name="ModifiedBy" />

              <PropertyRef Name="Title"/>

              <PropertyRef Name="Manager" />

              <PropertyRef Name="Company"/>

         </ResultType>

     </ResultTypes>

</root>

语言类型定义部分

<LangDefs>

定义SharePoint可提供给搜索的语言集合。

具体语言定义

<LangDef DisplayName="中文" LangID="4"/>

LangDef:语言定义

DisplayName:显示名称


LangID
:语言标识号

提供搜索选择语言定义部分

<Languages>

定义语言范围选取器中可选择的语言。

可选搜索语言定义

<Language LangRef="4"/>

Language:选择的语言标签

LangRef:选择显示语言的ID号,这个值和中定义的LangID对应

搜索属性限制定义部分

<PropertyDefs>

定义高级搜索中可搜索的字段,这些都是网站栏并在共享服务管理中进行爬网、定义元数据影射出来的字段。步骤如下:

a打开SharePoint管理中心

b点击建立好的共享服务管理网站,进入到共享服务管理网站中。这里名字为SharedServices1

c在共享服务管理页面上找到搜索部分,点击进入“搜索设置”。

d在爬网设置部分可以找到“元数据属性映射”。打开。

e这时可以看到托管属性视图中列出了很多的爬网属性。其中一些就是映射到SharePoint的网站栏的。这样我们现在需要一个网站栏。打开主网站的网站设置页面,在库这类管理下找到网站栏,点击进入

f点击顶部的创建链接,创建一个新的网站栏。

g建立一个多行文本类型的KBContent字段。这里推荐用户将网站栏的名字起为英文名字,如果起为中文的话在爬网找到这个网站栏后会以中文的16进制编码来显示而并不显示中文字,在元数据属性映射的时候用户不方便找到这个网站栏,所以建议用户将网站栏的名字起为英文名字。

h创建完成后,需要在网站中引用此网站栏并填入信息才能将这个网站栏爬网爬到。所以按照如下步骤创建。首先创建两个内容类型软件知识和硬件知识,父内容类型均为列表的项目。对两个内容类型均添加KBContent网站栏的引用。然后创建两个自定义列表:软件知识库和硬件知识库。软件知识库列表添加软件知识内容类型并设置为默认内容类型,硬件知识库添加硬件知识内容类型并设置为默认内容类型。最后在两个列表构建的知识库中输入一些用来查询的信息。


打开刚才的“共享服务管理”的“搜索设置”页面。打开“内容源和爬网计划”。

i对刚才创建的网站栏所在的内容源进行一次完全爬网。

j爬网完成后,返回搜索设置页面。打开“元数据属性映射”页面。点击“新建托管属性”。

k首先设置属性名称为ContentForKB。并设置信息类型为文本。

l在“到已爬网属性的映射”部分点击“添加映射”按钮。在弹出的窗口中找到我们刚才爬网的爬到的网站栏KBContent。这里SharePoint对这种自定义的栏,增加了ows_的前缀。


m最后在“实用范围”上选中“允许此属性在多个范围中使用”。

n这样我们就将列表中的字段映射到了元数据属性中。

属性限制定义

<PropertyDef Name="Title" DataType="text" DisplayName="标题"/>

PropertyDef:属性定义

Name:元数据属性名称

DataType:元数据属性类型

DisplayName:显示名称

这里就可以填写上面介绍的映射出来的列表字段的属性。

结果类型定义部分

<ResultTypes>

定义搜索结果显示的结果类型,例如仅搜索Word文档。

具体结果类型定义

<ResultType DisplayName="所有结果" Name="default">

<ResultType DisplayName="文档" Name="documents">

<ResultType DisplayName="文档" Name="documents">

<ResultType DisplayName="Excel 文档" Name="exceldocuments">

<ResultType DisplayName="演示文稿" Name="presentations">

默认列出了五种结果类型。

ResultType:定义结果类型的标签。

DisplayName:结果类型的显示名称。

Name:结果类型的标识名称,每个结果类型的标识名称要保证唯一,不能重复。

查询条件

<Query/>

<Query>IsDocument=1</Query>

<Query>FileExtension='doc' Or FileExtension='docx' Or FileExtension='dot'</Query>

<Query>FileExtension='xls' Or FileExtension='xlsx' Or FileExtension='xlt'</Query>

<Query>FileExtension='ppt'</Query>

当查询所有内容的时候则保持标签内容为空,如果需要查询则编写查询条件放在标签中。

标签中使用的IsDocumentFileExtension都是前面介绍的元数据属性。

例如,我们要查询内容类型为软件知识的内容,则编写为ContentType='软件知识'即可。

此结果类型可查询字段定义

类似,也是元数据属性映射的网站栏。所以如果需要搜索其它类型的字段,则根据前面的步骤进行定义即可。

7.最后是一个定义过的XML描述文件的例子。

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

     <LangDefs>

         <LangDef DisplayName="中文" LangID="4"/>

     </LangDefs>

     <Languages>

         <Language LangRef="4"/>

     </Languages>

     <PropertyDefs>

         <PropertyDef Name="Title" DataType="text" DisplayName="标题"/>

         <PropertyDef Name="ContentForKB" DataType="text" DisplayName="知识内容"/>

     </PropertyDefs>

     <ResultTypes>

         <ResultType DisplayName="所有结果" Name="default">

              <Query/>

              <PropertyRef Name="Title" />

              <PropertyRef Name="ContentForKB" />

         </ResultType>

         <ResultType DisplayName="软件知识" Name="softwarekb">

              <Query>ContentType='软件知识'</Query>

              <PropertyRef Name="Title" />

              <PropertyRef Name="ContentForKB" />

         </ResultType>

         <ResultType DisplayName="硬件知识" Name="hardwarekb">

              <Query>ContentType='硬件知识'</Query>

              <PropertyRef Name="Title" />

              <PropertyRef Name="ContentForKB" />

         </ResultType>

     </ResultTypes>

</root>

这个例子实现了既可以搜索网站的所有内容,也可以在指定的软件知识或者硬件知识范围内进行搜索。并提供了两个精确的字段搜索,标题和知识内容KBContent字段的搜索。

8.验证配置结果。

第一,搜索所有内容Windows关键字。
    

搜索结果
    

List6是软件知识库列表

List7是硬件知识库列表

可以看出,两个列表均被搜了出来,符合我们的预期。

第二,仅搜索软件知识中的结果。
    

结果如下
    

可以看到确实仅搜到了软件知识库列表Lilst6中的Windows信息。硬件知识库列表List7中的Windows并没有显示在搜索结果中。

第三,搜索硬件知识库中的信息。
    
    

同上,搜索结果中仅列出了硬件知识库List7列表中的相关信息。

第四,在两个列表中各增加一条信息,如下。
    
    

这样,在软件知识库中搜索KBContent字段包含JAVA应该就不会搜出第一条记录。在硬件知识库中搜索标题字段包含NET则不会搜索出第一条记录。因为增加了信息内容,需要对网站进行一次增量爬网才能被搜索到。

第五,软件知识库中搜索KBContent字段包含JAVA关键字的信息。
    

结果如下


    可以看到确实只搜出了后两条记录,第一条记录被排除在外。

第六,搜索硬件知识库List7列表中标题字段包含NET的信息。


    结果如下
    

结果同样,只搜索出了后两条记录,第一条记录由于不符合我们定制的查询条件而被排除在外。