2016-04-21 2 views
3

Nous avons exigence où il y a trois champs date d'utilisateur, date d'enregistrement et date codée. Nous utilisons Solr pour la recherche et nous avons besoin de récupérer des enregistrements en utilisant la condition si la valeur existe pour la date d'utilisation, sinon vérifier la date d'enregistrement et si elle ne contient pas non plus utiliser la date codée et si les trois champs champ.Requête Solr qui accepte plusieurs champs renvoie la première valeur non nulle dans une liste comme coalesce dans Oracle

Cette exigence est similaire à la fonctionnalité COALESCE dans Oracle où elle accepte deux paramètres ou plus et renvoie la première valeur non nulle dans une liste. Si tous les paramètres contiennent des valeurs nulles, elle renvoie null.

Mise à jour :: Nous utilisons Solr 3.5.0

Par exemple ci-dessous est mes valeurs dans le tableau

DocumentID User entered date  Recorded date  Encoded date 
    A123  14th April 2016  12th April 2016 
    A124  12th April 2016       11th April 2016 
    A125       13th April 2016  12th April 2016 
    A126       12th April 2016 
    A127            15th April 2016 

Si nous recherchons pour le 12 Avril 2016 puis Solr devrait me revenir en tant que sortie A124 , A126 et non A123 ou A125 parce que l'utilisateur a entré la date et la date d'enregistrement pour ces champs respectivement.

+0

Je pense que vous devez aborder ce à votre fin une fois que vous obtenez les données en appliquant une certaine logique ... –

+0

il peut être mis en œuvre avec une requête simple utilisant des conditions booléennes OU – Oyeme

+0

@Oyeme J'ai essayé OU condition mais s'il y a des valeurs pour la date de l'utilisateur et la date d'enregistrement. SOLR cherche dans les deux domaines ce que je ne cherche pas. – rajadilipkolli

Répondre

0

Avez-vous essayé de spécifier des noms de champs avec lesquels effectuer une requête? quelque chose comme ça

q=foo&qf=title,description 

Avez-vous essayé cette

requête D'abord avec seulement le premier champ, date entrée utilisateur. récupère tout DocumentID. deuxièmement, interroger avec (même valeur q) quelque chose comme si la valeur du champ utilisateur est nulle, puis rechercher dans la deuxième valeur de champ, récupérer DocumentsID. Faites de même pour le troisième champ également. enfin fusionner tous DocumentsID.

+0

J'ai essayé cela mais il ne va pas résoudre le problème mentionné dans la question – rajadilipkolli

+0

ok, requête avec seulement le premier champ, date entrée par l'utilisateur. récupère tout DocumentID. deuxièmement, interroger avec (même valeur q) quelque chose comme si la valeur du champ utilisateur est nulle, puis rechercher dans la deuxième valeur de champ, récupérer DocumentsID. Faites de même pour le troisième champ également. enfin fusionner tous DocumentsID. – vinod

+0

Cette approche pourrait être une solution mais frapper trois fois est orienté vers la performance, donc ne peut pas être fait de cette façon – rajadilipkolli

1

Votre meilleure option est probablement de copier les champs dans un champ séparé dans l'ordre que vous voulez et ne garder que la première valeur. Dans le dernier Solr, je crois que cela peut être fait dans l'étape UpdateRequestProcessor avec CloneField, puis FirstFieldValue processeurs. Cependant, je suis tout à fait sûr, ces URP ont été introduits dans 5.x, et ne sont donc pas disponibles dans Solr 3.5.

Je suppose que vous devrez vraiment appliquer cette logique de domaine dans les données avant de les envoyer à Solr.

+0

Alex je suis d'accord avec vous mais le problème est enregistré date et la date codée sont des champs existants et nous avons ajouté la date d'utilisateur récemment. donc la logique changeante est aussi un problème et si vous voyez la structure de la table, elle peut contenir des valeurs nulles et des valeurs peuvent être ajoutées à tout moment – rajadilipkolli

+0

Vous voulez dire que vous avez déjà des enregistrements indexés comme ça et que la réindexation n'est pas une option? Vous recherchez une solution pure à l'heure de la requête? –

+0

Ouais pure solution de temps de requête dans SOLR 3.5 – rajadilipkolli

-1

On dirait que vous cherchez if(expression,trueValue,falseValue) fonction décrite dans FunctionQuery

Par exemple, pour dismax analyseur de requête, vous pouvez définir la fonction boost comme

bf="recip(rord(if(exists(u_date),u_date,if(exists(r_date),r_date),if(exists(e_date),e_date,0))),1,1000,1000)" 
+0

[FunctionQuery] (https://wiki.apache.org/solr/FunctionQuery#if) est introduit dans Solr 4.0 mais la version que nous utilisons est Solr 3.5 – rajadilipkolli