Créer des filtres dynamiques pour requête QSL, NEST


#1

Salut,
Seul le dernier filters.Add() est pris en compte, comment faire en sorte pour que dans ma requête ils soient tous pris en compte ?

Voici mon code :

Filtre dynamique :

  var filters = new List<Func<QueryContainerDescriptor<Source>, QueryContainer>>();
    for (int i = 0; i < nbPoint; i++)
    {
        filters.Add(
                        mu => mu.GeoBoundingBox(ge => ge
                                .Field(f => f.End)
                                .BoundingBox(latLeftTab[i], lonLeftTab[i], latRightTab[i], lonRightTab[i])
                            ) && mu
                            .GeoBoundingBox(ge => ge
                                .Field(f => f.Start)
                                .BoundingBox(latLeftTab[i], lonLeftTab[i], latRightTab[i], lonRightTab[i])
                            ) || mu
                            .GeoBoundingBox(ge => ge
                                .Field(f => f.End)
                                .BoundingBox(latLeftTab2[i], lonLeftTab2[i], latRightTab2[i], lonRightTab2[i])
                            ) && mu
                            .GeoBoundingBox(ge => ge
                                .Field(f => f.Start)
                                .BoundingBox(latLeftTab2[i], lonLeftTab2[i], latRightTab2[i], lonRightTab2[i])
                            )

        );
    }

Ma requête :

var searchResponse = client.LowLevel.Search<StringResponse>("jam", "jam", PostData.Serializable(new SearchDescriptor<Source>()
                 .From(0)
                 .Size(size)
                 .Query(q => q
                     .Bool(b => b
                         .Must(fi => fi
                             .DateRange(r => r
                                 .Field(f => f.Timestamp)
                                 .GreaterThanOrEquals(limitDate)
                                 .LessThan(DateTime.Now)
                             ), mi => mi
                         )
                         .Filter(filters)     
                         )
                     )
                 ));
                 qJson = searchResponse.Body;

Query DSL, multiple filter, dynamic query
(David Pilato) #2

Je ne m'y connais pas en Nest mais je dirais que tu devrais faire un truc du genre:

filters.Add(/* one single GeoBoundingBox */);
filters.Add(/* one single GeoBoundingBox */);
filters.Add(/* one single GeoBoundingBox */);

#3

Malheureusement non ca ne fonctionne pas.
C'est à chaque :

filters.Add(/* one or multiple GeoBoundingBox */);

Que l'ancien filters.Add() ne sera pas pris en compte, seul le dernier le sera. Cela va de même pour chaque query si je défini plusieurs Query, mon searchResponse ne prendra que le dernier Query écrit et pas tous pour effectuer la requête.

J'ai justement réussi à effectuer donc de façon statique cette requête en ajoutant l'opérateur || et &&, qui la fonctionne bien, le problème qui me survient c'est que je dois pouvoir opérer de façon dynamique.


(David Pilato) #4

Que l'ancien filters.Add() ne sera pas pris en compte, seul le dernier le sera.

Certain ?

En Java en tout cas, c'est comme ça qu'il faut ajouter les filtres.

Mais ensuite, qu'est ce qui te fait dire que tes 4 filtres ne sont pas pris en compte ?
Peut-être devait tu faire un exemple pour reproduire le problème en pure REST via la Console Dev Kibana, partager le résultat ici ?
Ca aiderait à déterminer si il s'agit d'un bug de Nest ou des mauvais filtres ou autre chose.


#5

Mes 4 filtres sont pris en compte.
J'ai une application qui me permet de visualiser les résultats qui me sont renvoyés donc je sais que dans ma boucle for, c'est la dernière itération qui va être prise en compte pour le résultat de searchResponse.
Je n'y est pas pensé mais tu as raison sinon je vais faire du pas à pas peut être qu'ils sont effectivement traité mais lorsque moi je le récupère tout les autres ont déjà été récupéré à un moment et ont juste été écrasé par la suite (je sais pas si j'ai été clair).
EDIT: non un seul résultat est retourné

Je ne connais que très peu Kibana, il existe un tutoriel pour faire cette manip ?


(David Pilato) #6

Je ne connais que très peu Kibana, il existe un tutoriel pour faire cette manip ?

Faut démarrer Kibana, aller dans la Dev Console, puis faire des scripts du type: About the Elasticsearch category

Le plus simple possible.


#7

Je n'est accès à kibana uniquement sur un site web


(David Pilato) #8

Qu'est ce que cela veut dire ?

Tu as accès à Kibana ou pas ?


#9

Et bien j'ai une url qui me redirige vers kibana


(David Pilato) #10

Et donc ? Tu vois Kibana ou pas ?


#11

Oui oui


#12

En fait s'il m'était possible d'effectuer une boucle à l'intérieur de mon filters.Add(), il serait peut être éventuellement possible que je les créer tous, il n'existe aucun moyen de faire cela ?
Enfin, ce qui me pose problème c'est donc la déclaration d'un nouveau filtre soit le :

mu => mu

#13

J'ai trouvé, je structure mon code et je poste la solution... Bloquer 2 jours et demie sur ca c'est un peu la honte, on voit bien que je maîtrise pas encore les structures NEST du tout :sleepy:
Et encore c'est une piste il faut que je l'exploite, si j'y arrive je posterais la solution vers fin de journée


(David Pilato) #14

Pourquoi utilises-tu une version si vieille?


(system) #15

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.