您的位置:首页 > 其它

SharePoint search 功能的定制开发

2011-07-10 22:33 357 查看
概要

客户要求改善SharePoint2007的搜索功能,我们要自定义开发搜索功能,一翻调查和研究,sharepoint的搜索用到KeywordSearchQuery和FullTextSearchQuery两种方式,因为我们要用到自定义的sharepointlist字段做为过虑条件,所以采用FullTextSearchQuery来开发。

设计

FullTextSearchQuery做sharepoint2007二次开发要用到以下组件:

1
using
Microsoft.Office.Server;
2
using
Microsoft.Office.Server.Search;
3
using
Microsoft.Office.Server.Search.Query;
在sharepoint2007中,我们如下scope():





默认的有people和allsites两个scope。我们以Allsites举例。

sharepointContentsources在爬虫时的流程图(方便理解scope()内容的来源)





以下是查询的流程图:





用户使用查询时,sharepoint对于用户的安全检查:





以上说明仅供读者了解sharepoint查询时要做的工作.

Microsoft.SharePoint.Search.Query命名空间包括三个查询类:

FullTextSqlQuery使用此类可执行SQL语法搜索查询。

KeywordQuery使用此类可执行关键字语法搜索查询。

为自定义搜索应用程序选择查询类
若要确定用于自定义搜索应用程序(FullTextSqlQueryKeywordQuery)的适当的类,请考虑希望应用程序代码支持的搜索查询中的复杂级别。

下面的列表标识仅受使用FullTextSqlQuery类的SQL搜索语法支持的附加查询元素:FREETEXT、CONTAINS、LIKE和ORDERBY.

代码设计

01
public
class
SharePointSearch
02
{
03
04
#regionFields
05
06
string
queryStr=
@"selecthitHighlightedProperties,size,Write,author,path,
07
hitHighlightedSummary,title,contentclass
08
fromscope()where"
+
09
"\"scope\"='{0}'ANDFREETEXT(defaultproperties,'{1}')"
;
10
string
conditionSearchSource=
"ANDCONTAINS(path,'{0}')"
;
11
12
#endregion
13
14
#regionConstructor
15
16
///<summary>
17
///Defaultconstructor.
18
///</summary>
19
public
SharePointSearch()
20
{
21
}
22
23
#endregion
24
25
#regionPublicMethods
26
27
///<summary>
28
///
29
///</summary>
30
///<paramname="scope"></param>
31
///<paramname="searchSource"></param>
32
///<paramname="keyword"></param>
33
///<paramname="rowLimit"></param>
34
///<returns></returns>
35
public
DataTableGetSearchResultByKeyWord(
string
scope,
string
searchSource,
string
keyword,
int
rowLimit)
36
{
37
string
query=
string
.Format(
this
.queryStr,scope,keyword);
38
if
(!
string
.IsNullOrEmpty(searchSource))
39
query+=
string
.Format(
this
.conditionSearchSource,searchSource);
40
41
return
this
.CustomSearch(query,rowLimit);
42
}
43
44
///<summary>
45
///
46
///</summary>
47
///<paramname="query"></param>
48
///<paramname="rowLimit"></param>
49
///<returns></returns>
50
public
DataTableGetSearchResultByQuery(
string
query,
int
rowLimit)
51
{
52
return
this
.CustomSearch(query,rowLimit);
53
}
54
55
#endregion
56
57
#regionPrivateMethods
58
59
///<summary>
60
///Excutesearchquery
61
///</summary>
62
///<paramname="query"></param>
63
///<paramname="rowLimit"></param>
64
///<returns></returns>
65
private
DataTableCustomSearch(
string
query,
int
rowLimit)
66
{
67
DataTableresult=
new
DataTable();
68
string
url=SPContext.Current.Web.Url;
69
70
using
(SPSitesite=
new
SPSite(url))
71
{
72
ServerContextcontext=ServerContext.GetContext(site);
73
74
FullTextSqlQueryfullQuery=
new
FullTextSqlQuery(site);
75
fullQuery.Culture=System.Globalization.CultureInfo.InvariantCulture;
76
fullQuery.QueryText=query;
77
fullQuery.ResultTypes=ResultType.RelevantResults;
78
fullQuery.EnableStemming=
false
;
79
fullQuery.IgnoreAllNoiseQuery=
true
;
80
fullQuery.TrimDuplicates=
true
;
81
82
fullQuery.KeywordInclusion=KeywordInclusion.AnyKeyword;
83
fullQuery.RowLimit=rowLimit;
84
if
(SPSecurity.AuthenticationMode!=System.Web.Configuration.AuthenticationMode.Windows)
85
fullQuery.AuthenticationType=QueryAuthenticationType.PluggableAuthenticatedQuery;
86
else
87
fullQuery.AuthenticationType=QueryAuthenticationType.NtAuthenticatedQuery;
88
89
ResultTableCollectionrt=fullQuery.Execute();
90
ResultTableresultTable=rt[ResultType.RelevantResults];
91
result.Load(resultTable,LoadOption.OverwriteChanges);
92
}
93
94
return
result;
95
}
96
97
#endregion
98
}
而为什么FullTextSqlQuery的属性是这样设置的,因为能过moss工具产生的xml结果图如下:

01
<?xmlversion=
"1.0"
encoding=
"utf-8"
?>
02
<QueryPacketxmlns=
"urn:Microsoft.Search.Query"
Revision=
"1000"
>
03
<Querydomain=
"QDomain"
>
04
<SupportedFormats><Format>urn:Microsoft.Search.Response.Document.Document</Format></SupportedFormats>
05
<Context>
06
<QueryTextlanguage=
"en-US"
type=
"MSSQLFT"
><![CDATA[SELECTTitle,Rank,Size,Description,Write,PathFROMportal..scope()WHEREFREETEXT(DefaultProperties,
'test'
)AND((
"SCOPE"
=
'AllSites'
))ORDERBY
"Rank"
DESC]]></QueryText>
07
</Context>
08
<Range><StartAt>1</StartAt><Count>20</Count></Range>
09
<EnableStemming>
false
</EnableStemming>
10
<TrimDuplicates>
true
</TrimDuplicates>
11
<IgnoreAllNoiseQuery>
true
</IgnoreAllNoiseQuery>
12
<ImplicitAndBehavior>
false
</ImplicitAndBehavior>
13
<IncludeRelevanceResults>
true
</IncludeRelevanceResults>
14
<IncludeSpecialTermResults>
false
</IncludeSpecialTermResults>
15
<IncludeHighConfidenceResults>
false
</IncludeHighConfidenceResults>
16
</Query></QueryPacket>
如果sharepoint里item内容语言是en-us的话,一定要在IE浏览器里设置:





把english[en]放到最上面。

作者:springyang

出处:http://www.cnblogs.com/springyangwc/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