[Elasticsearch] 백슬래시(\)처리와 쿼리 문자열의 이스케이프 과정
[궁금증]
문서 1: "나 AND 너"
문서2: "나 \AND 너"
쿼리로 "\\AND", "\\\\AND"와 같은 형태로 백슬래시를 포함시켰을 때 검색 결과
Elasticsearch에서 백슬래시(\) 처리는 두 단계로 이루어진다.
1. 인덱싱 시 : JSON 파싱만 발생
2. 쿼리 시 : JSON 파싱과 쿼리 파싱 모두 발생
우선 문서 2가 인덱싱 되는 과정을 살펴보자
POST /boolean_index/_doc/2
{
"content": "나 \\AND 너"
}
이때 JSON 파싱이 발생하여 이스케이프 문자(\)가 해석된다.
따라서 \\는 단일 백슬래시(\)로 변환된다.
최종적으로
"나 \\AND 너" > JSON 파싱 > "나 \AND 너"로 저장된다
이후 쿼리를 살펴보자
Elasticsearch에서 query string에서 특수문자란 쿼리 구문에서 특별한 의미를 가지는 문자를 말한다.
예를 들면 아래와 같다.
+ (반드시 포함)
- (제외)
= (정확히 일치)
&& (AND)
|| (OR)
! (NOT)
( ) (그룹화)
[ ] (범위 검색)
* (와일드카드)
? (단일 문자 와일드카드)
~ (퍼지 검색)
^ (부스팅)
이런 특수문자들을 실제 텍스트로 검색하고 싶을 때는 백슬래시로 이스케이프 해야한다.
GET /boolean_index/_search
{
"query": {
"query_string": {
"query": "\\AND",
"analyzer": "whitespace"
}
}
}
# 결과
# "content": "나 AND 너"
"\\AND" > JSON 파싱 > "\AND" > 쿼리 파싱 > "AND"
쿼리 파싱에서 "\AND"에서 "\"는 이스케이프 문자로 해석된다.
그런데 "AND"는 Elasticsearch에서 특수문자가 아니라 일반 텍스트이므로, 백슬래시(\)가 없어지고 "AND"로 해석된다.
GET /boolean_index/_search
{
"query": {
"query_string": {
"query": "\\\\AND",
"analyzer": "whitespace"
}
}
}
# 결과
# "content": """나 \AND 너"""
"\\\\AND" > JSON 파싱 > "\\AND" > 쿼리 파싱 > "\AND"
쿼리 파싱 과정에서 "\\AND"를 보면 첫 번째 백슬래시가 두 번째 백슬래시를 이스케이프하여 "\AND"로 해석된다.
💡
"\\AND" | "\AND" | "AND" | "AND"가 포함된 문서 검색 |
"\\\\AND" | "\\AND" | "\AND" | "\AND"가 포함된 문서 검색 |
✔ 백슬래시는 특수문자가 아니라 "이스케이프 문자"로 동작한다.
✔ 백슬래시 하나(\)를 사용하면, Elasticsearch에서 쿼리 파싱 시 사라질 수 있다.
✔ 정확하게 \AND라는 텍스트를 찾고 싶다면, 백슬래시를 두 개(\\\\AND) 사용해야 한다.