好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

SharePoint search 功能的定制开发

SharePoint search 功能的定制开发

概要

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

设计

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

view source print ?

1 using Microsoft.Office.Server;

2 using Microsoft.Office.Server.Search;

3 using Microsoft.Office.Server.Search.Query;

在sharepoint 2007中,我们如下scope():

默认的有people和all sites两个scope。我们以All sites举例。

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

以下是查询的流程图:

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

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

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

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

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

为自定义搜索应用程序选择查询类

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

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

代码设计

view source print ?

01 public class SharePointSearch

02 {

03  

04      #region Fields

05  

06      string queryStr = @"select hitHighlightedProperties,size,Write, author, path,

07                          hitHighlightedSummary,title,contentclass

08                          from scope() where " +

09                          "\"scope\" = '{0}' AND FREETEXT(defaultproperties, '{1}') " ;

10      string conditionSearchSource = " AND CONTAINS(path,'{0}')" ;

11  

12      #endregion

13  

14      #region Constructor

15  

16      /// <summary>

17      /// Default constructor.

18      /// </summary>

19      public SharePointSearch()

20      {

21      }

22  

23      #endregion

24  

25      #region Public Methods

26  

27      /// <summary>

28      /// 

29      /// </summary>

30      /// <param name="scope"></param>

31      /// <param name="searchSource"></param>

32      /// <param name="keyword"></param>

33      /// <param name="rowLimit"></param>

34      /// <returns></returns>

35      public DataTable GetSearchResultByKeyWord( 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      /// <param name="query"></param>

48      /// <param name="rowLimit"></param>

49      /// <returns></returns>

50      public DataTable GetSearchResultByQuery( string query, int rowLimit)

51      {

52          return this .CustomSearch(query, rowLimit);

53      }

54  

55      #endregion

56  

57      #region Private Methods

58  

59      /// <summary>

60      /// Excute search query

61      /// </summary>

62      /// <param name="query"></param>

63      /// <param name="rowLimit"></param>

64      /// <returns></returns>

65      private DataTable CustomSearch( string query, int rowLimit)

66      {

67          DataTable result = new DataTable();

68          string url = SPContext.Current.Web.Url;

69  

70          using (SPSite site = new SPSite(url))

71          {

72              ServerContext context = ServerContext.GetContext(site);

73  

74              FullTextSqlQuery fullQuery = 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              ResultTableCollection rt = fullQuery.Execute();

90              ResultTable resultTable = rt[ResultType.RelevantResults];

91              result.Load(resultTable, LoadOption.OverwriteChanges);

92          }

93  

94          return result;

95      }

96  

97      #endregion

98 }

而为什么FullTextSqlQuery 的属性是这样设置的,因为能过moss工具产生的xml结果图如下:

view source print ?

01 <?xml version= "1.0" encoding= "utf-8" ?>

02 <QueryPacket xmlns= "urn:Microsoft.Search.Query" Revision= "1000" >

03 <Query domain= "QDomain" >

04   <SupportedFormats><Format>urn:Microsoft.Search.Response.Document.Document</Format></SupportedFormats>

05   <Context>

06     <QueryText language= "en-US" type= "MSSQLFT" ><![CDATA[ SELECT Title, Rank, Size, Description, Write, Path FROM portal..scope() WHERE FREETEXT(DefaultProperties, 'test' ) AND  ( ( "SCOPE" = 'All Sites' ) )   ORDER BY "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]放到最上面。

作者: spring yang

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

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

作者: Leo_wl

    

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

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于SharePoint search 功能的定制开发的详细内容...

  阅读:57次