Elasticsearch에서 intervals 쿼리는 정밀한 텍스트 검색을 위한 쿼리로, span 쿼리와 유사하지만 더 유연하고 강력한 규칙 기반 검색을 제공합니다.
특징 | span_near | intervals |
---|---|---|
검색 방식 | 토큰의 위치 기반 검색 | 구간(interval) 기반 검색 |
슬롭(slop ) | 단어 사이의 최대 거리 지정 | max_gaps 로 거리 제어 가능 |
순서 제어 | in_order: true/false 설정 | ordered: true/false 설정 |
복잡한 조건 지원 | 불가능 (주로 단순 인접 검색) | all_of , any_of , prefix , filter 지원 |
용도 | 단어 간 거리/순서 제어에 특화 | 더 정밀한 검색 가능 |
언제 사용해야 할까?
요약: intervals는 span_near보다 더 유연하고 세밀한 텍스트 검색이 가능하지만, span 쿼리는 단순한 위치 기반 검색에 더 적합함.
Elasticsearch의 span_near 쿼리는 단어의 순서와 거리를 고려하여 검색할 때 사용됩니다. match나 term 쿼리와 달리, 특정 단어들이 서로 가까운 위치에 등장해야 하는 경우 유용합니다.
주요 속성
문서 데이터 삽입
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 활용 케이스
Elasticsearch의 intervals 쿼리는 구간(interval) 기반의 정밀한 텍스트 검색을 수행하는 기능입니다. span 쿼리와 유사하지만, 더 유연한 규칙을 제공하여 단순 거리 제어뿐만 아니라 패턴, 접두어, 필터 조건 등을 활용할 수 있습니다.
주요 속성
문서 데이터 삽입
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를 사용한 검색이 필요