Elasticsearch span near & intervals Query

JunMyung Lee·2025년 2월 19일
0

Elasticsearch

목록 보기
43/43

Elasticsearch span_near와 intervals 쿼리의 차이

Elasticsearch에서 intervals 쿼리는 정밀한 텍스트 검색을 위한 쿼리로, span 쿼리와 유사하지만 더 유연하고 강력한 규칙 기반 검색을 제공합니다.

특징span_nearintervals
검색 방식토큰의 위치 기반 검색구간(interval) 기반 검색
슬롭(slop)단어 사이의 최대 거리 지정max_gaps로 거리 제어 가능
순서 제어in_order: true/false 설정ordered: true/false 설정
복잡한 조건 지원불가능 (주로 단순 인접 검색)all_of, any_of, prefix, filter 지원
용도단어 간 거리/순서 제어에 특화더 정밀한 검색 가능

언제 사용해야 할까?

  • span_near
    • 단어 간 거리(sloppy matching) 를 제어하는 단순 검색
    • 로그 분석, 문장에서 특정 키워드 패턴 찾기
  • intervals
    • 보다 정밀한 검색이 필요할 때
    • 복잡한 검색 조건(ex: prefix, all_of)을 적용해야 할 때

요약: intervals는 span_near보다 더 유연하고 세밀한 텍스트 검색이 가능하지만, span 쿼리는 단순한 위치 기반 검색에 더 적합함.


Elasticsearch span_near 쿼리

Elasticsearch의 span_near 쿼리는 단어의 순서와 거리를 고려하여 검색할 때 사용됩니다. match나 term 쿼리와 달리, 특정 단어들이 서로 가까운 위치에 등장해야 하는 경우 유용합니다.

주요 속성

  • clauses: 검색할 span 쿼리 목록 (예: span_term)
  • slop: 단어 사이의 최대 거리(허용되는 간격)
  • in_order: true일 경우, 순서를 유지해야 함 / false이면 순서 상관없음

예제

문서 데이터 삽입

PUT my_index/_doc/1
{
  "content": "Elasticsearch provides powerful full-text search capabilities"
}

PUT my_index/_doc/2
{
  "content": "Powerful full-text search capabilities are provided by Elasticsearch"
}

✅ span_near 쿼리 예제
👉 "Elasticsearch" 와 "provides" 가 최대 1단어 간격을 두고 등장하는 문서 검색 (순서 유지)

GET my_index/_search
{
  "query": {
    "span_near": {
      "clauses": [
        { "span_term": { "content": "elasticsearch" } },
        { "span_term": { "content": "provides" } }
      ],
      "slop": 1,
      "in_order": true
    }
  }
}

결과

"Elasticsearch provides ..."를 포함하는 1번 문서만 검색됨.

 ✅ in_order: false 사용 예제
👉 "provides" 와 "elasticsearch" 가 등장하되, 순서는 무관하고 최대 3단어 간격이 허용됨

GET my_index/_search
{
  "query": {
    "span_near": {
      "clauses": [
        { "span_term": { "content": "provides" } },
        { "span_term": { "content": "elasticsearch" } }
      ],
      "slop": 3,
      "in_order": false
    }
  }
}

결과

"Elasticsearch provides ..." 뿐만 아니라 "provided by Elasticsearch" 같은 문서도 검색됨.

span_near 활용 케이스

  • 문장 내에서 특정 키워드가 가까운 위치에 있는 문서를 찾을 때
  • “자연어 검색”을 할 때 특정 단어들이 같은 문맥에서 등장하는지 판단
  • 로그 분석 시 에러 패턴 탐색 (예: "timeout" 과 "failed" 가 근접한 경우)

Elasticsearch intervals 쿼리

Elasticsearch의 intervals 쿼리는 구간(interval) 기반의 정밀한 텍스트 검색을 수행하는 기능입니다. span 쿼리와 유사하지만, 더 유연한 규칙을 제공하여 단순 거리 제어뿐만 아니라 패턴, 접두어, 필터 조건 등을 활용할 수 있습니다.

주요 속성

  • match: 특정 단어나 구문을 매칭
  • prefix: 특정 접두어(prefix)로 시작하는 단어 검색
  • all_of: 여러 개의 intervals을 순서대로 포함하는 경우 매칭
  • any_of: 여러 개의 intervals 중 하나라도 포함하는 경우 매칭
  • max_gaps: 단어 사이의 최대 허용 거리
  • ordered: true이면 순서를 유지해야 하며, false이면 순서 무관

예제

문서 데이터 삽입

PUT my_index/_doc/1
{
  "content": "Elasticsearch provides powerful search capabilities"
}

PUT my_index/_doc/2
{
  "content": "Powerful search capabilities are provided by Elasticsearch"
}

✅ intervals 기본 예제
👉 "Elasticsearch"와 "provides"가 순서를 유지하며 등장하는 경우 검색

GET my_index/_search
{
  "query": {
    "intervals": {
      "content": {
        "all_of": {
          "ordered": true,
          "intervals": [
            { "match": { "query": "elasticsearch" } },
            { "match": { "query": "provides" } }
          ]
        }
      }
    }
  }
}

결과

"Elasticsearch provides..."를 포함하는 문서(1번 문서)만 검색됨.

✅ max_gaps 활용 예제
👉 "elasticsearch"와 "capabilities"가 최대 3단어 간격 내에 등장하는 경우 검색

GET my_index/_search
{
  "query": {
    "intervals": {
      "content": {
        "all_of": {
          "ordered": false,
          "max_gaps": 3,
          "intervals": [
            { "match": { "query": "elasticsearch" } },
            { "match": { "query": "capabilities" } }
          ]
        }
      }
    }
  }
}

결과

"Elasticsearch provides powerful search capabilities" 문서가 검색됨.

 ✅ prefix 조건 활용 예제
👉 "search"로 시작하는(어디에서든 특정 단어가 해당 접두어로 시작하는지) 단어를 포함하는 문서 검색

PUT my_index/_doc/1
{
  "content": "Elasticsearch provides powerful search capabilities"
}

PUT my_index/_doc/2
{
  "content": "Searching for relevant results in Elasticsearch"
}

PUT my_index/_doc/3
{
  "content": "Users optimize search speed in large datasets"
}
GET my_index/_search
{
  "query": {
    "intervals": {
      "content": {
        "prefix": {
          "prefix": "search"
        }
      }
    }
  }
}

결과

* 문서 2번 ✅ "Searching for relevant results in Elasticsearch"
* 문서 3번 ✅ "Users optimize search speed in large datasets"
* 문서 1번 ❌ (검색 안 됨, "search"가 "powerful" 뒤에 등장했지만 "search" 자체로 시작하지 않음)

📌 정리

  • prefix는 문서의 첫 단어를 검사하는 것이 아니라, 문서 내 모든 단어의 접두어를 검사함.
  • "search"뿐만 아니라 "searching", "searched" 같은 변형 단어도 검색됨.
  • 문서의 어디에서 등장하든 상관없지만, 특정 접두어로 시작하는 단어만 매칭됨.

만약 문서의 첫 단어가 "search"로 시작해야 한다면 match_phrase를 사용한 검색이 필요

profile
11년차 검색개발자 입니다. 여러 지식과 함께 실제 서비스를 운영 하면서 발생한 이슈에 대해서 정리하고 공유하고자 합니다.

0개의 댓글

관련 채용 정보