Récemment, j’ai eu la nécessité de lister tous les documents pour lesquels une propriété n’était pas définie.
Je ne m’étais pas encore intéressé à la manière dont SOLR traitait ces cas, voici mon retour d’expérience avec Alfresco 4.0.d et les recherches « FTS-Alfresco ».
Dans la page du wiki Alfresco dédiée à la recherche, on peut lire :
ISNULL : Is the property null
On peut donc raisonnablement penser qu’une recherche :
ISNULL:"model:propriété"
retournera l’ensemble des objets pour lesquels la propriété n’est pas définie.
Cette recherche retournera les résultats attendus, pour peu que la propriété utilisée ne possède pas les critères d’indexation suivants :
<index enabled="true"> <atomic>true</atomic> <stored>false</stored> <tokenised>both</tokenised> </index>
En effet, dans une telle situation, l’utilisation de ISNULL sera conforme aux attentes tant qu’aucune valeur n’a été définie pour la propriété; mais si une valeur est définie puis vidée (ou tout simplement si on définit une valeur vide), alors la propriété n’est plus « NULL ».
Si les mêmes opérations sont réalisées pour une propriété disposant d’une indexation standard, la propriété sera « NULL » qu’elle n’ait jamais été définie ou que sa valeur soit vide.
Bien que très lisible, l’opérateur ISNULL est donc à éviter.
Le meilleure façon que j’ai trouvée de traiter le sujet est de faire une recherche opposée.
La recherche
model:propriété:"*"
signifie : « Recherche tous les noeuds pour lesquels la propriété model:propriété contient quelque chose, peut importe cette chose »… si on la prend à l’envers on devrait avoir la signification « Recherche tous les noeuds pour lesquels la propriété model:propriété ne contient rien ».
Cette recherche s’écrit :
-model:propriété:"*"
Et la magie d’Alfresco et SOLR intervenant, nous obtenons les résultats attendus !