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);
            }
        }
    }
}
Était-ce utile?

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 ».

Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top