2016-05-05 1 views
0

J'ai besoin de traduire SQL simple comme ceci: WHERE (abc1 IN (x, y, z) OR abc2 IN (x, y, z) OR abc3 IN (x, y, z)) AND (abc4 IN (x, y, z) OR abc5 IN (x, y, z)) AND abc6 < 5 AND abc7 IN (x, y, z) dans la requête elasticsearch.Elasticsearch - Comment traduire cette requête SQL simple en requête de recherche élastique

J'ai fait une requête (posté ci-dessous) qui semble faire ce que j'ai besoin de faire mais je suis incapable de créer AND (abc4 IN (x, y, z) OR abc5 IN (x, y, z) partie dans le premier() de SQL. J'ai été obtenir des erreurs elasticsearch ou aucun résultat avec d'innombrables variations de cette demande JSON en essayant de le faire fonctionner. Je pense que la bonne réponse serait d'utiliser la requête filtrée avec la clé "and" mais je suis incapable de trouver la bonne variation.

Quelqu'un peut-il m'aider s'il vous plaît? Je perds mon espoir, tout en essayant de résoudre ce problème pendant environ une semaine. Ou pouvez-vous au moins me dire si je suis dans la bonne direction pour résoudre ce problème? Merci beaucoup.

{ 
"query": { 
    "filtered": { 
     "filter": { 
      "bool": { 
      "should": [ 
       { 
        "terms": { 
         "abc1": [x, y, z] 
        } 
       }, 
       { 
        "terms": { 
         "abc2": [x, y, z] 
        } 
       }, 
       { 
        "terms": { 
         "abc3": [x, y, z] 
        } 
       }, 
      ] 
      } 
     }, 
     "query": { 
      "bool": { 
      "must": [ 
       { 
        "terms": { 
         "abc7": [x, y, z] 
        } 
       }, 
       { 
        "nested": { 
         "path": "nestedpath", 
         "query": { 
         "bool": { 
          "must": [ 
           { 
            "range": { 
            "nestedpath.abc6": { 
             "lt": 5 
            } 
            } 
           } 
          ] 
         } 
         } 
        } 
       } 
      ] 
      } 
     } 
    } 
} 
} 

Quelque chose comme cela devrait être un match:

"_source": { 
    "group": { 
     "abc1": "x", 
     "abc2": "y", 
     "abc3": "z" 
    }, 
    "anotherGroup": { 
     "abc4": "y", 
     "abc5": "z" 
    }, 
    "nestedpath": [ 
     { 
      "abc6": 2 
     } 
    ], 
    "abc7": "x" 
} 

Répondre

0

Si votre carte est comme ça:

{ 
    "test7" : { 
    "mappings" : { 
     "my_type3" : { 
     "properties" : { 
      "abc7" : { 
      "type" : "string" 
      }, 
      "anothergroup" : { 
      "properties" : { 
       "abc4" : { 
       "type" : "string" 
       }, 
       "abc5" : { 
       "type" : "string" 
       } 
      } 
      }, 
      "group" : { 
      "properties" : { 
       "abc1" : { 
       "type" : "string" 
       }, 
       "abc2" : { 
       "type" : "string" 
       }, 
       "abc3" : { 
       "type" : "string" 
       } 
      } 
      }, 
      "nestedpath" : { 
      "type" : "nested", 
      "properties" : { 
       "abc6" : { 
       "type" : "long" 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

Cette requête correspondra à ce que vous voulez:

{ 
    "query":{ 
     "filtered":{ 
     "filter":{ 
      "bool":{ 
       "must":[ 
        { 
        "bool":{ 
         "should":[ 
          { 
           "terms":{ 
           "group.abc1":[ 
            "x", 
            "y", 
            "z" 
           ] 
           } 
          }, 
          { 
           "terms":{ 
           "group.abc2":[ 
            "x", 
            "y", 
            "z" 
           ] 
           } 
          }, 
          { 
           "terms":{ 
           "group.abc3":[ 
            "x", 
            "y", 
            "z" 
           ] 
           } 
          } 
         ] 
        } 
        }, 
        { 
        "bool":{ 
         "should":[ 
          { 
           "terms":{ 
           "anothergroup.abc4":[ 
            "x", 
            "y", 
            "z" 
           ] 
           } 
          }, 
          { 
           "terms":{ 
           "anothergroup.abc5":[ 
            "x", 
            "y", 
            "z" 
           ] 
           } 
          } 
         ] 
        } 
        }, 
        { 
        "nested":{ 
         "path":"nestedpath", 
         "query":{ 
          "bool":{ 
           "must":{ 
           "range":{ 
            "nestedpath.abc6":{ 
             "lt":5 
            } 
           } 
           } 
          } 
         } 
        } 
        }, 
        { 
        "terms":{ 
         "abc7":[ 
          "x", 
          "y", 
          "z" 
         ] 
        } 
        } 
       ] 
      } 
     } 
     } 
    } 
} 
+0

Merci, je vous le ferai savoir dès que possible (dans environ 10 heures rs à partir de maintenant). Cela ressemble à quelque chose que je n'ai pas encore essayé. – theStudent

+0

Malheureusement, cela ne fonctionne pas. Il ne jette aucune erreur mais je reçois 0 résultats en arrière ce qui est faux. j'obtenir des résultats si je retire cette partie { "bool": { "devrait": [ { "termes": { "ABC4": [ "x", "y", " z » ] }} , { "termes": { " ABC5": [ "x", "y", "z" ] }} ] } } – theStudent

+0

Pouvez-vous donner un exemple de document qui correspondra à votre requête demandée? – alpert