Question sur un problème spécifique de recherche d'éléments


(Christophe Shopinvest) #1

Bonjour à tous,

Premièrement je vous remercie de bien vouloir prendre du temps de lire ma question.
Deuxièmement je vous remercie encore plus si vous arrivez à y répondre ^^

Donc voila mon problème : *avec la voix d'un prof de mathématique*

Disont que j'ai une liste de magasin indexé sur elastic, exemple:
{"elements": [ { "type": "livre","id": "203"},{ "type": "dvd","id": "1159"},{ "type": "dvd","id": "722"}]}
{"elements": [ { "type": "livre","id": "203"},{ "type": "dvd","value": "1513"},{ "type": "dvd","id": "723"}]}
{"elements": [ { "type": "livre","id": "203"},{ "type": "dvd","id": "1475"}]}

J'ai ensuite un exemple à trouver dans cette liste:
{"elements": [ { "type": "livre","id": "203"},{ "type": "dvd","value": "1475"},{ "type": "dvd","id": "723"},{ "type": "dvd","id": "1157"},{ "type": "dvd","id": "480"}]}

avec les conditions:
Pour matcher je dois avoir au moins un element(livre ou dvd) qui correspond à ma liste mais aucun element du magasin autre que ceux listés doit être présent.

Résultats attendu:
{"elements": [ { "type": "livre","id": "203"},{ "type": "dvd","id": "1475"}]} passe car il a un livre 203 et un dvd 1475.
{"elements": [ { "type": "livre","id": "203"},{ "type": "dvd","value": "1513"},{ "type": "dvd","id": "723"}]} ne passe pas car le dvd 1513 n'existe pas dans notre exemple.

Ma Problématique:
J'arrive a avoir au moins un element parmis ceux d'exemple, mais je n'arrive pas a exclure les magasins qui ont des elements en trop (pas present dans l'exemple).
Donc je veux le magasin qui correspond le mieux à l'exemple sans avoir d'element en trop.

Ma requete pour le moment:


{
  "query": 
  {
    "bool": {
      "should": [
        {
          "nested": {
            "path": "elements",
            "query": {
              "bool": {
                "must": [
                  {"term": {"elements.type": "livre"}},
                  {"term": {"elements.id": "203"}}
                ]
              }
            }
          }
        },
        {
          "nested": {
            "path": "elements",
            "query": {
              "bool": {
                "must": [
                  {"term": {"elements.type": "dvd"}},
                  {"term": {"elements.id": "1557"}
                  }
                ]
              }
            }
          }
        },
        {
          "nested": {
            "path": "elements",
            "query": {
              "bool": {
                "must": [
                  {"term": {"elements.type": "dvd"}},
                  {"term": {"elements.id": "723"}}
                ]
              }
            }
          }
        },
        {
          "nested": {
            "path": "elements",
            "query": {
              "bool": {
                "must": [
                  {"term": {"elements.type": "dvd"}},
                  {"term": {"elements.id": "1157"}}
                ]
              }
            }
          }
        },
        {
          "nested": {
            "path": "elements",
            "query": {
              "bool": {
                "must": [
                  {"term": {"elements.type": "dvd"}},
                  {"term": {"elements.id": "480"}}
                ]
              }
            }
          }
        }
      ]
    }
  }
}

Voila je suis donc un peu bloqué sur ce sujet, j'ai pensé à compter le nombre de match du should par rapport au nombre total d'element des magasins et éliminer ceux qui ont un match < au nombre d'élément. Mais j'ai pas non plus réussi à le transcrire avec elastic.

Donc j'en suis pour le moment à récupérer déjà ce que j'ai et a finir le traitement dans l'applicatif.

Je vous remercie encore.


(NIZOU franck) #2

Slt,

je débute mais voici quelques pistes :

avec :
filter et not
filter exists field value

en espérant que ça t'aide !


(system) #3