검색엔진

 

↓ OpenSearch 주요 네트워크 설정

더보기

opensearch 주요 네트워크 설정 설명

설정 키 역할 예시 설명
network.host 서버가 바인딩할 IP 127.0.0.1

1.1.1.1
(내 IP)

0.0.0.0
OpenSearch가 어떤 IP에 바인딩될지 지정.
0.0.0.0은 모든 인터페이스(모든 IP 주소)를 의미
network.publish_host 다른 노드가 이 노드를
어떻게 볼지 지정하는 IP
1.1.1.1 클러스터 내 다른 노드들이 이 노드와 통신할 때 사용하는 IP 
일반적으로 외부에서 접근 가능한 IP로 설정
transport.tcp.port 노드 간 통신용 기본 포트
(바인드용)
9300 클러스터 내부의 노드들끼리 통신하는 데 사용하는 포트
대부분 9300
transport.publish_port 노드 간 통신용
외부에 노출할 포트
10093 다른 노드가 이 노드에 접근할 때 사용할 포트 번호
보통 transport.tcp.port와 같지만, 필요 시 다르게 지정
http.port REST API 요청을 받는 포트
(바인드용)
9200 사용자가 OpenSearch에 API 요청을 보내는 포트
웹 브라우저나 curl로 접속할 때 사용
http.publish_port REST API 요청을 받을
외부 노출 포트
10092 외부 클라이언트가 이 노드에 접근할 때 사용할 포트
보통 http.port와 같지만, 포트 충돌 피하려고 다르게 지정 

 

바인딩 (binding)

이 IP와 PORT로 들어오는 요청을 듣겠다는 선언

(접속을 열어둔다, 포트 리슨한다 개념과 비슷)

설정 값 의미 외부에서 접속 가능 여부
127.0.0.1 로컬 전용 ❌ (로컬에서만 접속 가능)
1.1.1.1 이 서버의 실제 IP ✅ (해당 IP로 들어오는 외부 요청도 응답)
0.0.0.0 모든 IP에 바인딩 ✅ (해당 서버가 가진 모든 IP로 요청 수신함)

 

2개 server, 각 1 node

서버A (1.1.1.1) - node1 (master)

서버B (2.2.2.2) - node2 (master)

# 서버 A

version: '3'
services:
  sso-os-node1:
    image: opensearchproject/opensearch:2.18.0
    container_name: sso-os-node1
    environment:
      - cluster.name=sso-cluster                     # OpenSearch 클러스터의 이름
      - node.name=sso-os-node1                       # 이 노드의 이름 (클러스터 내 고유)
      - discovery.seed_hosts=1.1.1.1:10093,2.2.2.2:10093  # 클러스터 내 노드들을 찾기 위한 시드 호스트들 (IP:transport 포트)
      - cluster.initial_master_nodes=sso-os-node1,sso-os-node2  # 클러스터 초기 마스터 노드 후보들 (첫 클러스터 부트스트랩 시 필요)
      - network.host=0.0.0.0                          # 모든 네트워크 인터페이스에서 바인딩 허용
      - network.publish_host=1.1.1.1                  # 다른 노드와 통신 시 공개할 IP 주소
      - transport.publish_port=10093                 # 노드 간 클러스터 통신에 사용되는 transport 포트 (기본은 9300)
      - http.publish_port=10092                      # 외부에 노출할 HTTP 포트 (REST API용, 기본은 9200)
      - bootstrap.memory_lock=true                   
      - "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m"     
      - "DISABLE_INSTALL_DEMO_CONFIG=true"           # 데모 보안 설정 설치 비활성화
      - "DISABLE_SECURITY_PLUGIN=true"               # 보안 플러그인 (OpenSearch Security Plugin) 비활성화
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    volumes:
      - opensearch-data1:/usr/share/opensearch/data
    ports:
      - 10092:9200
      - 10096:9600
      - 10093:9300
    networks:
      - sso-opensearch-net

volumes:
  opensearch-data1:

networks:
  sso-opensearch-net:
# 서버B

