设为首页 收藏本站
查看: 1188|回复: 0

[经验分享] SharePoint search 功能的定制开发

[复制链接]

尚未签到

发表于 2015-9-25 10:17:36 | 显示全部楼层 |阅读模式
  概要
  客户要求改善 SharePoint 2007的搜索功能,我们要自定义开发搜索功能,一翻调查和研究,sharepoint 的搜索用到KeywordSearchQuery和FullTextSearchQuery 两种方式,因为我们要用到自定义的sharepoint list字段做为过虑条件,所以采用FullTextSearchQuery 来开发。
  
  设计
  FullTextSearchQuery 做sharepoint 2007二次开发要用到以下组件:
using Microsoft.Office.Server;
using Microsoft.Office.Server.Search;
using Microsoft.Office.Server.Search.Query;
  
  
  在sharepoint 2007中,我们如下scope():
DSC0000.png
  
  默认的有people和all sites两个scope。我们以All sites举例。
  
  sharepoint Content sources 在爬虫时的流程图(方便理解scope()内容的来源)
DSC0001.png
  
  
  以下是查询的流程图:
DSC0002.png
  
  
  用户使用查询时,sharepoint对于用户的安全检查:
DSC0003.png
  
  以上说明仅供读者了解sharepoint查询时要做的工作.
  Microsoft.SharePoint.Search.Query 命名空间包括三个查询类:


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

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


为自定义搜索应用程序选择查询类
  若要确定用于自定义搜索应用程序(FullTextSqlQueryKeywordQuery)的适当的类,请考虑希望应用程序代码支持的搜索查询中的复杂级别。
  下面的列表标识仅受使用 FullTextSqlQuery 类的 SQL 搜索语法支持的附加查询元素:FREETEXT、CONTAINS、LIKE和ORDER BY.
  代码设计

    public class SharePointSearch
{
#region Fields
string queryStr = @"select hitHighlightedProperties,size,Write, author, path,
hitHighlightedSummary,title,contentclass
from scope() where " +
"\"scope\" = '{0}' AND FREETEXT(defaultproperties, '{1}') ";
string conditionSearchSource = " AND CONTAINS(path,'{0}')";
#endregion
#region Constructor
/// <summary>
/// Default constructor.
/// </summary>
public SharePointSearch()
{
}
#endregion
#region Public Methods
/// <summary>
///
/// </summary>
/// <param name=&quot;scope&quot;></param>
/// <param name=&quot;searchSource&quot;></param>
/// <param name=&quot;keyword&quot;></param>
/// <param name=&quot;rowLimit&quot;></param>
/// <returns></returns>
public DataTable GetSearchResultByKeyWord(string scope, string searchSource, string keyword, int rowLimit)
{
string query = string.Format(this.queryStr, scope, keyword);
if (!string.IsNullOrEmpty(searchSource))
query += string.Format(this.conditionSearchSource, searchSource);
return this.CustomSearch(query, rowLimit);
}
/// <summary>
///
/// </summary>
/// <param name=&quot;query&quot;></param>
/// <param name=&quot;rowLimit&quot;></param>
/// <returns></returns>
public DataTable GetSearchResultByQuery(string query, int rowLimit)
{
return this.CustomSearch(query, rowLimit);
}
#endregion
#region Private Methods
/// <summary>
/// Excute search query
/// </summary>
/// <param name=&quot;query&quot;></param>
/// <param name=&quot;rowLimit&quot;></param>
/// <returns></returns>
private DataTable CustomSearch(string query, int rowLimit)
{
DataTable result = new DataTable();
string url = SPContext.Current.Web.Url;
using (SPSite site = new SPSite(url))
{
ServerContext context = ServerContext.GetContext(site);
FullTextSqlQuery fullQuery = new FullTextSqlQuery(site);
fullQuery.Culture = System.Globalization.CultureInfo.InvariantCulture;
fullQuery.QueryText = query;
fullQuery.ResultTypes = ResultType.RelevantResults;
fullQuery.EnableStemming = false;
fullQuery.IgnoreAllNoiseQuery = true;
fullQuery.TrimDuplicates = true;
fullQuery.KeywordInclusion = KeywordInclusion.AnyKeyword;
fullQuery.RowLimit = rowLimit;
if (SPSecurity.AuthenticationMode != System.Web.Configuration.AuthenticationMode.Windows)
fullQuery.AuthenticationType = QueryAuthenticationType.PluggableAuthenticatedQuery;
else
fullQuery.AuthenticationType = QueryAuthenticationType.NtAuthenticatedQuery;
ResultTableCollection rt = fullQuery.Execute();
ResultTable resultTable = rt[ResultType.RelevantResults];
result.Load(resultTable, LoadOption.OverwriteChanges);
}
return result;
}
#endregion
}
  
  
  而为什么FullTextSqlQuery 的属性是这样设置的,因为能过moss工具产生的xml结果图如下:

<?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?>
<QueryPacket xmlns=&quot;urn:Microsoft.Search.Query&quot; Revision=&quot;1000&quot;>
<Query domain=&quot;QDomain&quot;>
<SupportedFormats><Format>urn:Microsoft.Search.Response.Document.Document</Format></SupportedFormats>
<Context>
<QueryText language=&quot;en-US&quot; type=&quot;MSSQLFT&quot;><![CDATA[ SELECT Title, Rank, Size, Description, Write, Path FROM portal..scope() WHERE FREETEXT(DefaultProperties, 'test') AND  ( (&quot;SCOPE&quot; = 'All Sites') )   ORDER BY &quot;Rank&quot; DESC ]]></QueryText>
</Context>
<Range><StartAt>1</StartAt><Count>20</Count></Range>
<EnableStemming>false</EnableStemming>
<TrimDuplicates>true</TrimDuplicates>
<IgnoreAllNoiseQuery>true</IgnoreAllNoiseQuery>
<ImplicitAndBehavior>false</ImplicitAndBehavior>
<IncludeRelevanceResults>true</IncludeRelevanceResults>
<IncludeSpecialTermResults>false</IncludeSpecialTermResults>
<IncludeHighConfidenceResults>false</IncludeHighConfidenceResults>
</Query></QueryPacket>
  
  
  如果sharepoint里item内容语言是en-us的话,一定要在IE浏览器里设置:
DSC0004.png
  
  把english[en]放到最上面。
  
  
  
  作者:spring yang
  出处:http://www.cnblogs.com/springyangwc/
  本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-118534-1-1.html 上篇帖子: 使用SharePoint Web Service(1):创建子站点 下篇帖子: 微软Windows SharePoint Services 3.0 应用程序模板( Templates)中文版推出了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表