✅ Scripting ?
- 데이터가 들어와서 넣었는데 가공이 되지 않았을 경우 기존 데이터를 이용해서 다르게 보여주고 싶을 때 사용
- e.g ) 남/여로 카테고리를 보고 싶은데 1,2로 데이터가 들어왔을 때 간단하게 1은 남, 2는 여로 지정
✅ Script field 구조
<< request >>
GET blogs_fixed2/_search
{
"script_fields": { // 스크립트 필드를 정의하는 섹션
"second_part_of_url": { // 새로운 스크립트 필드 이름 (내가 정하면 되는 이름)
"script": { // 하위에 스크립트를 정의함
"source": "doc['url'].value.splitOnToken('/')[2]" //스크립트 내용 지정
"lang" : "painless" // 사용할 스크립트 언어 지정
}
}
},
"aggs": { // 생략가능
"test": {
"terms": {
"field": "my_doubled_field",
"size": 10
...
- 위에서는 second_part_of_url 이라는 필드 이름을 정하여 해당 필드는 script.source 에 있는 내용이 들어가게 됨
<< response >> ⭐️ 통계 호출 불가능
⚠️주의
- script field는 결과의 내용을 재사용 할 수 없음
- 다른 내용을 같이 확인할 수 없음 (검색한 필드만 출력됨 _ 위 이미지 참고)
✅ Runtime Fields ?
- 색인 시에 데이터를 변환하거나 추가적인 계산을 수행하여 동적으로 새로운 필드를 생성하는 기능
✅ runtime fields mapping => mapping 에 runtime field 를 넣는 개념
PUT blogs/_mapping
{
"runtime": {
"day_of_week": { //day_of_week 을 runtime field로 정의
"type": "keyword",
"script": {
"source": "emit(doc['publish_date'].value.dayOfWeekEnum.getDisplayName(TextStyle.FULL, Locale.ROOT))"
}
...
- 현재는 날짜 밖에 받아오지 못해 runtime field 통해 가져옴 -> 기존 날짜값을 가져와서 숫자를 받아 요일로 변환해주는 함수 사용
- ⭐️runtime field 일때만 emit() 을 필수적으로 사용함!
✅ searching runtime field
GET blogs/_search
{
"query" : {
"match" : {
"day_of_week" : "Monday"
}
}
}
- 매핑에서 runtime field안에 day_of_week을 지정해놨기 때문에 해당 필드 검색이 가능해짐
✅ runtime fields in a search request => 검색 시에만 해당 필드를 생성하도록 함 / 쿼리 날릴 때만 사용하므로 매핑보다 훨씬 가벼움
<< request >>
GET blogs/_search //검색으로 날림
{
"runtime_mappings": { // 런타임 필드 매핑
"day_of_week": { //해당 필드 생성
"type": "keyword",
"script": {
"source": "emit(doc['@timestamp'].value.dayOfWeekEnum.getDisplayName(TextStyle.FULL, Locale.ROOT))"
}
}
},
"aggs": { // 통계 검색
"my_agg": {
"terms": {
"field": "day_of_week"
...
<< response >> ⭐️ 통계 호출 가능
⚠️ script field 와의 차이점
- 결과의 내용을 재사용할 수 있음
- 다른 내용과 같이 확인이 가능
- 쿼리로 날리는 것 외에도 인덱스 mapping 에 입력해서 사용 가능
- 통계에 사용 가능
- 쿼리한 source 를 재사용하려는 경우에는 아래와 같이 내용 검색하면 됨
"fields": [
"day_of_week"
],
🔔 결론 정리 🔔
처음 인덱스 생성 시 내가 원하는 필드를 생성하지 못하였을 때
해당 필드&값이 필요한 경우 script field || runtime field를 사용함! -> 하지만 속도저하 이슈가 있으므로 지양하는 편
'DataBase' 카테고리의 다른 글
[Elastic Search] Shards 의 이해 (1) | 2024.01.08 |
---|---|
[Elastic Search] aggregations (metric, bucket, pipeline ...) (0) | 2024.01.06 |
[Elastic Search] Processor / Changing Data (0) | 2024.01.05 |
[Elastic Search] search application (+search template / highlighting) (0) | 2024.01.05 |
[Elastic Search] Syntax 사용 (0) | 2024.01.04 |
댓글