version: '3'
services:
  sso-os-node2:
    image: opensearchproject/opensearch:2.18.0
    container_name: sso-os-node2
    environment:
      - cluster.name=sso-cluster
      - node.name=sso-os-node2
      - discovery.seed_hosts=1.1.1.1:10093,2.2.2.2:10093
      - cluster.initial_master_nodes=sso-os-node1,sso-os-node2
      - bootstrap.memory_lock=true
      - "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m"
      - "DISABLE_INSTALL_DEMO_CONFIG=true"
      - "DISABLE_SECURITY_PLUGIN=true"
      - network.host=0.0.0.0
      - network.publish_host=2.2.2.2
      - transport.publish_port=10093
      - http.publish_port=10092
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    volumes:
      - opensearch-data2:/usr/share/opensearch/data
    ports:
      - 10092:9200
      - 10096:9600
      - 10093:9300
    networks:
      - sso-opensearch-net

volumes:
  opensearch-data2:

networks:
  sso-opensearch-net:

 

curl -X GET "http://localhost:9200"
curl -X GET "http://localhost:10092/_cat/nodes?v"

 


2개 server, 각 3 node

서버A (1.1.1.1) - node1 (master), node2, node3

서버B (2.2.2.2) - node4 (master), node5, node6

 

# 서버 A

version: '3'

services:
  250512-cluster-node1:
    image: opensearchproject/opensearch:2.18.0
    container_name: 250512-cluster-node1
    environment:
      - cluster.name=250512-cluster
      - node.name=250512-cluster-node1
      - discovery.seed_hosts=1.1.1.1:10092,1.1.1.1:10095,1.1.1.1:10098,2.2.2.2:10092,2.2.2.2:10095,2.2.2.2:10098
      - cluster.initial_master_nodes=250512-cluster-node1,250512-cluster-node4
      - bootstrap.memory_lock=true
      - "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m"
      - "DISABLE_INSTALL_DEMO_CONFIG=true"
      - "DISABLE_SECURITY_PLUGIN=true"
      - network.host=0.0.0.0
      - network.publish_host=1.1.1.1
      - transport.publish_port=10092
      - http.publish_port=10091
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    volumes:
      - 3node-opensearch-data1:/usr/share/opensearch/data
    ports:
      - 10091:9200
      - 10093:9600
      - 10092:9300
    networks:
      - 250512-opensearch-net

  250512-cluster-node2:
    image: opensearchproject/opensearch:2.18.0
    container_name: 250512-cluster-node2
    environment:
      - cluster.name=250512-cluster
      - node.name=250512-cluster-node2
      - discovery.seed_hosts=1.1.1.1:10092,1.1.1.1:10095,1.1.1.1:10098,2.2.2.2:10092,2.2.2.2:10095,2.2.2.2:10098
      - cluster.initial_master_nodes=250512-cluster-node1,250512-cluster-node4
      - bootstrap.memory_lock=true
      - "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m"
      - "DISABLE_INSTALL_DEMO_CONFIG=true"
      - "DISABLE_SECURITY_PLUGIN=true"
      - network.host=0.0.0.0
      - network.publish_host=1.1.1.1
      - transport.publish_port=10095
      - http.publish_port=10094
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    volumes:
      - 3node-opensearch-data2:/usr/share/opensearch/data
    ports:
      - 10094:9200
      - 10096:9600
      - 10095:9300
    networks:
      - 250512-opensearch-net

  250512-cluster-node3:
    image: opensearchproject/opensearch:2.18.0
    container_name: 250512-cluster-node3
    environment:
      - cluster.name=250512-cluster
      - node.name=250512-cluster-node3
      - discovery.seed_hosts=1.1.1.1:10092,1.1.1.1:10095,1.1.1.1:10098,2.2.2.2:10092,2.2.2.2:10095,2.2.2.2:10098
      - cluster.initial_master_nodes=250512-cluster-node1,250512-cluster-node4
      - bootstrap.memory_lock=true
      - "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m"
      - "DISABLE_INSTALL_DEMO_CONFIG=true"
      - "DISABLE_SECURITY_PLUGIN=true"
      - network.host=0.0.0.0
      - network.publish_host=1.1.1.1
      - transport.publish_port=10098
      - http.publish_port=10097
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    volumes:
      - 3node-opensearch-data3:/usr/share/opensearch/data
    ports:
      - 10097:9200
      - 10099:9600
      - 10098:9300
    networks:
      - 250512-opensearch-net

volumes:
  3node-opensearch-data1:
  3node-opensearch-data2:
  3node-opensearch-data3:

