[궁금증]

문서 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) 사용해야 한다.