Comment puis-je effectuer une MOSS FullText Sql Query et personnes filtrer les résultats par les compétences propriété gérée?
-
21-09-2019 - |
Question
Je ne parviens pas à un MOSS FullTextSqlQuery en essayant de filtrer les résultats des personnes sur les compétences de la propriété géré à l'aide du prédicat CONTAINS. Permettez-moi de démontrer:
Une requête sans filtre renvoie le résultat attendu:
SELECT AccountName, Skills
from scope()
where freetext(defaultproperties,'+Bob')
And ("scope" = 'People')
Résultat
Total Rows: 1
ACCOUNTNAME: MYDOMAIN\Bob
SKILLS: Numchucks | ASP.Net | Application Architecture
Mais quand j'ajouter un prédicat CONTAINS, je ne reçois plus le résultat escompté:
SELECT AccountName, Skills
from scope()
where freetext(defaultproperties,'+Bob')
And ("scope" = 'People')
And (CONTAINS(Skills, 'Numchucks'))
Résultat
Total Rows: 0
Je me rends compte que je peux y arriver en utilisant le prédicat SOME ARRAY, mais je voudrais savoir pourquoi cela ne fonctionne pas avec le prédicat CONTAINS pour la propriété des compétences. J'ai réussi en utilisant le prédicat CONTAINS avec une propriété rampé personnalisé qui est indiqué comme « Multi-évalué ». La propriété des compétences (bien qu'il semble être à valeurs multiples) n'est pas indiquée en tant que telle sur la page Propriétés rampé dans le site d'administration SSP:
http: ///ssp/admin/_layouts/schema.aspx ConsoleView = crawledPropertiesView & category = Les gens
Quelqu'un a des idées?
La solution
Alors, avec l'aide de Mark Cameron (Microsoft SharePoint Support Developer), je me suis dit que certaines propriétés gérées doivent être activé pour la recherche en texte intégral en utilisant l'API modèle d'objet ManagedProperty en définissant la propriété FullTextQueriable true. Ci-dessous la méthode qui a résolu ce problème pour moi. Il pourrait être inclus dans une application console ou une application agricole ou Web scope récepteur de fonction.
using Microsoft.Office.Server;
using Microsoft.Office.Server.Search.Administration;
private void EnsureFullTextQueriableManagedProperties(ServerContext serverContext)
{
var schema = new Schema(SearchContext.GetContext(serverContext));
var managedProperties = new[] { "SKILLS", "INTERESTS" };
foreach (ManagedProperty managedProperty in schema.AllManagedProperties)
{
if (!managedProperties.Contains(managedProperty.Name.ToUpper()))
continue;
if (managedProperty.FullTextQueriable)
continue;
try
{
managedProperty.FullTextQueriable = true;
managedProperty.Update();
Log.Info(m => m("Successfully set managed property {0} to be FullTextQueriable", managedProperty.Name));
}
catch (Exception e)
{
Log.Error(m => m("Error updating managed property {0}", managedProperty.Name), e);
}
}
}
Autres conseils
SELECT AccountName, Skills
from scope()
where freetext(defaultproperties,'+Bob')
And ("scope" = 'People')
And (CONTAINS(Skills, 'Numchucks*'))
utiliser le * à la fin.
Vous avez également quelques options pour essayer:
La liste suivante identifie éléments de requête supplémentaires qui sont uniquement pris en charge avec la syntaxe de recherche SQL en utilisant la classe FullTextSqlQuery:
FREETEXT ()
CONTAINS ()
comme