networks:
  250512-opensearch-net:
# 서버 B

version: '3'

services:
  250512-cluster-node4:
    image: opensearchproject/opensearch:2.18.0
    container_name: 250512-cluster-node4
    environment:
      - cluster.name=250512-cluster
      - node.name=250512-cluster-node4
      - discovery.seed_hosts=1.1.1.1:10092,1.1.1.1:10095,1.1.1.1:10098,2.2.2.2:10092,2.2.2.2:10095,2.2.2.2:10098
      - cluster.initial_master_nodes=250512-cluster-node1,250512-cluster-node4
      - bootstrap.memory_lock=true
      - "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m"
      - "DISABLE_INSTALL_DEMO_CONFIG=true"
      - "DISABLE_SECURITY_PLUGIN=true"
      - network.host=0.0.0.0
      - network.publish_host=2.2.2.2
      - transport.publish_port=10092
      - http.publish_port=10091
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    volumes:
      - 3node-opensearch-data4:/usr/share/opensearch/data
    ports:
      - 10091:9200
      - 10093:9600
      - 10092:9300
    networks:
      - 250512-opensearch-net

  250512-cluster-node5:
    image: opensearchproject/opensearch:2.18.0
    container_name: 250512-cluster-node5
    environment:
      - cluster.name=250512-cluster
      - node.name=250512-cluster-node5
      - discovery.seed_hosts=1.1.1.1:10092,1.1.1.1:10095,1.1.1.1:10098,2.2.2.2:10092,2.2.2.2:10095,2.2.2.2:10098
      - cluster.initial_master_nodes=250512-cluster-node1,250512-cluster-node4
      - bootstrap.memory_lock=true
      - "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m"
      - "DISABLE_INSTALL_DEMO_CONFIG=true"
      - "DISABLE_SECURITY_PLUGIN=true"
      - network.host=0.0.0.0
      - network.publish_host=2.2.2.2
      - transport.publish_port=10095
      - http.publish_port=10094
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    volumes:
      - 3node-opensearch-data5:/usr/share/opensearch/data
    ports:
      - 10094:9200
      - 10096:9600
      - 10095:9300
    networks:
      - 250512-opensearch-net

  250512-cluster-node6:
    image: opensearchproject/opensearch:2.18.0
    container_name: 250512-cluster-node6
    environment:
      - cluster.name=250512-cluster
      - node.name=250512-cluster-node6
      - discovery.seed_hosts=1.1.1.1:10092,1.1.1.1:10095,1.1.1.1:10098,2.2.2.2:10092,2.2.2.2:10095,2.2.2.2:10098
      - cluster.initial_master_nodes=250512-cluster-node1,250512-cluster-node4
      - bootstrap.memory_lock=true
      - "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m"
      - "DISABLE_INSTALL_DEMO_CONFIG=true"
      - "DISABLE_SECURITY_PLUGIN=true"
      - network.host=0.0.0.0
      - network.publish_host=2.2.2.2
      - transport.publish_port=10098
      - http.publish_port=10097
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    volumes:
      - 3node-opensearch-data6:/usr/share/opensearch/data
    ports:
      - 10097:9200
      - 10099:9600
      - 10098:9300
    networks:
      - 250512-opensearch-net

volumes:
  3node-opensearch-data4:
  3node-opensearch-data5:
  3node-opensearch-data6:

networks:
  250512-opensearch-net:

 

curl -X GET "http://localhost:10091"
curl -X GET "http://10.10.224.2:10091/_cat/nodes?v"


기록..

 

노드 1개씩 먼저 테스트 후 노드 3개로 늘려서 테스트 했었는데

discovery(각 노드들이 서로 발견)는 했지만 election(마스터 노드 선출)을 하지 못해서 클러스터 구성이 완료되지 않았었다.

 

docker logs를 통해 node1의 로그를 확인해보니

[WARN ][ClusterFormationFailureHelper] cluster-manager not discovered or elected yet,
an election requires a node with id [N3k2No9ATkSEu8mUQ8Uk3A],

have discovered:
{node1}, {node2}, {node3}, {node4}, {node5}, {node6}
→ 즉, node1~6까지는 살아 있음

하지만 id N3k2... 은 없음 → 그래서 마스터를 못 뽑음

→ discovery will continue... (계속 찾고는 있음)

 

