2016-03-30 8 views
5

Sto tentando di utilizzare i campi di script nella mia query. Ho abilitato lo scripting sandbox e ho provato a usare un'espressione per calcolare un nuovo campo.Campo di script che utilizza l'espressione - È possibile accedere solo alla variabile membro [valore] o ai metodi membri

Il fatto è che ottengo il seguente errore:

{ 
    "type": "expression_script_compilation_exception", 
    "reason": "Only the member variable [value] or member methods may be accessed on a field when not accessing the field directly" 
} 

Sembra che solo "valore" è accessibile. cosa mi manca qui?

Quando si esegue la seguente query:

{ 
    "query": { 
    "match_all": {} 
    }, 
    "script_fields" : { 
    "field1" : { 
     "script" : { 
      "lang": "expression", 
      "inline": "doc['about.hobbies'].empty" 
     } 
    } 
    } 
} 

Mapping:

{ 
    "my_index": { 
    "mappings": { 
    "type": { 
     "properties": { 
      "about": { 
       "properties": { 
       "hobbies": { 
        "type": "string", 
        "analyzer": "lowercase" 
       } 
       } 
      } 
     } 
    } 
    } 
} 

piccola spiegazione: Ho un campo che può contenere l'elenco dei valori di stringa.

"hobbies": ["a","b",c"] 

e può essere anche vuoto. Voglio avere un campo di script di tipo booleano che avrà il valore true quando la lista non è vuota, e false quando la lista è vuota.

Aggiornamento: Leggendo alcune di più, ho incontrato questa documentazione su lucene expressions scripts

There are a few limitations relative to other script languages:

  • Only numeric fields may be accessed
  • Stored fields are not available
  • If a field is sparse (only some documents contain a value), documents missing the field will have a value of 0

Il mio campo è di tipo stringa, potrebbe essere il problema? In caso affermativo, esiste un altro modo per utilizzare i campi di script in base ai campi stringa? magari usare groovy?

+0

Si prega di condividere la mappatura .. – Richa

+0

Grazie @Richa. Aggiornato. – Tomer

risposta

1

Penso che il problema sia che il campo è un oggetto nidificato, se leggo correttamente i documenti, doc ['campo'] supporta solo campi di termini semplici.

Note, however, that the doc[...] notation only allows for simple valued fields (can’t return a json object from it) and makes sense only on non-analyzed or single term based fields.

Tuttavia usando sorgente_ ha funzionato per me

"script_fields" : { 
     "field1" : { 
      "script" : "_source.about.hobbies.size() > 0" 
     } 
    }, 
+0

Penso che i campi a valore semplice, si riferiscono al valore, non al campo stesso. Quindi non penso che questo sia il problema qui. _source è sempre un'opzione, il fatto è che è molto meno efficiente perché questi dati non vengono trovati in memoria e devono essere recuperati, il che è piuttosto costoso. – Tomer