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的基础上也支持前缀搜索。

posted @ 2011-08-08 14:19  懒牛  阅读(744)  评论(0编辑  收藏  举报