Skip to content

ElasticSearch ‐ Tips for Improving Search Results

woojin edited this page Aug 1, 2026 · 1 revision

Proximity Search란?

  • proximity search는 특정 단어들이 지정한 거리 안에서 서로 가까이 있는 문서를 찾는 검색이다.
  • match_phrase Query — 지정한 필드에 단어들이 정확한 순서 그대로 담긴 문서를 찾는다.
  • slop Parameter구문 안의 term 사이에 단어가 몇 개까지 끼어들어도 매치로 인정할지 정한다. slop이 0이면 구문이 정확히 일치해야 하고, 값이 커질수록 검색어 사이에 더 많은 단어를 허용한다.

질의 예시

GET /library/_search
{
  "query": {
    "match_phrase": {
      "content": {
        "query": "quick fox",
        "slop": 2
      }
    }
  }
}

Fuzzy Match Query란?

  • fuzzy match query는 정확히 일치하는 것이 아니라 근사적으로 일치하는 문서를 찾을 때 쓴다.
  • 오타와 철자 변형을 다루는 데 유용하다.
  • fuzziness검색어와 문서의 term 사이에 허용할 편집 거리(변경 횟수) 를 정한다.
  • prefix_lengthfuzziness를 적용하기 전에 정확히 일치해야 하는 앞쪽 글자 수를 지정한다. 오탐(false positive)을 줄이는 데 도움이 된다.

Fuzziness Levels

  • fuzziness 0 — fuzziness 없음. 정확히 일치해야 한다.
  • fuzziness 1한 번의 편집을 허용한다. (글자 치환, 삽입, 삭제)
  • fuzziness 2두 번의 편집을 허용한다.
  • fuzziness "AUTO"검색어의 길이에 따라 fuzziness를 자동으로 조정한다.

편집 거리란?

검색어: "elasticsearch"

치환  elasticsaerch   →  a를 e로 바꾼다(편집 1회)
삭제  elasticsearh    →  c를 넣는다(편집 1회)
삽입  elasticssearch  →  s를 뺀다(편집 1회)
전치  elasticsaerch   →  ae를 ea로 맞바꾼다(편집 1회)
  • 검색어를 문서의 term으로 바꾸는 데 필요한 최소 편집 횟수가 편집 거리다.
  • 치환·삽입·삭제에 더해 인접한 두 글자의 자리바꿈(전치) 도 편집 1회로 센다.

AUTO의 기준

글자 수 0 ~ 2   →  fuzziness 0(오타 허용 안 함)
글자 수 3 ~ 5   →  fuzziness 1
글자 수 6 이상   →  fuzziness 2
  • 짧은 단어에 오타를 허용하면 전혀 다른 단어까지 걸리기 때문이다. cat에 편집 2를 허용하면 dog만 빼고 거의 다 걸린다.

질의 예시

GET /library/_search
{
  "query": {
    "match": {
      "title": {
        "query": "elasticsaerch",
        "fuzziness": "AUTO",
        "prefix_length": 2
      }
    }
  }
}
  • prefix_length: 2이면 앞 두 글자 el은 반드시 맞아야 하고, 그 뒤부터 fuzziness가 적용된다.

Synonym Search란?

  • synonym search는 검색할 때 동등하게 취급할 단어나 구문을 정의할 수 있게 해준다.
  • 예: laptopnotebook을 같은 단어로 취급한다.
  • Define a Synonym File or Inline Synonyms — 동의어로 다룰 단어 목록을 만든다.
  • Create a Custom Analyzersynonym 필터를 가진 custom analyzer를 정의해 원하는 필드에 동의어를 적용한다.
  • Apply the Custom Analyzer to a Field — synonym 검색을 쓸 필드의 매핑을 갱신해 그 analyzer를 적용한다.
