본 리포트는 엘라스틱서치(Elasticsearch)의 다양한 쿼리 DSL(Query DSL)을 이해하고 활용하기 위한 기초 지식을 제공하는 것을 목적으로 합니다. 리포트는 엘라스틱서치의 기능과 구조, 특히 전문 검색(Full Text Search), 스키마리스 인덱싱(Schemaless Indexing), 역색인(Inverted Index) 구조, 텍스트 분석 기능 등을 설명합니다. 주요 쿼리 유형인 match 쿼리와 term 쿼리를 중심으로, 데이터 검색과 정렬, 필터링, 페이지네이션, 하이라이트 등의 기능을 활용하는 다양한 예제를 소개하여, 효과적인 검색 결과를 얻기 위한 최적의 방법을 제시합니다. 이를 통해 독자들은 엘라스틱서치의 기본 개념을 이해하고 실제 프로젝트에 적용할 수 있는 실용적인 지식을 습득할 수 있습니다.
엘라스틱서치(Elasticsearch)는 아파치 루씬(Apache Lucene)을 기반으로 한 텍스트, 숫자, 위치 기반 정보, 정형 및 비정형 데이터를 위한 무료 검색 및 분석 엔진입니다. 주로 웹 검색 엔진이나 데이터 분석에 활용됩니다. 데이터 수집, 저장, 분석 그리고 시각화를 위한 무료 개방형 도구 모음인 ELK 스택(Elasticsearch, Logstash, Kibana) 중 분석과 저장을 담당하는 역할을 합니다.
ELK 스택은 Elasticsearch, Logstash, 그리고 Kibana로 구성된 도구 모음입니다. 이 중에서 Logstash는 데이터 수집과 처리, Kibana는 데이터의 시각화를 담당합니다. Elasticsearch는 분석과 데이터를 저장하는 역할을 맡고 있습니다. 이를 통해 전체 데이터 처리 과정을 원활하게 이끌어가며, 효율적인 검색과 분석 기능을 제공합니다.
엘라스틱서치는 전문 검색(Full Text Search)에 강점을 가지고 있습니다. 이는 문서의 전체 내용을 색인하여 특정 단어가 포함된 문서를 검색할 수 있는 기능을 제공합니다. 이를 통해 사용자는 더욱 정확하고 포괄적인 검색 결과를 얻을 수 있습니다.
엘라스틱서치는 스키마리스 인덱싱(Schemaless Indexing)을 지원합니다. 이는 미리 정의된 스키마 없이도 데이터를 스스로 분석하여 필드를 생성하고 저장할 수 있는 기능을 의미합니다. 따라서 다양한 데이터 형식을 유연하게 처리할 수 있습니다.
엘라스틱서치는 RESTful API를 통해 데이터를 검색, 저장, 삭제 등의 작업을 수행할 수 있습니다. 주로 GET, POST, DELETE 등의 HTTP 메소드를 활용하여 데이터를 조작할 수 있으며, 이를 통해 다양한 애플리케이션에서 엘라스틱서치의 기능을 편리하게 활용할 수 있습니다.
엘라스틱서치는 역색인(Inverted Index) 구조를 사용하여 데이터를 저장합니다. 이는 검색어와 문서 간의 매핑을 통해 빠른 검색 성능을 제공하는 구조입니다. 데이터는 형태소 분석을 통해 토큰화되고, 역색인 구조에 저장되어 빠르고 효율적인 검색을 지원합니다.
엘라스틱서치는 텍스트 분석 기능을 통해 데이터를 처리합니다. 분석기는 텍스트를 단어 단위로 분할하고, 이를 기반으로 의미 있는 데이터를 추출합니다. 이 과정은 토크나이저(Tokenizer), 필터(Filter), 그리고 애널라이저(Analyzer)를 통해 이루어지며, 다양한 언어와 형식을 지원합니다.
match_all 쿼리는 모든 문서와 매치되는 가장 간단한 쿼리입니다. 모든 문서를 조회할 때 사용합니다. ```json GET /_search { "query": { "match_all": {} } } ```
match 쿼리는 지정된 필드의 값과 매치되는 문서를 찾습니다. 라이브러리의 연관성 점수도 계산합니다. 예를 들어, 'title' 필드에 '민주노총'을 포함하는 문서를 찾으려면 아래와 같이 합니다. ```json GET /_search { "query": { "match": { "title": "민주노총" } } } ```
fields 쿼리는 지정된 필드만을 반환하도록 설정할 수 있습니다. 예를 들어, 'user'와 'created_at' 필드만 반환하려면 아래와 같이 합니다. ```json GET /_search { "fields": ["user", "created_at"], "query": { "term": { "title": "민주노총" } } } ```
from과 size 옵션을 사용하여 결과를 분할할 수 있습니다. 예를 들어, 검색 결과 중 10번째 문서부터 5개의 문서를 가져오려면 아래와 같이 합니다. ```json GET /_search { "from": 10, "size": 5, "query": { "term": { "title": "민주노총" } } } ```
sort 옵션을 사용하여 결과를 정렬할 수 있습니다. 예를 들어, 작성자 오름차순, 작성일 내림차순으로 정렬하려면 아래와 같이 합니다. ```json GET /_search { "sort": [ {"writer": {"order": "asc"}}, {"created_at": {"order": "desc"}}, "_score" ], "query": { "term": { "title": "민주노총" } } } ```
highlight 옵션을 사용하여 매치된 텀을 강조할 수 있습니다. 예를 들어, 'title' 필드에서 매치된 텀을 강조하려면 아래와 같이 합니다. ```json GET /_search { "query": { "match": { "title": "민주노총" } }, "highlight": { "fields": { "title": {} } } } ```
필터는 문서를 조건에 따라 참/거짓으로 평가해 참인 문서만 고릅니다. 예를 들어, 'genre' 필드가 '편지'인 문서를 필터링하려면 다음과 같이 합니다. ```json GET /_search { "query": { "filtered": { "filter": { "term": { "genre": "편지" } }, "query": { "match": { "title": "민주노총" } } } } ```
bool 쿼리는 여러 쿼리를 논리적으로 결합합니다. 예를 들어, 'genre'가 '편지'이고, 'keyword'가 '비정규직'인 문서를 찾으려면 아래와 같이 합니다. ```json GET /_search { "query": { "bool": { "must": [ { "term": { "genre": "편지" } }, { "term": { "keyword": "비정규직" } } ] } } ```
term 쿼리는 지정된 텀이 포함된 문서를 찾습니다. 예를 들어, 'keyword' 필드에 '민주노총'을 포함하는 문서를 찾으려면 아래와 같이 합니다. ```json GET /_search { "query": { "term": { "keyword": "민주노총" } } } ```
range 필터는 지정된 범위에 포함되는 값을 가진 문서를 찾습니다. 예를 들어, 'id'가 10000에서 10010 사이인 문서를 찾으려면 아래와 같이 합니다. ```json GET /_search { "query": { "filtered": { "filter": { "range": { "id": { "gte": 10000, "lt": 10010 } } } } ```
exist 필터는 필드에 어떤 값이 존재하는 문서를 찾습니다. 예를 들어, 'url' 필드에 값이 존재하는 문서를 찾으려면 아래와 같이 합니다. ```json GET /_search { "query": { "filtered": { "filter": { "exists": { "field": "url" } } } ```
fuzziness 옵션은 검색어와 필드 값이 조금 차이나더라도 매치되도록 합니다. 예를 들어, '박연오 스캔들'로 검색했을 때 '박연차 스캔들'을 찾으려면 아래와 같이 합니다. ```json GET /_search { "query": { "match": { "title": { "query": "박연오 스캔들", "fuzziness": "AUTO" } } } ```
match_phrase 쿼리는 정확한 구를 검색합니다. 예를 들어, 'title' 필드에 '민주노총 파업'을 포함하는 문서를 찾으려면 아래와 같이 합니다. ```json GET /_search { "query": { "match_phrase": { "title": { "query": "민주노총 파업" } } } ```
dis_max 쿼리는 여러 쿼리 중 가장 정확한 매치가 된 문서에 높은 점수를 매깁니다. 예를 들어, 'title'과 'content'에 '억압적인 군대'가 포함된 문서를 찾으려면 아래와 같이 합니다. ```json GET /_search { "query": { "dis_max": { "queries": [ { "match": { "title": "억압적인 군대" } }, { "match": { "content": "억압적인 군대" } } ] } } ```
multi_match 쿼리는 여러 필드에 대해 검색할 때 사용합니다. 예를 들어, 'title'과 'content' 필드에서 '억압적인 군대'를 찾으려면 아래와 같이 합니다. ```json GET /_search { "query": { "multi_match": { "query": "억압적인 군대", "fields": ["title", "content"] } } ```
boost 옵션을 사용하여 각 쿼리마다 가산점 비율을 조절할 수 있습니다. 예를 들어, 'title'에 '민주노총'이 들어가면 가산점을 주고, 'keyword'가 '세월호'면 더 높은 비율로 가산점을 부여하려면 아래와 같이 합니다. ```json GET /_search { "query": { "bool": { "should": [ { "match": { "title": { "query": "민주노총", "boost": 1.2 } } }, { "match": { "keyword": { "query": "세월호", "boost": 2 } } } ```
match 쿼리는 지정한 필드가 질의어와 매치되는 문서를 찾는 쿼리입니다. 중요한 점은 필드에 analyzer가 존재하거나 search_analyzer가 지정되어 있다면 질의어도 분석 과정을 거친다는 것입니다. 예를 들어, 'this is something'이라는 질의어는 세 개의 단어로 분리되고, 각각에 대한 검색이 수행됩니다.
term 쿼리는 지정한 필드가 질의어와 정확히 일치하는 문서를 찾는 쿼리입니다. analyzer 처리 과정을 거치지 않고 정확히 일치하는 값을 찾는 데 사용됩니다. 주로 'keyword' 필드에 사용되며, normalizer를 적용하여 검색이 수행됩니다.
텍스트 필드는 주로 분석기를 통해 분리된 텀으로 검색이 수행되며, match 쿼리에 적합합니다. 키워드 필드는 단일 텀으로 저장되며 term 쿼리를 사용해 정확히 일치하는 값을 검색하는 데 유리합니다. 예를 들어, 'Hello, World!'라는 문자열을 가진 필드에 대해 텍스트 필드는 'Hello', 'World'로 분리되나, 키워드 필드는 전체 문자열 그대로 저장됩니다.
match 쿼리와 term 쿼리를 텍스트 필드와 키워드 필드에 각각 적용해 본 결과, 텍스트 필드에는 match 쿼리가 잘 동작하며, 키워드 필드에는 term 쿼리가 잘 동작했습니다. 특정 필드에 대한 쿼리 결과는 예상과 일치하였습니다. 예를 들어, 텍스트 필드에서 'Hello, World!'로 검색할 때 match 쿼리는 결과를 반환하였으나 term 쿼리는 반환하지 않았습니다.
term 쿼리는 키워드 필드에 적합하며, 분석 과정 없이도 정확히 일치하는 값을 검색할 수 있습니다. 반면, match 쿼리는 텍스트 필드에 적합하며, 분석 과정을 통해 질의어를 분리하여 검색하는 데 유리합니다. 이러한 특성을 고려하여 적절한 쿼리를 선택하는 것이 중요합니다.
이 리포트는 엘라스틱서치의 쿼리 DSL에 대한 기초적인 이해를 도와줍니다. 주된 발견사항은 엘라스틱서치가 제공하는 다양한 쿼리 유형, 특히 match 쿼리와 term 쿼리의 차이점입니다. 이 두 쿼리는 각기 다른 필드와 검색 요구에 따라 적절하게 사용되어야 하며, 이를 통해 더 정확하고 효율적인 검색 시스템의 구축이 가능합니다. 그러나 이 연구는 실습 환경을 기반으로 한 것이므로, 다양한 실 환경에서의 적용 사례를 더 조사해 볼 필요가 있습니다. 특히 향후 연구에서는 엘라스틱서치의 성능 최적화와 다양한 언어 및 데이터 형식에 대한 지원 등에 집중할 필요가 있습니다. 이를 통해 엘라스틱서치의 활용도를 높이고, 더 나은 검색 및 분석 솔루션을 제공할 수 있을 것입니다.
엘라스틱서치(Elasticsearch)는 분산형 오픈 소스 검색 및 분석 엔진으로, 특히 텍스트 분석에 최적화되어 웹 검색엔진 등에 널리 사용됩니다. 데이터의 빠른 조회 및 집계를 위해 특별히 설계된 데이터를 저장하며, 다양한 쿼리와 필터를 통해 복잡한 검색 요구사항을 충족합니다.
쿼리 DSL(Query DSL)은 엘라스틱서치에서 제공하는 검색 언어로, 다양한 쿼리 유형을 통해 인덱스된 문서들을 검색할 수 있습니다. match 쿼리, term 쿼리, bool 쿼리 등 다양한 쿼리 유형을 포함하며, 각 쿼리는 특정 검색 요구를 충족시키기 위해 사용됩니다.
match 쿼리는 검색어를 분석하여 텍스트 필드에서 일치하는 문서를 찾는 쿼리입니다. 텍스트 필드에서 주로 사용되며, 검색어의 형태를 분석하여 더 유연한 검색 결과를 제공합니다.
term 쿼리는 검색어를 분석하지 않고 키워드 필드에서 정확히 일치하는 문서를 찾는 쿼리입니다. 주로 정밀한 검색을 요구하는 경우 사용되며, 검색어와 필드값이 정확히 일치하는 경우에만 결과를 반환합니다.