[Elasticsearch] Scripting 을 이용한 Field Value 조작하기.
Elastic/Elasticsearch 2015. 8. 17. 14:59정확하게 조작한다기 보다 저장된 document 의 field value 를 이용한다가 맞을 것 같습니다.
기본 참조 문서는 아래와 같습니다.
https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting.html
문서를 보셨으면 아시겠지만 기본 groovy 를 사용하게 되어 있습니다.
하지만 보안 이슈로 설정이 기본 false 입니다.
아래와 같이 설정을 변경해 주셔야 사용이 가능 합니다.
[Scripting Enable]
script.inline: on
또는
script.groovy.sandbox.enabled: true
※ 관련 설정에 대한 자세한 내용은 문서를 참고 하시면 됩니다.
아래는 문서 내용 snippet 입니다.
Value | Description |
---|---|
| scripting is turned off completely, in the context of the setting being set. |
| scripting is turned on, in the context of the setting being set. |
| scripts may be executed only for languages that are sandboxed |
그리고 추후 2.0.0 에서는 위 설정에서 groovy sandbox 는 deprecated 예정이니 참고하세요.
(https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting.html#_groovy_sandboxing)
설정을 해주셨으니 이제 value 에 접근하는 방법에 대해서 알아 보겠습니다.
문서에서는 총 3 가지 방법을 제시해 주고 있습니다.
[Value 접근]
_doc['field_name'].value or values
_fields['field_name'].value
_source['field_name']
※ 여기서 _fields 는 store 옵션을 true 로 하지 않으셨다면 에러가 발생 합니다.
value에 접근 하는 방법을 아셨으니 이 값을 이용한 연산을 어떻게 하는지도 궁금하실 겁니다.
위에서 말씀 드렸듯이 기본적인 language 는 groovy 입니다.
그렇기 때문에 groovy script 를 이용해서 연산 및 처리를 하시면 되겠습니다.
아래는 substring에 대한 커뮤니티의 질문에 대한 예제 코드 입니다.
[script_fields 샘플코드]
GET /test_index/_search
{
"script_fields": {
"field1_substring": {
"script": "_doc['field1'].value"
}
}
}
GET /test_index/_search
{
"script_fields": {
"field1_substring": {
"script": "_fields['field1'].value.substring(0, 5)"
}
}
}
GET /test_index/_search
{
"script_fields": {
"field1_substring": {
"script": "_source.field1.substring(3, 10)"
}
}
}
※ script_fields 를 이용하게 되면 return 시 fields를 통해서 정보가 전달 됩니다. (즉, 필요한 field 가 있다면 추가로 선언해 주셔야 한다는 이야기 입니다.)
※ QueryDSL 을 보시면 아시겠지만 기본 query 구문이 없으면 match_all 로 동작 합니다.
※ 추가적으로 주의 할 점은 field 속성이 not_analyzed 인지 analyzed, store 인지 아닌지 확인 하시고 테스트 하시기 바랍니다.