Elasticsearch는 null 값을 저장하지 않는다
기본적으로 Elasticsearch는 null을 색인하거나 저장하지 않는다. 그러니까, Elasticsearch가 null 값을 보면 그냥 무시하고 인덱스에 포함시키지 않는다는 것이다. Elasticsearch는 null 값을 검색할 수 있는 값으로 인식하지 않는다.
나는 이 사실을 모르고 계속 이런 식으로 검색하고 있었다.
{
"query": {
"term": {
"필드명": null
}
}
}
Elasticsearch가 null 값을 무시한다는 사실을 이해하는 것은 중요하다. 어떻게 쿼리를 날릴지가 달라지기 때문!
그럼 우리는 null을 저장해도 필터링할 수 없는걸까?? 다행히 방법은 있다!
“null_value” 파라미터를 이용한다
한 가지 방법은 mapping에 null_value를 넣는 것이다.
{
"mappings": {
"properties": {
"status": {
"type": "keyword",
"null_value": "NULL"
}
}
}
}
위 예시처럼 입력하면 만약 어떤 도큐먼트에 status 필드가 있고, null 값인 도큐먼트가 있다면 , Elasticsearch는 이를 "NULL"로 인덱싱할 것이다. 그러나 주의할 점이 있다. null_value를 설정하려면 keyword 또는 text여야 한다.
“exists” 쿼리 사용
‘exists’ 쿼리를 사용하면 특정 필드가 존재하는지 여부를 확인할 수 있다. ‘missing’ 쿼리는 더 이상 사용되지 않지만, ‘exists’를 활용해 null 값을 처리할 수 있다.
{
"query": {
"bool": {
"must_not": {
"exists": {
"field": "필드명"
}
}
}
}
}
이 쿼리는 "필드명"이라는 필드가 존재하지 않는 문서를 반환한다. 여기서 “존재하지 않음”에는 null 값도 포함된다. 즉, 필드가 존재하지 않거나 값이 null인 경우 모두 해당 쿼리의 결과로 나온다.
결론
null 값을 적절히 처리하지 않으면 데이터 분석이나 검색에서 문제가 발생할 수 있다. null 값을 처리하는 전략을 잘 정의하여 데이터를 일관되게 관리하는 것이 중요하다.
Elasticsearch에서 null 값을 직접 저장하거나 쿼리하는 것은 불가능하지만, 다양한 방법으로 null 값을 처리할 수 있다. exists 쿼리와 null_value 파라미터 등을 활용하여 null 값을 다룰 수 있다!