이전 클러스터 상태에 꼭 있어야할 노드 ID가 (N3k2...)가 기록되어 있었고

예전 상태가 남아 있어 해당 노드가 없기 때문에 마스터를 못 뽑고 있던 상황이었다.

 

원인은

노드1개, 3개를 올렸던 docker-compose에서 볼륨을 opensearch-data1로 같이 쓰고 있었고

docker-compose down으로 볼륨까지 삭제됐다고 생각했지만 컨테이너와 네트워크를 삭제시켜주고 볼륨은 삭제되지 않았다.

 

따라서 opensearch-node1의 /user/share/opensearch/data 볼륨은 그대로 남아있었고

그래서 클러스터 stat 파일(nodes/, cluster-state*)도 그대로 남아있었다.

 

docker-compose down -v볼륨까지 삭제했어야했다.

 

 

---

 

여기까지 한 서버가 죽어도 다른 서버의 OpenSearch 노드는 계속 동작하므로 이중화가 되었다.

이중화의 핵심은 OpenSearch 자체가 클러스터링 기능을 제공하기 때문에 가능하다.

 

(예를 들어, FastAPI 같은 일반 앱은 이중화를 직접 구성해야 하며

로드 밸런서, DB 연결, 세션 공유 등을 별도로 설계해야하니까!)

 

이중화 외 자동 복구 기능을 제공하지 않는다.

따라서 컨테이너 자체가 죽거나 서버가 죽으면 수동으로 재시작이 필요하다.

-> 서비스 이중화는 되지만, 인프라 자동 복구는 없음

 

자동 복구 설정 (Docker Compose 기준)

컨테이너 단위 자동 복구를 위해 restart:always를 추가하면 된다.

단, 서버 자체가 죽는 경우까지 자동 복구하려면 systemd 등록 등 별도 작업이 필요하다.

services:
  sso-os-node1:
    ...
    restart: always  # 컨테이너 자동 복구 설정
    
services:
  sso-os-node2:
    ...
    restart: always  # 컨테이너 자동 복구 설정

 

restart까지 추가하면 OpenSearch의 클러스터링 기능 기반 이중화 + Docker Compose 수준의 자동 복구까지 포함한 구조가 된다.

 


 

지금까지는 Docker의 기본 네트워크 모드인 bridge 모드를 사용했다.

 

ports 매핑 없이 더 간편하게 docker-copmose를 구성하고자 한다면 host 모드를 사용할 수 있다.

 

  bridge host
IP/포트 컨테이너 고유 IP 사용
ports:로 호스트와 매핑
호스트 IP/포트를 그대로 공유
매핑 불필요
외부 접근 ports: "9200:9200" 필요 컨테이너 내 localhost:9200 → 곧바로 호스트 9200
격리성 컨테이너끼리 격리 가능 격리 없음 (보안 약함)
포트 충돌 없음 (외부 포트 다르게 매핑 가능) 호스트 포트 직접 사용 → 충돌 위험
성능 NAT 있음 (약간 느림) NAT 없음 (조금 더 빠름)
사용 예 운영환경, 포트 분리 필요 시 개발환경, 간편 테스트 시

 

 

아래는 host를 사용한 docker-compose 다.

2개 server, 각 2 node

서버A (1.1.1.1) - node1 (master), node2

서버B (2.2.2.2) - node3 (master), node4

 

# 서버 A

