용어 수준 쿼리는 분석된 텍스트필드가 아닌 경우, 정확한 검색어가 포함된 문서의 색인을 검색한다.
OpenSearch가 제공하는 Docs를 따라가보자.
용어 수준 쿼리에서는 여러 쿼리 형태가 있다. 처음으로 볼 것은 "exists"이다.
exists는 "특정 필드가 포함된 문서"를 검색하는 쿼리이다.
1) exists
PUT testindex/_doc/1
{
"title": "The wind rises"
}
PUT testindex/_doc/2
{
"title": "Gone with the wind",
"description": "A 1939 American epic historical film"
}
이렇게 testindex 밑에 1, 2번 문서가 포함된 인덱스가 있게 된다. (PUT으로 입력/삽입)
그러면 조회할 때는,
GET testindex/_search
{
"query": {
"exists": {
"field": "description"
}
}
}
이렇게 GET으로 조회명령을 보내면,
응답으로 여러 정보가 오면서, hits (일치하는) 부분이 보인다.
"hits": [
{
"_index": "testindex",
"_id": "2",
"_score": 1,
"_source": {
"title": "Gone with the wind",
"description": "A 1939 American epic historical film"
}
}
]
반대로, description이 없는 문서를 검색하기 위해서는 must_not 부울 쿼리를 사용한다.
GET testindex/_search
{
"query": {
"bool": {
"must_not": {
"exists": {
"field": "description"
}
}
}
}
}
마찬가지로 첫 번째로 넣었던 데이터가 "description"이 누락된 값으로 hits 부분에 보인다.
"hits": [
{
"_index": "testindex",
"_id": "1",
"_score": 0,
"_source": {
"title": "The wind rises"
}
}
]
2) Fuzzy
퍼지 쿼리는 허용하는 최대의 레벤슈타인 거리 알고리즘으로 유사한 용어가 포함된 문서를 검색한다.
단 마찬가지로, Fuzzy 검색도 매개변수가 field를 최상위 매개변수로 허용하기 때문에 "필드"를 검색하는데 사용한다.
또한 주어진 단어와 주어진 허용 범위 내에서 유사한 String을 찾는 것이라고 보면 된다.
Levenshtein(레벤슈타인) 거리는 한 용어를 다른 용어로 변경하는 데 필요한 한 문자 변경 횟수를 측정한다.
4가지로 측정되며 다음과 같다.
1) 대체 : cat to bat ( c to b)
2) 삽입 : cat to cats ( +s )
3) 삭제 : cat to at ( -c )
4) 전치 : cat to act (ca to ac)
즉 이것이 몇번 필요한지 허용하는 필드는 "max_expansions" 이며,
docs의 예제로서 HAMLET을 검색해야하는 데 철자가 틀린 HALET으로 퍼지검색을 하는 예제이다.
GET shakespeare/_search
{
"query": {
"fuzzy": {
"speaker": {
"value": "HALET"
}
}
}
}
화자가 햄릿이 아닌 하렛을 검색하여 퍼지검색을 한 것이며,
fuzzy 밑, Field 밑에 추가적으로 고급 매개변수를 설정할 수 있다.
GET shakespeare/_search
{
"query": {
"fuzzy": {
"speaker": {
"value": "HALET",
// 필드 검색 시 사용할 용어
"fuzziness": "2",
// 용어가 다른 단어로 변경되는데 필요한 문자 편집 횟수, 기본은 AUTO
"max_expansions": 40,
// 쿼리를 확장할 수 있는 최대 용어 수,
fuzziness에 따라 2의 거리에 있는 용어들의 수, 기본값 50
"prefix_length": 0,
// 퍼지로 관주되지 않게 할 선두 문자의 수, 기본값 0
"transpositions": true,=
// 앞서 설명했던 전치를 허용할 지 말지 여부
"rewrite": "constant_score"
// OpenSearch가 다중 용어 쿼리를 작성하고 점수를 매기는 방식
기본값은 constant_score이며, scoring_boolean, constant_score_boolean,
top_terms_N, top_terms_boost_N, top_terms_blended_freqs_N 등이 있다.
}
}
}
}
max_expansions 매개변수의 값을 늘리는 것은 수 많은 결과값을 낳기 때문에
퍼포먼스적으로 검색 성능이 안좋아질 수 있다.
마찬가지로, prefix_length도 0으로 셋하는 경우에는 모든 단어의 거리를 재기 때문에
퍼포먼스적으로 좋지 않다.
즉, 검색하기 위해서 최대한 불필요한 연산을 제거하고 쿼리를 수행하여야 한다.
'Opensearch' 카테고리의 다른 글
OpenSearch QueryDSL - 용어 수준 쿼리 - Range, Regexp (0) | 2024.04.03 |
---|---|
OpenSearch QueryDSL - 날짜 형식, 날짜 연산 (1) | 2024.04.03 |
OpenSearch QueryDSL - 용어 수준 쿼리 - IDs, prefix (0) | 2024.04.03 |
OpenSearch QueryDSL - 쿼리 기초 (1) | 2024.04.03 |