2017-08-26 5 views
0

Je travaille actuellement sur un projet avec une installation Solr (6.4.0) et j'ai du mal à comprendre une requête, dont je crois avoir besoin pour utiliser ma fonction de requête exigences.Solr - Filtrer les fonctions de requête sur un champ incohérent

Mon application a un noyau Solr qui couvre 5 types de documents différents (les utilisateurs peuvent indexer des sites Web, des documents, des articles, etc.). Le problème que j'ai est que les articles ont des dates de début et de fin afin qu'un utilisateur puisse créer un article à l'avance et fixer une date de début de 2 semaines à partir de maintenant. En interrogeant Solr je veux ajouter une fonction qui ignorera explicitement tout type d'index: article où la date active est plus grande que maintenant, mais n'exclut pas d'autres types de documents comme des sites Web, etc

J'ai lu sur un Wiki de Solr page (https://wiki.apache.org/solr/FunctionQuery#if) où il a quelques bons exemples mais je pense que je peux mal mettre en œuvre car je ne vois pas les résultats souhaités. J'utilise l'extension PECL PHP et et en ajoutant la requête comme ceci:

$query->addFilterQuery("if(exists(active-date), active-date:[* TO NOW], 1)"); 

Si j'effectuer une recherche *:* environ 900 résultats sont retournés et l'indice a environ 8000 dossiers où seulement 2 article Ayons dates actives qui sont future et le nombre total de tous les "articles" est d'environ 200 donc il semble filtrer hors d'autres "types d'index" au lieu de renvoyer 1 (nombre positif == vrai) sur la valeur else.

En résumé, j'ai besoin d'une requête qui va chercher le champ "active-date" (qui est seulement configuré sur index-type: article), vérifier si la date est dans le futur - si vrai puis exclure , si false inclut dans le jeu de résultats et si le champ n'est pas présent dans le jeu de résultats.

Merci d'avance!

Répondre

0

Je ne sais pas si vous réellement besoin d'une requête de fonction:

fq=(index-type:article AND active-date:[* TO NOW]) OR (*:* -active-date:*) 

.. aussi longtemps que le champ jour actif est présent sur tous les objets de l'article. Si ce n'est pas le cas, vous pouvez ajouter une condition supplémentaire à OR dans tous les documents qui n'ont pas le champ.

+0

Vous êtes la réponse a presque donné les résultats souhaités, mais le final OU nécessaire peaufinage. inline '$ query-> addFilterQuery (" (type-index: article AND date-active: [* TO NOW]) OR (*: * -active-date: *) ");' Si vous voulez mettre à jour votre réponse à le code ci-dessus je vais marquer comme répondu afin que vous obteniez le cred parce que je n'aurais pas trouvé ceci sans votre aide :) – UseYourName

+0

Fait. L'ancien exemple était '*: * -index-type: article', mais comme vous n'avez pas de champ de date active sur les autres ressources que celles avec' index-type: article', votre modification fonctionne correctement. – MatsLindh