PUT /products
{
  "settings": {
    "analysis": {
      "filter": {
        "my_synonyms": {
          "type": "synonym",
          "synonyms": [
            "laptop, notebook",
            "휴대폰, 핸드폰, 스마트폰"
          ]
        }
      },
      "analyzer": {
        "synonym_analyzer": {
          "tokenizer": "standard",
          "filter": ["lowercase", "my_synonyms"]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "synonym_analyzer"
      }
    }
  }
}

📖 Java🔥

📖 Kotlin⭐

📖 Coroutine📎

📖 Spring🔥

📖 Spring Security⭐

📖 Spring Security OAuth2⭐

📖 Spring Batch📎

📖 Database🔥

📖 MySQL🔥

📖 Redis⭐

📖 JPA⭐

📖 QueryDsl📎

📖 MSA⭐

📖 Kafka⭐

📖 Apache Flink📎

  • [Apache Flink - Apache Flink Architecture]
  • [Apache Flink - Stream Processing]
  • [Apache Flink - Data Stream API & Window]
  • [Apache Flink - State Management]

📖 HTTP🔥

📖 AWS⭐

📖 Docker⭐

📖 Kubernetes⭐

📖 Github Actions📎

📖 Jenkins📎

📖 Nginx⭐

📖 Monitoring📎

📖 Test(feat. Load Testing)📎

📖 Test(feat. Java)⭐

📖 Spring AI📎

📖 gRPC📎

  • [gRPC - Writing .proto Files with Protocol Buffers]
  • [gRPC - Various Communication Patterns in gRPC]
  • [gRPC - gRPC Optimization Techniques and Advanced Features]

📖 TDD(Test-Driven-Development)⭐

📖 PostgreSQL📎

  • [PostgreSQL - Docker만을 사용하는 경량화된 환경 구성 방법]
  • [PostgreSQL - PostgreSQL에서 제공하는 데이터 타입]
  • [PostgreSQL - PostgreSQI의 JSONB, 역인덱싱과 활용 방법]
  • [PostgreSQL - 데이터베이스 성능을 위한 최적화 패턴 및 전략]
  • [PostgreSQL - 트랜잭션과 ACID, Isolation 수준별 차이]
  • [PostgreSQL - Database Lock 교착상태와 읽기/쓰기 성능을 보장하는 MVCC 모델]
  • [PostgreSQL - pgvector와 벡터 저장, 유사도 검색 패턴 개념]
  • [PostgreSQL - 벡터 인덱스 최적화와 벡터 검색과 전문 검색 결합 패턴]
  • [PostgreSQL - PostgreSQL 플러그인]
  • [PostgreSQL - PostGIS - 공간 쿼리와 GIST 인덱스, 지리 타입과 공간 쿼리를 위한 타입과 기본 함수]
  • [PostgreSQL - pg_search - 검색 엔진 없이 텍스트 검색 구현과 주의사항]
  • [PostgreSQL - 단일 인스턴스 한계를 극복하는 분산 패턴과 스케줄링, 분산 환경 구축 방법]
  • [PostgreSQL - Citus - 분산 테이블과 분산 쿼리를 위한 Extension과 데이터 분산 처리]
  • [PostgreSQL - pg_cron - PostgreSQL로 구성하는 CronJob]
  • [PostgreSQL - 스케줄러 + 분산 처리를 동시에 도입하는 주기적 집계 쿼리 패턴]

📖 Workflow-Driven Techniques for Large-Scale Traffic Processing📎

  • [Workflow-Driven Techniques for Large-Scale Traffic Processing - Kafka + Debezium을 활용한 CDC 패턴 설계]
  • [Workflow-Driven Techniques for Large-Scale Traffic Processing - Temporal을 활용한 워크플로우 패턴]
  • [Workflow-Driven Techniques for Large-Scale Traffic Processing - Docker와 경량 이미지를 활용한 환경 구축 방법]
  • [Workflow-Driven Techniques for Large-Scale Traffic Processing - Kafka에서의 메시지 Delivery Guarantee]
  • [Workflow-Driven Techniques for Large-Scale Traffic Processing - 실시간 동기화의 핵심 CDC]
  • [Workflow-Driven Techniques for Large-Scale Traffic Processing - MySQL Binary Log 기반의 CDC]
  • [Workflow-Driven Techniques for Large-Scale Traffic Processing - Binary Log 기반의 CDC 구현 플랫폼 Debezium이란?]
  • [Workflow-Driven Techniques for Large-Scale Traffic Processing - Debezium Architecture]
  • [Workflow-Driven Techniques for Large-Scale Traffic Processing - Debezium Architecture Best Practice와 주의사항]

📖 Reactive Programming📎

📖 ElasticSearch📎

📖 Design Pattern📎

📖 Clean Spring📎

  • [Clean Spring - Domain-Driven Development]
  • [Clean Spring - Domain-Driven Development with Design Patterns]
  • [Clean Spring - Developing Membership Application with Hexagonal Architecture]
  • [Clean Spring - JPA and Domain Model Patterns]
  • [Clean Spring - Designing a Consistent Domain Model with Aggregates]
  • [Clean Spring - Web API Adapter]
  • [Clean Spring - Hexagonal Architecture: Ports]
  • [Clean Spring - Hexagonal Architecture: Application Components]
  • [Clean Spring - Test Improvement & Architecture Validation]
  • [Clean Spring - Developing Application Components]
  • [Real MySQL 8.0 - 인덱스]
  • [Real MySQL 8.0 - 실행 계획]
  • [Real MySQL 8.0 - 아키텍처]
  • [Real MySQL 8.0 - 트랜잭션과 잠금]

Clone this wiki locally