人们搜索fullTextsqlquery,其中包含在PastProjects托管属性上
-
16-10-2019 - |
题
我正在为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”和“过去的项目”。