Rechercher des gens FullTextSqlQuery avec CONTIENT sur PastProjects de propriété gérée
-
16-10-2019 - |
Question
Je développe une partie Web pour SharePoint 2010 qui utilise FullTextSqlQuery pour effectuer une recherche de personnes en utilisant la clause sur les CONTIENT PastProjects propriété gérée.
Je ne reçois pas de résultats retour. requêtes similaires pour d'autres propriétés gérées font des données de retour (responsabilité, compétences, intérêts), donc mon problème semble être spécifique aux PastProjects propriété gérée. Je sais qu'il ya des résultats de l'indice, depuis le milieu du peuple de la boîte de recherche ne retourne mon profil actuel lorsque je recherche un élément qui apparaît dans mon profil d'utilisateur « projets passés » propriété (ce qui prouve aussi l'indice est à jour) .
Je lis cet article que vous dit besoin pour assurer les propriétés gérées ont mis FullTextQueriable à true. Je trouve que PastProjects ne dispose pas, mais depuis la sortie de la boîte Les gens recherche ne donne les résultats escomptés, je dirais que je devrais être en mesure d'atteindre mon objectif sans mettre FullTextQueriable à true sur PastProjects.
J'ai inclus un code Web ci-dessous partie qui peut être utilisé pour, espérons reproduire le problème. Je vous serais reconnaissant si quelqu'un pouvait exécuter ce code sur leur environnement de dev et laissez-moi savoir ce que la partie Web a rendu.
Avant d'exécuter la partie Web, assurez-vous que vous avez vos propriétés de profil utilisateur suivant peuplé de valeurs multiples. Les projets passés, compétences, intérêts, moi au sujet
De plus, assurez-vous que votre index est à jour, et confirmez votre utilisateur est renvoyé par le milieu du peuple de la boîte recherche lorsque vous effectuez une recherche pour l'un des mots-clés que vous avez inscrits dans votre profil d'utilisateur (y compris les valeurs dans des projets antérieurs).
Merci!
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);
}
}
}
}
La solution
Essayez d'utiliser un KeywordQuery et le réglage de la RankingModeID à "D9BFB1A1-9036-4627-83B2-BBD9983AC8A1"
Ce code PowerShell fonctionne pour moi
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
La liste complète des modèles classement peut être trouvé avec cette Powershell.
Get-SPEnterpriseSearchServiceApplication | Get-SPEnterpriseSearchRankingModel
Autres conseils
Une chose à vérifier est que le nom des matchs sur le terrain. (Vous avez probablement, mais juste au cas où)
Je vois que vous faites référence à « PastProjects » et « projets passés ».