2016-09-09 3 views
0

Есть ли способ манипулировать (например, конкатенировать) возвращаемые поля из запроса?манипулировать возвращенными полями в elasticsearch

Это, как я создал свой индекс:

PUT /megacorp/employee/1 
{ 
    "first_name" : "John", 
    "last_name" : "Smith", 
    "age" :  25, 
    "about" :  "I love to go rock climbing", 
    "interests": [ "sports", "music" ] 
} 

И это, как я запрашиваю его:

GET /megacorp/employee/_search 
{ 
    "query": {"match_all": {}} 
} 

Ответ таков:

{ 
    "took": 4, 
    "timed_out": false, 
    "_shards": { 
    "total": 5, 
    "successful": 5, 
    "failed": 0 
    }, 
    "hits": { 
    "total": 1, 
    "max_score": 1, 
    "hits": [ 
     { 
     "_index": "megacorp", 
     "_type": "employee", 
     "_id": "1", 
     "_score": 1, 
     "_source": { 
      "first_name": "John", 
      "last_name": "Smith", 
      "age": 25, 
      "about": "I love to go rock climbing", 
      "interests": [ 
      "sports", 
      "music" 
      ] 
     } 
     } 
    ] 
    } 
} 

Это все работает нормально ,

Что я хочу, это объединить два поля из источника _source и отобразить его на выходе в виде нового поля.

first_name и last_name должны быть объединены в новое поле «full_name». Я не могу понять, как это сделать, не создавая новое поле в моем индексе. Я просмотрел «copy_to», но для этого требуется явно указать свойство хранилища в сопоставлении, и вы должны явно запросить сохраненное поле в запросе. Но основной недостаток заключается в том, что когда вы делаете то и другое, имя first_name и last_name возвращаются в запятую. Я хотел бы хорошую строку: «Джон Смит»

ответ

0
GET /megacorp/employee/_search 
{ 
    "query": {"match_all": {}}, 
    "script_fields": { 
    "combined": { 
     "script": "_source['first_name'] + ' ' + _source['last_name']" 
    } 
    } 
} 

И вам нужно включить dynamic scripting.

0

Вы можете использовать script_fields для достижения этой цели

GET /megacorp/employee/_search 
{ 
    "query": {"match_all": {}}, 
    "script_fields" : { 
     "full_name" : { 
      "script" : "[doc['first_name'].value, doc['last_name'].value].join(' ')" 
     } 
    } 
} 

Вы должны убедиться, что enable dynamic scripting для того, чтобы это работало.

Смежные вопросы