version: '3'
services:
  host-os-node1:
    image: opensearchproject/opensearch:2.18.0
    network_mode: host  # host 네트워크 사용 → 컨테이너가 호스트의 IP와 포트를 그대로 사용 (포트 포워딩 불필요)
    container_name: host-os-node1
    environment:
      - cluster.name=host-cluster  
      - node.name=host-os-node1 
      - discovery.seed_hosts=1.1.1.1:9300,2.2.2.2:9300,1.1.1.1:9301,2.2.2.2:9301  # 클러스터를 구성할 때 초기 노드 목록 (서로 연결될 수 있게 IP:PORT 지정)
      - cluster.initial_master_nodes=host-os-node1,host-os-node3  # 최초 마스터 후보 노드들 (클러스터 최초 부트스트랩 시 한 번만 사용됨)
      - bootstrap.memory_lock=true
      - "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m"
      - "DISABLE_INSTALL_DEMO_CONFIG=true"
      - "DISABLE_SECURITY_PLUGIN=true"
      - network.host=1.1.1.1  # 이 노드가 어떤 IP에서 요청을 수신할지 지정 (호스트 IP로 설정해야 외부 통신 가능)
      - transport.publish_port=9300  # 이 노드가 다른 노드들에게 자신을 알릴 때 사용할 포트
      - http.publish_port=10191  # 클라이언트(사용자)가 이 노드에 REST API로 접속할 때 사용할 포트
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    volumes:
      - host-opensearch-data1:/usr/share/opensearch/data

  host-os-node2:
    image: opensearchproject/opensearch:2.18.0
    network_mode: host
    container_name: host-os-node2
    environment:
      - cluster.name=host-cluster
      - node.name=host-os-node2
      - discovery.seed_hosts=1.1.1.1:9300,2.2.2.2:9300,1.1.1.1:9301,2.2.2.2:9301
      - cluster.initial_master_nodes=host-os-node1,host-os-node3
      - bootstrap.memory_lock=true
      - "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m"
      - "DISABLE_INSTALL_DEMO_CONFIG=true"
      - "DISABLE_SECURITY_PLUGIN=true"
      - network.host=1.1.1.1
      - transport.publish_port=9301  # 같은 서버의 두 번째 노드이므로 포트를 다르게 지정
      - http.publish_port=10192     # 이 노드의 REST API 포트
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    volumes:
      - host-opensearch-data2:/usr/share/opensearch/data

volumes:
  host-opensearch-data1:
  host-opensearch-data2:

 

transport.publish_port=9300 

 

이 노드가 다른 노드들에게 자신을 알릴 때 사용할 포트
        → OpenSearch는 기본적으로 첫 번째 노드는 9300 포트를 사용하고,
 같은 서버에 두 번째 노드를 띄우면 9301, 그 다음은 9302... 이렇게 자동 증가함.
       명확히 통신 포트를 지정해주기 위해 수동으로 지정함.

 

http.publish_port=10191  

 

클라이언트(사용자)가 이 노드에 REST API로 접속할 때 사용할 포트
        → 같은 서버에 여러 노드가 있으므로 포트 충돌 방지 및 명확한 구분을 위해 지정

`network_mode: host`로 인해 이 포트가 곧바로 외부에 노출됨
       

`network.publish_host` 또는 `transport.publish_port`를 따로 지정하지 않은 이유:

기본적으로 `network.host`, `transport.tcp.port`값을 따라가므로 따로 지정하지 않아도 됨.

# 서버 B

version: '3'
services:
  host-os-node3:
    image: opensearchproject/opensearch:2.18.0
    network_mode: host
    container_name: host-os-node3
    environment:
      - cluster.name=host-cluster
      - node.name=host-os-node3
      - discovery.seed_hosts=1.1.1.1:9300,2.2.2.2:9300,1.1.1.1:9301,2.2.2.2:9301
      - cluster.initial_master_nodes=host-os-node1,host-os-node3
      - bootstrap.memory_lock=true
      - "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m"
      - "DISABLE_INSTALL_DEMO_CONFIG=true"
      - "DISABLE_SECURITY_PLUGIN=true"
      - network.host=2.2.2.2
      - transport.publish_port=9300
      - http.publish_port=10191
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    volumes:
      - host-opensearch-data3:/usr/share/opensearch/data
  host-os-node4:
    image: opensearchproject/opensearch:2.18.0
    network_mode: host
    container_name: host-os-node4
    environment:
      - cluster.name=host-cluster
      - node.name=host-os-node4
      - discovery.seed_hosts=1.1.1.1:9300,2.2.2.2:9300,1.1.1.1:9301,2.2.2.2:9301
      - cluster.initial_master_nodes=host-os-node1,host-os-node3
      - bootstrap.memory_lock=true
      - "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m"
      - "DISABLE_INSTALL_DEMO_CONFIG=true"
      - "DISABLE_SECURITY_PLUGIN=true"
      - network.host=2.2.2.2
      - transport.publish_port=9301
      - http.publish_port=10192
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    volumes:
      - host-opensearch-data4:/usr/share/opensearch/data
volumes:
  host-opensearch-data3:
  host-opensearch-data4:

 

 

[궁금증]

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