2015-04-09 12 views
7

ElasticSearch ha la capacità di copiare valori in altri campi (al momento dell'indice), consentendo di effettuare la ricerca su più campi come se si trattasse di un campo (Core Types: copy_to).Come specificare ElasticSearch copy_to order?

Tuttavia, non sembra esserci alcun modo per specificare l'ordine in cui questi valori devono essere copiati. Questo potrebbe essere importante quando l'abbinamento di frasi:

curl -XDELETE 'http://10.11.12.13:9200/helloworld' 
curl -XPUT 'http://10.11.12.13:9200/helloworld' 
# copy_to is ordered alphabetically! 
curl -XPUT 'http://10.11.12.13:9200/helloworld/_mapping/people' -d ' 
{ 
    "people": { 
    "properties": { 
     "last_name": { 
     "type": "string", 
     "copy_to": "full_name" 
     }, 
     "first_name": { 
     "type": "string", 
     "copy_to": "full_name" 
     }, 
     "state": { 
     "type": "string" 
     }, 
     "city": { 
     "type": "string" 
     }, 
     "full_name": { 
     "type": "string" 
     } 
    } 
    } 
} 
' 

curl -X POST "10.11.12.13:9200/helloworld/people/dork" -d '{"first_name": "Jim", "last_name": "Bob", "state": "California", "city": "San Jose"}' 
curl -X POST "10.11.12.13:9200/helloworld/people/face" -d '{"first_name": "Bob", "last_name": "Jim", "state": "California", "city": "San Jose"}' 


curl "http://10.11.12.13:9200/helloworld/people/_search" -d ' 
{ 
    "query": { 
    "match_phrase": { 
     "full_name": { 
     "query": "Jim Bob" 
     } 
    } 
    } 
} 
' 

Viene restituito solo "Jim Bob"; sembra che i campi siano copiati nell'ordine alfabetico nome-campo.

Come passare l'ordine copy_to in modo da restituire la persona "Bob Jim"?

+0

Che ha a che fare con la tua query, stai specificando che vuoi solo "Jim Bob" da restituire. Modifica la query in una query di corrispondenza ed entrambi verranno restituiti. O per essere più severo, crea una query bool con due clausole per entrambe le frasi, "Jim Bob" e "Bob Jim". –

+0

Non sono sicuro che la mia domanda sia chiara; il campo generato da copy_to è chiaramente ordinato, è il campo generato che voglio cambiare, non la query. –

+0

"Viene restituito solo" Jim Bob ", ovvero perché si sta cercando" Jim Bob ". Cambia il termine della tua ricerca in "Bob Jim" e quel documento verrà restituito. Ciò che non mi è chiaro è ciò che stai cercando di ottenere con l'ordine. –

risposta

3

Questo è più deterministicamente controllato registrando uno transform script nella mappatura.

qualcosa di simile:

"transform" : [ 
    {"script": "ctx._source['full_name'] = [ctx._source['first_name'] + " " + ctx._source['last_name'], ctx._source['last_name'] + " " + ctx._source['first_name']]"} 
] 

Inoltre, trasformare gli script possono essere "nativo", vale a dire il codice java, a disposizione di tutti i nodi del cluster, rendendo le vostre classi personalizzate disponibili nel classpath elasticsearch e registrate come script nativo per le impostazioni:

script.native.<name>.type=<fully.qualified.class.name> 

nel qual caso nella vostra mappatura si erano registrati lo script nativo come una trasformazione in questo modo:

"transform" : [ 
    { 
     "script" : "<name>", 
     "params" : { 
      "param1": "val1", 
      "param2": "val2" 
     }, 
     "lang": "native" 
    } 
],