엘라스틱서치에서 DSL이란 Domain Specific Language 으로 JSON에 기반한 질의어를 말한다.
결국 데이터베이스처럼 사용자가 원하는 데이터를 추출하기 위한 질의 언어라는 뜻이다.
엘라스틱서치에서 기본적으로 질의를 하려면 아래와 같이 "query" 속성을 사용한다.
GET camo_system_logs/_search
{
"query": {
"range": {
"systemtime.keyword": {
"lt": "now"
}
}
}
}
Query VS Filter
DSL 기능이 어떤게 있는지 설명에 앞서 query와 filter간 차이점은 다음과 같다.
기본적으로 Elastic search는 일치하는 검색 결과의 관련성을 점수 별로 정렬하여 각 문서가 쿼리와 얼마나 잘 일치하는지 측정한다.
관련성 점수는 소수점 숫자이며 검색 API의 _score 메타 필드에 반환되고 _score가 높을수록 문서의 관련성이
높아지는데 각 쿼리 유형은 관련성 점수를 다르게 계산할 수 있지만 _score 계산은
query나 filter 문에서 실행되는 것에 따라 달라진다.
Query
query문은 "이 문서가 이 쿼리 절과 얼마나 잘 일치하는가?"라는 질의라고 볼 수 있다. 문서가 일치하는지 여부를 결정하는 것 외에도 query문은 _score 메타 필드에서 관련성 점수를 계산한다.
Filter
filter문은 query문과 같이 "이 문서 가 이 쿼리 절과 일치하는가?"라는 질문에 대하며 query문과의 차이점은 score를
계산하지 않고 간단하게 예 또는 아니요 로 계산합니다.
filter문은 주로 구조화 된 데이터를 필터링하는 데 사용되는데
예를 들어, "등록 시간이 2018년에서 2019년 사이에 있는 데이터 나 데이터의 상태 값이 삭제가 안 된 데이터" 와 같이 문서의 score가 필요없는 데이터 형태를 필터링할 때 사용한다.
또한 Elasticsearch는 filter 문을 사용하게 되면 자동으로 캐싱하여 성능을 향상 시킵니다.
이러한 Filter문은 score를 계산하지 않기 때문에 query보다 검색이 빠르다는 장점이 있다.
Query 문 | Filter 문 | |
검색 결과 | 관련성 | Yes or No |
검색 범위 | 전문 검색 | 주어진 질의에 해당하는 정확한 값 |
캐시여부 | No | Yes |
관련성 점수 계산 | Yes | No |
term, terms
term문은 형태소 분석기에 의해 쪼개진 토큰들을 기반으로 동작하는데 보통 정확하게 일치하는 문장을 찾을 때
사용하며 정확하게 일치하는 문장이 여러개면 terms를 사용한다.
GET /test-index/_search
{
"query": {
"term": {
"name": "여러"
}
}
}
GET /test-index/_search
{
"query": {
"term": {
"name": "여러개"
}
}
}
match
기본 동작은 term과 동일하게 형태소 분석기에 의해 쪼개진 토큰들을 기반으로 동작한다.
차이점은 match는 주어진 질의를 형태소 분석기를 거쳐 쪼갠 다음 조회를 하는 것이 차이점이다.
예를 들어, "여러개" 라는 값이 들어 왔다면 형태소 분석기에 의해 "여러", "개"로 나눠지고 토큰을 조회를 하게되는데
이 때, 1개라도 존재하는 토큰이 있으면 결과를 반환합니다.
즉, 형태소 분석기에 의해 쪼개진 질의들을 or 조건으로 검색하게끔 작동한다.
'ElasticSearch' 카테고리의 다른 글
Elasticsearch 기본개념 정리 (1) : Elasticsearch의 개념과 특징, 노드(node) 그리고 클러스터(cluster)에 대해서 (0) | 2022.12.25 |
---|---|
ElasticSearch - inculde (0) | 2022.11.02 |
ElasticSearch - _delete_by_query 사용 (0) | 2022.03.16 |
ElasticSearch - 필드 데이터 타입 확인하기 (0) | 2022.03.02 |
ElasticSearch - 인덱스의 최대 필수 개수 제한 설정과 Aggregation 사용시 유념할 점 (0) | 2022.02.25 |