Intervals 쿼리
Intervals 쿼리
intervals 쿼리는 일치하는 용어의 근접성과 순서를 기준으로 문서를 매칭해요. 지정된 필드에 포함된 용어에 일치 규칙을 적용하고, 텍스트의 용어를 포괄하는 최소 간격(minimal interval) 시퀀스를 생성합니다. 간격들을 결합하고 상위 소스로 필터링할 수 있어요.
출처: 문서
본문
intervals 쿼리는 일치하는 용어의 근접성과 순서를 기준으로 문서를 매칭해요. 지정된 필드에 포함된 용어에 일치 규칙 집합을 적용해요. 이 쿼리는 텍스트의 용어를 포괄하는 최소 간격의 시퀀스를 생성해요. 간격들을 결합하고 상위 소스로 필터링할 수 있어요.
다음 문서를 포함하는 인덱스를 생각해 볼게요.
PUT testindex/_doc/1
{
"title": "key-value pairs are efficiently stored in a hash table"
}
PUT /testindex/_doc/2
{
"title": "store key-value pairs in a hash map"
}
예를 들어 다음 쿼리는 구문 key-value pairs(용어 사이에 간격 없음) 다음에 hash table 또는 hash map이 오는 문서를 검색해요.
GET /testindex/_search
{
"query": {
"intervals": {
"title": {
"all_of": {
"ordered": true,
"intervals": [
{
"match": {
"query": "key-value pairs",
"max_gaps": 0,
"ordered": true
}
},
{
"any_of": {
"intervals": [
{
"match": {
"query": "hash table"
}
},
{
"match": {
"query": "hash map"
}
}
]
}
}
]
}
}
}
}
}
이 쿼리는 두 문서를 모두 반환해요.
응답
{
"took": 1011,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 0.25,
"hits": [
{
"_index": "testindex",
"_id": "2",
"_score": 0.25,
"_source": {
"title": "store key-value pairs in a hash map"
}
},
{
"_index": "testindex",
"_id": "1",
"_score": 0.14285713,
"_source": {
"title": "key-value pairs are efficiently stored in a hash table"
}
}
]
}
}
파라미터 (Parameters)
이 쿼리는 필드 이름(<field>)을 최상위 파라미터로 받아들여요.
GET _search
{
"query": {
"intervals": {
"<field>": {
...
}
}
}
}
<field>는 용어, 순서, 근접성에 따라 문서를 매칭하는 데 사용되는 다음 규칙 객체를 받아들여요.
| 규칙 | 설명 |
|---|---|
match |
분석된 텍스트를 매칭함 |
prefix |
지정된 문자 집합으로 시작하는 용어를 매칭함 |
wildcard |
와일드카드 패턴으로 용어를 매칭함 |
fuzzy |
지정된 편집 거리 안에서 제공된 용어와 유사한 용어를 매칭함 |
all_of |
결합(AND)을 사용해 여러 규칙을 결합함 |
any_of |
분리(OR)를 사용해 여러 규칙을 결합함 |
match 규칙 (The match rule)
match 규칙은 분석된 텍스트를 매칭해요. 다음 표는 match 규칙이 지원하는 모든 파라미터를 나열해요.
| 파라미터 | 필수/선택 | 데이터 타입 | 설명 |
|---|---|---|---|
query |
필수 | String | 검색할 텍스트 |
analyzer |
선택 | String | query 텍스트를 분석하는 데 사용되는 분석기. 기본값은 <field>에 대해 지정된 분석기. |
filter |
선택 | 간격 필터 규칙 객체 | 반환된 간격을 필터링하는 데 사용되는 규칙 |
max_gaps |
선택 | Integer | 일치 용어 사이에 허용되는 최대 위치 수. max_gaps보다 더 멀리 떨어진 용어는 일치로 간주되지 않음. max_gaps가 지정되지 않거나 -1로 설정되면 용어는 위치와 무관하게 일치로 간주됨. max_gaps가 0으로 설정되면 일치 용어는 서로 붙어 있어야 함. 기본값은 -1. |
ordered |
선택 | Boolean | 일치 용어가 지정된 순서로 나타나야 하는지 여부를 지정함. 기본값은 false. |
use_field |
선택 | String | 최상위 필드 대신 이 필드를 검색하도록 지정함. 용어는 이 필드에 대해 지정된 검색 분석기를 사용해 분석됨. use_field를 지정하면 여러 필드를 모두 같은 필드인 것처럼 검색할 수 있음. 예를 들어 같은 텍스트를 형태소 분석된 필드와 그렇지 않은 필드에 인덱싱하면, 형태소 분석되지 않은 용어에 가까운 형태소 분석된 토큰을 검색할 수 있음. |
prefix 규칙 (The prefix rule)
prefix 규칙은 지정된 문자 집합(접두사)으로 시작하는 용어를 매칭해요. 접두사는 최대 128개의 용어로 확장될 수 있어요. 접두사가 128개보다 많은 용어와 일치하면 오류가 반환돼요. 다음 표는 prefix 규칙이 지원하는 모든 파라미터를 나열해요.
| 파라미터 | 필수/선택 | 데이터 타입 | 설명 |
|---|---|---|---|
prefix |
필수 | String | 용어를 매칭하는 데 사용되는 접두사 |
analyzer |
선택 | String | prefix를 정규화하는 데 사용되는 분석기. 기본값은 <field>에 대해 지정된 분석기. |
use_field |
선택 | String | 최상위 필드 대신 이 필드를 검색하도록 지정함. analyzer를 지정하지 않으면 prefix는 이 필드에 대해 지정된 검색 분석기를 사용해 정규화됨. |
wildcard 규칙 (The wildcard rule)
wildcard 규칙은 와일드카드 패턴으로 용어를 매칭해요. 와일드카드 패턴은 최대 128개의 용어로 확장될 수 있어요. 패턴이 128개보다 많은 용어와 일치하면 오류가 반환돼요. 다음 표는 wildcard 규칙이 지원하는 모든 파라미터를 나열해요.
| 파라미터 | 필수/선택 | 데이터 타입 | 설명 |
|---|---|---|---|
pattern |
필수 | String | 용어를 매칭하는 데 사용되는 와일드카드 패턴. 단일 문자를 매칭하려면 ?를, 0개 이상의 문자를 매칭하려면 *를 지정함. |
analyzer |
선택 | String | pattern을 정규화하는 데 사용되는 분석기. 기본값은 <field>에 대해 지정된 분석기. |
use_field |
선택 | String | 최상위 필드 대신 이 필드를 검색하도록 지정함. analyzer를 지정하지 않으면 pattern은 이 필드에 대해 지정된 검색 분석기를 사용해 정규화됨. |
*나 ?로 시작하는 패턴을 지정하면 용어를 매칭하기 위해 필요한 반복 횟수가 늘어나므로 검색 성능이 저하될 수 있어요.
fuzzy 규칙 (The fuzzy rule)
fuzzy 규칙은 지정된 편집 거리 안에서 제공된 용어와 유사한 용어를 매칭해요. fuzzy 패턴은 최대 128개의 용어로 확장될 수 있어요. 패턴이 128개보다 많은 용어와 일치하면 오류가 반환돼요. 다음 표는 fuzzy 규칙이 지원하는 모든 파라미터를 나열해요.
| 파라미터 | 필수/선택 | 데이터 타입 | 설명 |
|---|---|---|---|
term |
필수 | String | 매칭할 용어 |
analyzer |
선택 | String | term을 정규화하는 데 사용되는 분석기. 기본값은 <field>에 대해 지정된 분석기. |
fuzziness |
선택 | String | 용어가 값과 일치하는지 결정할 때 한 단어를 다른 단어로 바꾸는 데 필요한 문자 편집 수(삽입, 삭제, 대체). 예를 들어 wined와 wind 사이의 거리는 1. 유효한 값은 음이 아닌 정수 또는 AUTO. 기본값 AUTO는 검색 용어의 길이에 따라 편집 거리를 동적으로 선택함. AUTO:[low],[high] 구문을 사용해 임계값을 사용자 지정할 수 있는데, 여기서 low와 high는 문자 길이 경계를 정의함. 생략하면 OpenSearch는 기본값으로 AUTO:3,6을 사용하며, 이는 다음 규칙을 적용함. - 0–2자의 용어: 정확히 일치 필요(편집 0). - 3–5자의 용어: 최대 1개 편집 허용. - 6자 이상의 용어: 최대 2개 편집 허용. 예를 들어 AUTO:4,7은 0–3자의 용어에서 정확히 일치를 요구하고, 4–6자의 용어에서 최대 1개 편집을 허용하며, 7자 이상의 용어에서 최대 2개 편집을 허용함. 대부분의 시나리오에서는 AUTO 사용을 권장함. |
transpositions |
선택 | Boolean | transpositions를 true(기본값)로 설정하면 fuzziness 옵션의 삽입, 삭제, 대체 연산에 인접 문자 교체가 추가됨. 예를 들어 transpositions가 true이면 wind와 wnid 사이의 거리는 1("n"과 "i"를 교체)이고, false이면 2("n"을 삭제, "n"을 삽입). transpositions가 false이면 rewind와 wnid는 wind로부터 같은 거리(2)를 가지며, 더 인간 중심적인 의견상 wnid가 명백한 오타임에도 그렇음. 대부분의 사용 사례에서 기본값이 좋은 선택임. |
prefix_length |
선택 | Integer | 퍼지 매칭을 위해 변경되지 않은 채 남겨지는 시작 문자 수. 기본값은 0. |
use_field |
선택 | String | 최상위 필드 대신 이 필드를 검색하도록 지정함. analyzer를 지정하지 않으면 term은 이 필드에 대해 지정된 검색 분석기를 사용해 정규화됨. |
all_of 규칙 (The all_of rule)
all_of 규칙은 결합(AND)을 사용해 여러 규칙을 결합해요. 다음 표는 all_of 규칙이 지원하는 모든 파라미터를 나열해요.
| 파라미터 | 필수/선택 | 데이터 타입 | 설명 |
|---|---|---|---|
intervals |
필수 | 규칙 객체 배열 | 결합할 규칙 배열. 문서는 결과에 반환되기 위해 모든 규칙과 일치해야 함. |
filter |
선택 | 간격 필터 규칙 객체 | 반환된 간격을 필터링하는 데 사용되는 규칙 |
max_gaps |
선택 | Integer | 일치 용어 사이에 허용되는 최대 위치 수. max_gaps보다 더 멀리 떨어진 용어는 일치로 간주되지 않음. max_gaps가 지정되지 않거나 -1로 설정되면 용어는 위치와 무관하게 일치로 간주됨. max_gaps가 0으로 설정되면 일치 용어는 서로 붙어 있어야 함. 기본값은 -1. |
ordered |
선택 | Boolean | true이면 규칙이 생성한 간격이 지정된 순서로 나타나야 함. 기본값은 false. |
any_of 규칙 (The any_of rule)
any_of 규칙은 분리(OR)를 사용해 여러 규칙을 결합해요. 다음 표는 any_of 규칙이 지원하는 모든 파라미터를 나열해요.
| 파라미터 | 필수/선택 | 데이터 타입 | 설명 |
|---|---|---|---|
intervals |
필수 | 규칙 객체 배열 | 결합할 규칙 배열. 문서는 결과에 반환되기 위해 적어도 하나의 규칙과 일치해야 함. |
filter |
선택 | 간격 필터 규칙 객체 | 반환된 간격을 필터링하는 데 사용되는 규칙 |
filter 규칙 (The filter rule)
filter 규칙은 결과를 제한하는 데 사용돼요. 다음 표는 filter 규칙이 지원하는 모든 파라미터를 나열해요.
| 파라미터 | 필수/선택 | 데이터 타입 | 설명 |
|---|---|---|---|
after |
선택 | 쿼리 객체 | filter 규칙에 지정된 간격 뒤에 오는 간격을 반환하는 데 사용되는 쿼리 |
before |
선택 | 쿼리 객체 | filter 규칙에 지정된 간격 앞에 있는 간격을 반환하는 데 사용되는 쿼리 |
contained_by |
선택 | 쿼리 객체 | filter 규칙에 지정된 간격에 포함되는 간격을 반환하는 데 사용되는 쿼리 |
containing |
선택 | 쿼리 객체 | filter 규칙에 지정된 간격을 포함하는 간격을 반환하는 데 사용되는 쿼리 |
not_contained_by |
선택 | 쿼리 객체 | filter 규칙에 지정된 간격에 포함되지 않는 간격을 반환하는 데 사용되는 쿼리 |
not_containing |
선택 | 쿼리 객체 | filter 규칙에 지정된 간격을 포함하지 않는 간격을 반환하는 데 사용되는 쿼리 |
not_overlapping |
선택 | 쿼리 객체 | filter 규칙에 지정된 간격과 겹치지 않는 간격을 반환하는 데 사용되는 쿼리 |
overlapping |
선택 | 쿼리 객체 | filter 규칙에 지정된 간격과 겹치는 간격을 반환하는 데 사용되는 쿼리 |
script |
선택 | 스크립트 객체 | 문서를 매칭하는 데 사용되는 스크립트. 이 스크립트는 true 또는 false를 반환해야 함. |
예시: 필터 (Example: Filters)
다음 쿼리는 서로 5 위치 이내에 있고 그 사이에 단어 efficiently를 포함하지 않는 단어 pairs와 hash를 포함한 문서를 검색해요.
POST /testindex/_search
{
"query": {
"intervals" : {
"title" : {
"match" : {
"query" : "pairs hash",
"max_gaps" : 5,
"filter" : {
"not_containing" : {
"match" : {
"query" : "efficiently"
}
}
}
}
}
}
}
}
응답에는 문서 2만 포함돼요.
응답
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 0.25,
"hits": [
{
"_index": "testindex",
"_id": "2",
"_score": 0.25,
"_source": {
"title": "store key-value pairs in a hash map"
}
}
]
}
}
예시: 스크립트 필터 (Example: Script filters)
또는 다음 변수를 사용해 intervals 쿼리에 포함할 자신만의 스크립트 필터를 작성할 수 있어요.
interval.start: 간격이 시작되는 위치(용어 번호).interval.end: 간격이 끝나는 위치(용어 번호).interval.gap: 용어 사이의 단어 수.
예를 들어 다음 쿼리는 지정된 간격 안에서 서로 붙어 있는 단어 map과 hash를 검색해요. 용어는 0부터 번호가 매겨지므로 텍스트 store key-value pairs in a hash map에서 store는 위치 0, key는 위치 1 등이에요. 지정된 간격은 a 뒤에서 시작해 문자열 끝 전에 끝나야 해요.
POST /testindex/_search
{
"query": {
"intervals" : {
"title" : {
"match" : {
"query" : "map hash",
"filter" : {
"script" : {
"source" : "interval.start > 5 && interval.end < 8 && interval.gaps == 0"
}
}
}
}
}
}
}
응답에는 문서 2가 포함돼요.
응답
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 0.5,
"hits": [
{
"_index": "testindex",
"_id": "2",
"_score": 0.5,
"_source": {
"title": "store key-value pairs in a hash map"
}
}
]
}
}
간격 최소화 (Interval minimization)
쿼리가 선형 시간으로 실행되도록 intervals 쿼리는 간격을 최소화해요. 예를 들어 텍스트 a b c d c를 포함한 문서를 생각해 볼게요. 다음 쿼리를 사용해 a와 c에 포함되는 d를 검색할 수 있어요.
POST /testindex/_search
{
"query": {
"intervals" : {
"my_text" : {
"match" : {
"query" : "d",
"filter" : {
"contained_by" : {
"match" : {
"query" : "a c"
}
}
}
}
}
}
}
}
이 쿼리는 처음 두 용어 a c와 일치하고 그 용어들 사이에서 d를 찾지 못하므로 결과를 반환하지 않아요.