2017-03-09 1 views
1

J'ai la prochaine déposée dans le cadre d'un élément élastique:ElasticSearch - chercher un champ imbriqué qui est à portée

"PayPlan" : { 
     "ActivePlans" : { 
      "plan1" : { 
       "startsOn" : "1", 
       "endsOn" : "999999" 
      } 
     }, 
     "someOtherData" : [ 
      NumberLong(0), 0] 
    }, 

noms de plan sont complètement sans logique (peut être « plan2323a » ou « plan_hh_jj » et bientôt).

Comment puis-je rechercher TOUS les éléments qui ont TOUT plan que startsOn est plus petit que X et endsOn est plus grand que X? Merci à tous

Je suis incapable de le faire avec query_string ou en utilisant plage sur requête et en utilisant le format suivant « PayPlan.ActivePlans. *. StartsOn » (l'astérisque ne fonctionne pas comme un joker dans la gamme

Merci à tous

C'est la requête ElasticSearch je travaille maintenant, mais je veux changer « plan1 » dans « * » il recherchera un plan sous:

{ 
    "query": { 
    "filtered": { 
     "query": { 
     "match_all": {} 
     }, 
     "filter": { 
     "bool": { 
      "must": [ 
      { 
       "match_all": {} 
      }, 
      { 
       "or": { 
       "filters": [ 
        { 
        "bool": { 
         "must": [ 
         { 
          "range": { 
          "PayPlan.ActivePlans.plan1.startsOn": { 
           "lte": "1234" 
          } 
          } 
         }, 
         { 
          "range": { 
          "PayPlan.ActivePlans.plan1.endsOn": { 
           "gte": "1236" 
          } 
          } 
         } 
         ] 
        } 
        } 
       ] 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 
+0

Pourriez-vous partager la requête complète que vous utilisez? – Adonis

+0

J'ai édité la question et ajouté ma requête de travail actuelle que je veux réécrire donc il va chercher de tout sous 'plan' élément – Avishay

Répondre

1

vous pouvez commencer par un query string comme:

GET test1/_search 
{ 
    "query": { 
    "query_string": { 
     "default_field": "PayPlan.ActivePlans.plan*.startsOn", 
     "query": ">0" 
    } 
    } 
} 

La sortie (avec un essai rapide):

{ 
    "took": 2, 
    "timed_out": false, 
    "_shards": { 
    "total": 5, 
    "successful": 5, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 2, 
    "max_score": 1, 
    "hits": [ 
     { 
     "_index": "test1", 
     "_type": "plan", 
     "_id": "AVq000G1mKJs7uLU8liY", 
     "_score": 1, 
     "_source": { 
      "PayPlan": { 
      "ActivePlans": { 
       "plan2": { 
       "startsOn": "2", 
       "endsOn": "999998" 
       } 
      } 
      } 
     } 
     }, 
     { 
     "_index": "test1", 
     "_type": "plan", 
     "_id": "AVq00p0pmKJs7uLU8liW", 
     "_score": 1, 
     "_source": { 
      "PayPlan": { 
      "ActivePlans": { 
       "plan1": { 
       "startsOn": "1", 
       "endsOn": "999999" 
       } 
      } 
      } 
     } 
     } 
    ] 
    } 
} 
+0

Merci pour la réponse, Il m'a eu sur la bonne voie, juste une petite mise à jour - J'ai utilisé "requête" : "(endsOn <= X) AND (startsOn <= X)" pour obtenir le 'in range' – Avishay