2016-10-25 1 views
1

Dans mon document de cartographie, j'ai un champs d'objets imbriqués comme suitRécupérer une valeur de champ de inner_hits objet filtré d'erreur de jet

"availabilities":{      
    "type": "nested",      
    "dynamic": "strict",      
    "properties": {      
    "start":      { "type": "date", "format": "yyyy-MM-dd" }, 
    "end":       { "type": "date", "format": "yyyy-MM-dd" }, 
    "age":       { "type": "integer"       } 
    }      
} 

J'ai une longue requête DSL, dans lequel l'un des filtres est:

{ 
    "nested": { 
    "path": "availabilities", 
    "inner_hits" : { 
     "size": 1, 
     "name": "selected_availabilities" 
    }, 
    "query": { 
     "bool": { 
     "must": [ 
      { 
      "range": { 
       "availabilities.start": { 
       "gte": "2016-10-08", 
       "lte": "2016-10-08" 
       } 
      } 
      }, 
      { 
      "range": { 
       "availabilities.end": { 
       "gte": "2016-10-17", 
       "lte": "2016-10-17" 
       } 
      } 
      } 
     ] 
     } 
    } 
    } 
} 

Je suis en train d'utiliser inner_hits pour obtenir les disponibilités objets sélectionnés et qui renvoie quelque chose comme ceci:

{ 
    "took": 5, 
    "timed_out": false, 
    "_shards": { 
    "total": 5, 
    "successful": 5, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 1, 
    "max_score": 6000, 
    "hits": [ 
     { 
     "_index": "listings_v1", 
     "_type": "listing", 
     "_id": "228527", 
     "_score": 6000, 
     "_source": { 
      ...my fields.... 
      ...my fields.... 
      ...my fields.... 
      ...my fields.... 
      ...availabilities has nested objects..... 
     }, 
     "inner_hits": { 
      "selected_availabilities": { 
      "hits": { 
       "total": 1, 
       "max_score": 1.4142135, 
       "hits": [ 
       { 
        "_type": "listing", 
        "_id": "228527", 
        "_nested": { 
        "field": "availabilities", 
        "offset": 3 
        }, 
        "_score": 1.4142135, 
        "_source": { 
        "start": "2016-10-08", 
        "end": "2016-10-17", 
        "age": 23 
        } 
       } 
       ] 
      } 
      } 
     } 
     } 
    ] 
    } 
} 

Mon but est d'utiliser l'un des champs de l'objet sélectionné dans les inner_hits pour le calcul de la partition. Puisque l'objet disponibilités peut avoir plusieurs objets, mais il y en aura TOUJOURS un seul correspondant à mes critères de recherche. Voilà donc ce que j'ai que ma requête:

function_score": { 
    "query": {}, 
    "score_mode": "sum", 
    "boost_mode": "replace" 
    "functions": [ 
    { 
     "script_score": { 
     "params": { 
      "move_in_date_boost": -1350, 
      "desired_move_in_date": "2016-11-03" 
     }, 
     "script": "return (inner_hits['selected_availabilities']['hits']['hits'][0]['_source']['age']);" 
     } 
    }, 
    { 
     ....more functions... 
    } 
    ] 
} 

Mais quand je l'utilise au-dessus de script, je reçois l'erreur suivante:

{ 
    "took": 239, 
    "timed_out": false, 
    "_shards": { 
    "total": 5, 
    "successful": 4, 
    "failed": 1, 
    "failures": [ 
     { 
     "shard": 0, 
     "index": "xyz_v1", 
     "node": "hgu7no8oo9wwe34wetw", 
     "reason": { 
      "type": "script_exception", 
      "reason": "failed to run inline script [return (inner_hits['selected_availabilities']['hits']['hits'][0]['_source']['age']);] using lang [groovy]", 
      "caused_by": { 
      "type": "missing_property_exception", 
      "reason": "missing_property_exception: No such property: inner_hits for class: 572da4fc5f5e591a0d7cfec2cde0c998b550b1f4" 
      } 
     } 
     } 
    ] 
    }, 
    "hits": { 
    "total": 0, 
    "max_score": null, 
    "hits": [] 
    } 
} 

Comment obtenir selected_availabilities age champ dans le calcul du score? Toute aide sera grandement appréciée.

+0

une question très similaire ... avez-vous travaillé dehors à la fin? – gsaslis

+1

Non, finalement j'ai trouvé, ce n'est pas possible :( – JVK

Répondre

0

Essayez d'utiliser

return (doc['inner_hits']... 

au lieu de

return (inner_hits... 
+0

Essayé, mais n'a pas fonctionné. 'Doc' ne peut pas accéder' inner_hits', car il est en dehors – JVK

+0

et si vous utilisez simplement 'doc ['age']'? – deathyr

+0

cela aussi ne fonctionne pas – JVK