我正在为SharePoint 2010开发一个Web零件,该部分使用FullTextSqlquery使用PastProjects托管属性上的contrase子句来执行人员搜索。

我没有得到任何结果。对其他托管属性的类似查询确实返回数据(责任,技能,兴趣),因此我的问题似乎是针对过去的托管属性的。我知道该索引中有结果,因为当我搜索出现在我的“过去项目”用户配置文件属性中的项目时,人们确实会返回我的当前个人资料(这也证明了索引是最新的) 。

我读 本文 这说明您需要确保托管属性具有全文可及可设置为true。我发现PastProjects没有这个,但是由于人们的开箱即用搜索确实返回了预期的结果,因此我会说我应该能够实现我的目标,而无需将FullTextquer -flultextquer -trup -fult Textquers设置为真实。

我在下面包含了一些Web零件代码,希望可以用来重现问题。如果有人可以在开发环境上运行此代码,并让我知道网络部分的呈现,我将不胜感激。

在运行网络部分之前,请确保您拥有以下用户配置文件属性,这些属性填充了多个值:过去的项目,技能,兴趣,询问我。

另外,请确保您的索引是最新的,并在您搜索用户配置文件中输入的任何关键字(包括过去项目中的值)时,确认您的用户正在返回您的用户。

谢谢!

using System;
using System.ComponentModel;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using Microsoft.Office.Server;
using Microsoft.Office.Server.UserProfiles;
using Microsoft.Office.Server.Search.Administration;
using System.Collections.Specialized;
using Microsoft.SharePoint.Administration;
using System.Collections;
using System.Data;
using Microsoft.Office.Server.Search.Query;
using System.Text;

namespace SampleCode
{
    [ToolboxItemAttribute(false)]
    public class SearchDemoWebPart1 : WebPart
    {
        protected Literal literalMessage;

        protected override void CreateChildControls()
        {
            this.literalMessage = new Literal();
            this.literalMessage.ID = "literalMessage";
            this.Controls.Add(this.literalMessage);
        }

        protected override void  OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            string searchProxyName = "Search Default SA"; // make sure this matches the name of your SharePoint Search Application

            UserProfileManager manager = new UserProfileManager(SPServiceContext.Current);

            UserProfile profile = manager.GetUserProfile(false);

            SearchQueryAndSiteSettingsServiceProxy settingsProxy = SPFarm.Local.ServiceProxies.GetValue<SearchQueryAndSiteSettingsServiceProxy>();

            SearchServiceApplicationProxy searchProxy = settingsProxy.ApplicationProxies.GetValue<SearchServiceApplicationProxy>(searchProxyName);

            NameValueCollection pairs = new NameValueCollection();
            pairs.Add("SPS-Responsibility", "Responsibility");
            pairs.Add("SPS-PastProjects",   "PastProjects");
            pairs.Add("SPS-Skills",         "Skills");
            pairs.Add("SPS-Interests",      "Interests");

            StringBuilder messages = new StringBuilder();

            foreach (string key in pairs.AllKeys)
            {
                string profilePropertyName = key;
                string managedPropertyName = pairs[key];

                this.ProcessUserProfileProperty(searchProxy, profile, profilePropertyName, managedPropertyName, messages);
            }

            this.EnsureChildControls();

            this.literalMessage.Text = messages.ToString();
        }

        public void ProcessUserProfileProperty(SearchServiceApplicationProxy searchProxy, UserProfile profile, string profilePropertyName, string managedPropertyName, StringBuilder messages)
        {
            IEnumerator allValues = profile[profilePropertyName].GetEnumerator();

            while (allValues.MoveNext())
            {
                string keyword = allValues.Current.ToString();

                DataTable resultsDataTable = new DataTable();

                FullTextSqlQuery sqlQuery = new FullTextSqlQuery(searchProxy);

                StringBuilder queryText = new StringBuilder();

                sqlQuery.QueryText = String.Format(@"SELECT Title, AccountName, {0} FROM SCOPE() WHERE CONTAINS({0}, '{1}') AND (""Scope""='People')", managedPropertyName, keyword);
                sqlQuery.ResultsProvider = SearchProvider.Default;
                sqlQuery.ResultTypes = ResultType.RelevantResults;

                ResultTableCollection resultsTableCollection = sqlQuery.Execute();

                using (ResultTable searchResultsTable = resultsTableCollection[ResultType.RelevantResults])
                {
                    resultsDataTable.TableName = keyword;
                    resultsDataTable.Load(searchResultsTable, LoadOption.OverwriteChanges);
                }

                string color = resultsDataTable.Rows.Count == 0 ? "red" : "green";

                messages.AppendFormat(@"<div style=""color: {3}"">Found {0} result(s) for '{1}' in Managed Property '{2}'.</div>", resultsDataTable.Rows.Count, keyword, managedPropertyName, color);
            }
        }
    }
}
有帮助吗?

解决方案

尝试使用keywordquery,然后将排名模式设置为“ D9BFB1A1-9036-4627-83B2-BBD9983AC8A1”

此Powershell代码对我有用

Add-PSSnapin Microsoft.SharePoint.PowerShell

$site = get-spsite "http://localhost"
$kq = new-object Microsoft.Office.Server.Search.Query.KeywordQuery($site)

$kq.ResultTypes= [Microsoft.Office.Server.Search.Query.ResultType]::RelevantResults
$kq.RankingModelId = "D9BFB1A1-9036-4627-83B2-BBD9983AC8A1"
$kq.QueryText = 'gamma'
$kq.HiddenConstraints = 'scope:"People"'
$res = $kq.Execute()

$table = new-object System.Data.DataTable
$table.Load($res[$kq.ResultTypes],[System.Data.LoadOption]::OverwriteChanges)

echo $table

使用此PowerShell可以找到排名模型的完整列表。

Get-SPEnterpriseSearchServiceApplication | Get-SPEnterpriseSearchRankingModel

其他提示

要检查的一件事是字段的名称匹配。 (您可能有,但以防万一)

我看到您指的是“ PastProjects”和“过去的项目”。

许可以下: CC-BY-SA归因
scroll top