SharePoint 2010 通配符搜索
SharePoint 2010 提供了很强大的搜索功能,你可以通过很简单的配置就可以使用强大的搜索功能,还包括强大的wildcard 搜索,唯一遗憾的时SharePoint 2010 不支持前缀的wildcard 搜索。
我们先来体验下后缀的Wildcard 搜索,如果你想搜索所有包含Share相关的文档, 直接输入Share*,就能搜索到SharePoint, Shared等匹配的内容。
但是你不可以输入*Point来搜索SharePoint。有什么办法可以可以让SharePoint 支持suffix wildcard 搜索吗?
我们先来看看第一种方法:搜索Content Database,这个方法有自己的优点和局限性
优点:我们可以任意写我们的query语句,SQL 能做的,我们都能做。
缺点:只能在一个内容数据库进行搜索,也就是说,搜索的范围不能超越网站集(site Collection),另外微软并不建议直接操作数据库。
首先创建一个Search webpart,核心代码比较简单,关键是你如何处理UI, 让它看起来跟SharePoint 搜索基本相似。
public partial class SearchFilesUserControl : UserControl { DataTable results = new DataTable(); string conn = "Data Source=database Server; Initial Catalog={0}; Integrated Security=True;"; protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { string query = HttpContext.Current.Request.QueryString["K"] != null ? HttpContext.Current.Request.QueryString["K"].ToString() : ""; string[] querys = query.Trim().Split(' '); string contentDB = string.Empty; if (SPContext.Current != null) { contentDB = SPContext.Current.Site.ContentDatabase.Name; } else { // build your site } conn = string.Format(conn, contentDB); DataTable dt = QuickGetTable(conn, querys); searchResult.DataSource = dt; searchResult.DataBind(); } } public DataTable QuickGetTable(string connectionStr, string[] keys) { try { SPSecurity.RunWithElevatedPrivileges( delegate() { using (SqlConnection conn = new SqlConnection(connectionStr)) { conn.Open(); SqlCommand command = new SqlCommand(ConfigurationManager.AppSettings["sqlQueryString"], conn); SqlDataAdapter adapter = new SqlDataAdapter(command); adapter.Fill(results); conn.Close(); } }); } catch (Exception ex) { throw ex; } return results; } protected void searchResult_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType == DataControlRowType.DataRow) { GridViewRow row = e.Row; DataRowView rowView = (DataRowView)row.DataItem; byte[] bDesp =(byte[]) rowView["Filedesp"]; string desp = System.Text.Encoding.Default.GetString(bDesp); HtmlGenericControl fileDescription = (HtmlGenericControl)row.FindControl("fileDesp"); fileDescription.InnerText = desp.Substring(0, 20); } } }
以上代码很简单,只需要简单解释一下两处:
1. string query = HttpContext.Current.Request.QueryString["K"] != null ? HttpContext.Current.Request.QueryString["K"].ToString() : "";
这段代码用来获得我们搜索的关键字,
2. SPSecurity.RunWithElevatedPrivileges(
delegate()
{});
我们把读取数据库内容的代码放在RunWithElevatedPrivileges内部,这样我们就不用去关心用户没有权限去读取数据库内容的问题。
然后创建一个页面,加入我们的web
part,并在SharePoint 搜索设置的页面设置为我们创建的页面就可以了。
开发起来比较简单,关键的部分是如果构建自己的SQL 查询语句和如果显示查询结果, 限制也很多毕竟微软不建议直接操作数据库,这里只是提供一中search的解决方案。
下一篇我们了解如果在SharePoint search的基础上也支持前缀搜索。