3

J'ai des problèmes avec un FulltextSqlQuery MOSS lorsque je tente de filtrer les résultats People sur la propriété Skills Skills en utilisant le prédicat CONTAINS. Permettez-moi de démontrer:Comment puis-je effectuer un MOSS FullTextSqlQuery et filtrer les résultats de personnes par la propriété Skills managed?

Une requête sans filtre retourne 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 le résultat attendu :

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 à utiliser le prédicat CONTAINS avec une propriété d'analyse personnalisée indiquée comme "multi-valuée". La propriété Skills (bien qu'elle semble avoir plusieurs valeurs) n'est pas indiquée comme telle sur la page Crawled Properties du site d'administration SSP:

http: ///ssp/admin/_layouts/schema.aspx? ConsoleView = crawledPropertiesView & category = Personnes

Vous avez des idées?

+0

La raison pour laquelle je ne peux pas utiliser le prédicat SOME ARRAY est que je n'ai besoin de renvoyer que les utilisateurs possédant toutes les compétences requises. C'est-à-dire que les utilisateurs retournés nommés Bob possèdent les compétences Numchucks AND ASP.Net. Le prédicat CONTAINS me semble la meilleure approche pour accomplir ceci. Si je suis égaré, s'il vous plaît faites le moi savoir. – Trent

Répondre

2

Donc, avec l'aide de Mark Cameron (Microsoft SharePoint Support Developer), je me suis dit que certaines propriétés gérées doivent être a permis pour la recherche en texte intégral en utilisant l'API modèle d'objet ManagedProperty en définissant la Propriété FullTextQueriable à true. Voici la méthode qui a résolu ce problème pour moi. Il peut être inclus dans une application de console ou en tant que récepteur de fonctionnalités étendu d'application Web ou de batterie.

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); 
      } 
     } 
    } 
+1

Ecrit des détails supplémentaires sur certains des indicateurs de propriété gérés peu connus ici: http://trentacular.com/2010/03/moss- fulltextsqlquery-api-peu-connu-drapeaux-sur-gérés-propriétés / – Trent

0
SELECT AccountName, Skills 
from scope() 
where freetext(defaultproperties,'+Bob') 
And ("scope" = 'People') 
And (CONTAINS(Skills, 'Numchucks*')) 

Utilisez le signe * à la fin.

Vous avez également quelques options pour essayer:

La liste suivante identifie éléments de requête supplémentaires qui sont pris en charge uniquement avec la recherche SQL syntaxe utilisant la classe FullTextSqlQuery:

FREETEXT()

CONTAINS()

COMME

Source

+0

J'ai essayé votre suggestion ci-dessus en utilisant le * à la fin, mais toujours aucun résultat n'est retourné. L'option FREETEXT() n'est vraiment pas une option pour moi puisque je me soucie du classement de mes résultats en fonction du terme de recherche, et non du filtre de compétences. J'ai maintenant confirmé que le prédicat CONTAINS ne fonctionne pas comme prévu sur la propriété gérée INTERESTS – Trent