이 리포트는 엘라스틱서치(Elasticsearch)의 쿼리 DSL(Query Domain Specific Language) 기초와 그 활용법에 대해 다룹니다. 엘라스틱서치의 전반적인 개념, 주요 기능, 다양한 쿼리 유형 및 사용법을 설명하고, 효과적인 데이터 검색 및 집계 방법을 소개합니다. 쿼리와 필터의 차이점, 캐싱의 중요성, 실제 쿼리 사례 등을 통해 엘라스틱서치를 활용한 데이터 검색 최적화 방법을 이해할 수 있도록 구성되어 있습니다. 이를 통해 독자는 엘라스틱서치를 사용한 데이터 검색과 분석의 기본 지식을 습득할 수 있을 것입니다.
엘라스틱서치는 아파치 루씬을 기반으로 한 텍스트, 숫자, 위치 기반 정보, 정형 및 비정형 데이터 등 모든 유형의 데이터를 위한 무료 검색 및 분석 엔진입니다. 웹 검색 엔진에서 주로 사용되며, 데이터 수집, 보강, 저장, 분석, 시각화를 위한 무료 개방형 도구 모음인 ELK 스택(Elasticsearch, Logstash, Kibana) 중 분석과 저장을 담당합니다. 기존 RDBMS 기반의 어플리케이션이 텍스트 검색에 한계를 가지는 반면, 엘라스틱서치는 문자열에 대한 동의어, 유의어, 전문검색 등을 지원하여 효율적인 검색을 가능하게 합니다.
엘라스틱서치의 주요 기능으로는 전문 검색(Full Text Search), 스키마리스 구조, RESTful API 지원, 역색인 구조(Inverted Index)를 통한 저장 및 검색 등이 있습니다. 전문 검색 기능은 문서 전체를 색인하여 특정 단어가 포함된 문서를 검색할 수 있게 하며, 스키마리스 구조는 미리 정의된 스키마 없이도 데이터를 저장할 수 있는 유연성을 제공합니다. RESTful API를 통해 데이터를 CRUD(Create, Read, Update, Delete) 할 수 있으며, 역색인 구조는 빠른 검색을 가능하게 합니다. 또한, 엘라스틱서치는 텍스트 형태의 데이터를 형태소 분석기를 통해 분할하여 저장하며, 각 단어에 대한 유사도 점수를 계산하여 검색 결과를 최적화 합니다. 이를 통해 데이터마다 특화된 자료구조를 사용하여 우수한 성능을 보일 수 있습니다.
쿼리 DSL은 엘라스틱서치에 색인된 문서를 검색할 때 사용하는 도메인 특정 언어입니다. 이를 통해 엘라스틱서치의 색인된 데이터에 질의할 수 있으며, HTTP 요청 메시지 본문에 JSON 형태로 구성된 쿼리를 포함시켜야 합니다. 예를 들어, 모든 문서를 검색하려면 다음과 같이 `match_all` 옵션을 사용합니다. GET /_search { "query": { "match_all": {} } }
쿼리와 필터는 둘 다 문서를 선택하는 데 사용되지만, 각각의 목적과 성능 최적화 방식에 차이가 있습니다. 쿼리는 문서를 연관성 점수에 따라 정렬하며, 필터는 조건에 따라 문서를 참/거짓으로 평가하고 연관성 점수를 매기지 않습니다. 필터는 캐시를 지원하여 성능이 더 우수한 경우가 많습니다. 예를 들어, 특정 장르의 문서를 필터링한 후 제목에서 '민주노총'을 찾는 쿼리는 다음과 같습니다. GET /_search { "query": { "filtered": { "filter": { "term": {"genre": "편지"} }, "query": {"match": {"title": "민주노총"}} } } }
다양한 쿼리 유형을 활용하여 엘라스틱서치에 색인된 데이터를 검색할 수 있습니다. 다음은 기본적인 쿼리 예시입니다. 1. 모든 문서 검색 (match_all): GET /_search { "query": {"match_all": {}} } 2. 특정 필드 값으로 검색 (match): GET /_search { "query": { "match": { "title": "민주노총" } } } 3. 특정 단어를 포함하는 문서 검색 (term 필터): GET /_search { "query": { "filtered": { "filter": { "term": {"genre": "편지"} } } } } 4. 페이지 나누기 및 정렬: GET /_search { "from": 10, "size": 5, "query": { "match": { "title": "민주노총" } }, "sort": [ { "created_at": { "order": "desc" } } ] }
match 쿼리는 지정한 필드가 질의어와 매치되는 문서를 찾는 쿼리입니다. 중요한 점은 지정된 필드에 분석기가 있거나 search_analyzer가 지정되어 있으면 질의어 역시 분석 과정을 거치게 됩니다. 기본적으로 OR 연산으로 동작하기 때문에, 여러 텀이 나오면 그 중 하나라도 매치되면 결과로 인정됩니다. 예를 들어, 'this is something'이라는 질의어가 'this', 'is', 'something'으로 분리되어 검색됩니다. 이 외에도 AND 연산으로 변경하거나, Fuzziness 옵션을 통해 유사성 검색을 수행할 수 있습니다.
term 쿼리는 지정된 필드가 질의어와 정확히 일치하는 문서를 찾는 쿼리입니다. 분석 과정을 거치지 않으며, normalizer가 적용된 경우에도 동일하게 처리됩니다. 예를 들어, keyword 필드의 경우 term 쿼리로 검색할 때 주로 사용됩니다. 이는 질의어와 정확히 일치하는 값을 찾기 위함이며, 전문 검색에는 적합하지 않습니다.
match_phrase 쿼리는 지정된 필드에서 띄어쓰기까지 모두 포함해 정확하게 구를 검색하고자 할 때 사용됩니다. 기본적으로 단어의 순서와 위치가 정확히 일치해야 매치됩니다. 만약, 단어의 위치가 달라질 경우 매치되지 않으므로, slop 옵션을 통해 어느 정도 단어의 위치 도치를 허용할 수 있습니다.
bool 쿼리는 여러 개의 쿼리를 결합하여 복잡한 논리 쿼리를 수행할 때 사용합니다. must, should, must_not 옵션을 통해 각각 AND, OR, NOT 논리 연산으로 결합할 수 있습니다. 예를 들어, 키워드가 '민주노총'이고 장르가 '편지'인 문서를 찾아야 하는 경우에 bool 쿼리를 사용합니다.
엘라스틱서치의 필터는 문서를 조건에 따라 참/거짓으로 평가하며, 참인 문서만을 골라냅니다. 주요 필터 타입은 다음과 같습니다: - **term 필터:** 지정한 필드에 지정한 텀이 포함된 문서를 매치합니다. 예를 들어, 'genre' 필드에 '편지'가 포함된 문서를 찾을 때 사용됩니다. - **terms 필터:** 여러 개의 텀을 배열로 지정할 수 있습니다. 예를 들어, 'keyword' 필드에 '민주노총'이나 '민주노동당'이 포함된 문서를 찾는 경우입니다. - **range 필터:** 지정한 필드 값이 범위 내에 있는 문서를 매치합니다. 수치, 날짜 등 다양한 타입에 적용할 수 있습니다. 예를 들어, 'id'가 10000~10010인 문서를 찾을 때 사용됩니다. - **exists 필터:** 특정 필드에 값이 존재하는 문서를 매치합니다. 예를 들어, 'url' 필드에 값이 존재하는 문서를 찾을 때 사용됩니다. - **bool 필터:** 여러 필터를 AND, OR, NOT 논리 연산으로 결합합니다. 예를 들어, '장르'가 '편지', '키워드'가 '비정규직'인 문서를 찾을 때 사용됩니다.
엘라스틱서치의 필터는 캐싱을 통해 성능을 최적화할 수 있습니다. 필터의 결과는 비트벡터 형태로 캐시되며, 특정 필드와 텀에 따라 캐시의 키가 결정됩니다. 예를 들어, 'title:민주노총' 필터의 결과는 [1, 0, 0] 형태로 캐시될 수 있습니다. 모든 필터가 캐시되지는 않으며, 특정 필터(예: term 필터)만 캐시가 지원됩니다.
다양한 필터 적용 사례를 살펴보겠습니다: - **term 필터 적용:** GET /_search { "query": { "filtered": { "filter": { "term": {"genre": "편지"} } } } } - **terms 필터 적용:** GET /_search { "query": { "filtered": { "filter": { "terms": {"keyword": ["민주노총", "민주노동당"]} } } } } - **range 필터 적용:** GET /_search { "query": { "filtered": { "filter": { "range": { "id": { "gte": 10000, "lt": 10010 } } } } } } - **exists 필터 적용:** GET /_search { "query": { "filtered": { "filter": { "exists": {"field": "url"} } } } } - **bool 필터 적용:** GET /_search { "query": { "filtered": { "filter": { "bool": { "must": [ {"term": {"genre": "편지"}}, {"term": {"keyword": "비정규직"}} ], "should": [ {"term": {"keyword": "현대자동차"}}, {"term": {"keyword": "파업"}} ], "must_not": [ {"term": {"keyword": "현대중공업"}} ] } } } } }
엘라스틱서치(Elasticsearch)는 아파치 루씬(Apache Lucene)을 기반으로 한 검색 및 분석 엔진입니다. 다양한 유형의 데이터를 지원하며, 주로 웹 검색 엔진에서 사용됩니다. 엘라스틱서치는 텍스트 분석에 특화되어 있으며, 데이터의 수집, 보강, 저장, 분석 및 시각화를 위한 ELK 스택(Elasticsearch, Logstash, Kibana)의 중요한 구성 요소입니다. 주요 기능으로는 전문 검색(Full Text Search)을 지원하며, 데이터를 스키마리스(Schema-Less)로 저장하고, RESTful API를 통해 CRUD 작업을 수행할 수 있습니다. 데이터를 효율적으로 검색하기 위해 역색인(Inverted Index) 자료구조를 사용합니다.
엘라스틱서치에서 텍스트 데이터를 처리하기 위해 분석기(Analyzer)와 토크나이저(Tokenizer)를 사용합니다. 분석기는 텍스트 데이터에서 의미 있는 단어 단위로 분할하는 과정을 담당하며, 이를 위해 케릭터 필터(Character Filter), 토크나이저, 토큰 필터(Token Filter)를 사용합니다. 케릭터 필터는 텍스트를 분석 가능한 형태로 변환하고, 토크나이저는 텍스트를 특정 단위로 분할하여 각 토큰을 생성합니다. 토큰 필터는 생성된 토큰을 정제하고 변형하는 역할을 합니다. 예를 들어, 스템머(Stammer)를 사용하면 단어의 어근을 추출하여 검색 정확성을 높일 수 있습니다.
엘라스틱서치는 효율적인 데이터 검색을 위해 역색인(Inverted Index) 구조를 사용합니다. 역색인은 특정한 단어가 포함된 문서를 빠르게 찾을 수 있도록 설계된 자료구조입니다. 검색 쿼리는 _search API를 통해 수행되며, 검색어와 유사도를 기반으로 문서를 랭킹합니다. 검색 결과는 유사도 점수(score)에 따라 내림차순으로 정렬되어 반환됩니다. 엘라스틱서치의 애널라이저를 통해 문서의 텍스트 데이터를 토큰화하고 필터링하여 저장함으로써, 효율적인 검색 및 분석이 가능합니다.
엘라스틱서치(Elasticsearch)의 쿼리 DSL은 데이터 검색을 매우 효율적으로 수행할 수 있는 강력한 도구입니다. 본 리포트에서는 엘라스틱서치의 정의와 주요 역할, 주요 기능들, 그리고 다양한 쿼리 유형과 필터 사용법을 상세히 다루었습니다. 이러한 지식을 통해 독자들은 데이터 검색 및 분석 과정에서 엘라스틱서치를 효과적으로 사용할 수 있을 것입니다. 다만, 엘라스틱서치의 성능 최적화를 위해서는 캐싱과 필터의 적절한 사용이 필요하며, 이는 쿼리 성능을 크게 향상시킬 수 있습니다. 또한, 앞으로 엘라스틱서치와 관련된 더 심층적인 연구와 실제 사례를 통해 추가적인 인사이트를 얻을 수 있을 것입니다. 이 리포트는 실제 개발 환경에서의 문제 해결과 성능 최적화에 유용한 참고 자료가 될 것입니다.
엘라스틱서치는 Apache Lucene 기반의 무료 검색 및 분석 엔진으로, 텍스트 분석에 특화되어 있으며, 웹 검색 엔진에서 많이 사용됩니다. 분석 및 저장을 담당하는 ELK 스택의 일부로, 전체 텍스트 검색, 동적 인덱싱, CRUD 연산을 지원하는 RESTful API를 제공합니다.
쿼리 도메인 특화 언어(Query Domain Specific Language)는 엘라스틱서치에서 인덱스된 문서를 검색하기 위해 사용되는 언어로, 다양한 쿼리 및 필터 옵션을 제공하여 복잡한 검색 조건을 설정할 수 있습니다.