본문 바로가기

공부방

(97)
노리 (nori) 한글 형태소 분석기 커뮤니티 한글 형태소 분석기 - 아리랑, 은전한닢, Open Korean Text 한글은 형태의 변형이 매우 복잡한 언어입니다. 특히 복합어, 합성어 등이 많아 하나의 단어도 여러 어간으로 분리해야 하는 경우가 많아 한글을 형태소 분석을 하려면 반드시 한글 형태소 사전이 필요합니다. 오픈 소스 커뮤니티에서 개발되어 Elasticsearch에서 사용 가능한 한글 형태소 분석기는 다음과 같은 것들이 있습니다. (https://www.elastic.co/kr/blog/using-korean-analyzers 에서 발췌) Elasticsearch가 한글을 지원하지 않던 시절에 위의 형태소 분석기들은 한글 사용자들에게 큰 도움이 되었습니다. 하지만 외부에서 만들어진 기능이다 보니 Elasticsearch 버전이 ..
텍스트 분석 - Text analysis 텍스트 분석 과정 데이터 시스템에 다음과 같은 문서들을 저장한다고 가정 해 보겠습니다. 일반적으로 오라클이나 MySQL 같은 관계형 DB에서는 위 내용을 보이는 대로 테이블 구조로 저장을 합니다. RDBMS에서 데이터 조회 한 줄씩 검색 -> 조회 성능이 떨어집니다. 만약에 위 테이블에서 Text 에 fox가 포함된 행들을 가져온다고 하면 다음과 같이 Text 열을 한 줄씩 찾아 내려가면서 fox가 있으면 가져오고 없으면 넘어가는 식으로 데이터를 가져 올 것입니다. Elasticsearch에서 데이터 조회 전통적인 RDBMS 에서는 위와 같이 like 검색을 사용하기 때문에 데이터가 늘어날수록 검색해야 할 대상이 늘어나 시간도 오래 걸리고, row 안의 내용을 모두 읽어야 하기 때문에 기본적으로 속도가 ..
범위 쿼리 (Range Query) 연습용 데이터 생성 Elasticsearch는 이 외에도 숫자나 날짜 형식들의 저장이 가능합니다. 숫자, 날짜 형식은 range 쿼리를 이용해서 검색을 합니다. range 쿼리의 예제를 위해 먼저 아래의 phones 인덱스를 추가하겠습니다. phones 인덱스에 다섯개의 Query를 추가합니다. model, price, date라는 값들이 들어있습니다. POST phones/_bulk {"index":{"_id":1}} {"model":"Samsung GalaxyS 5","price":475,"date":"2014-02-24"} {"index":{"_id":2}} {"model":"Samsung GalaxyS 6","price":795,"date":"2015-03-15"} {"index":{"_id":3..
정확값 쿼리 (Exact Value Query) 지금까지 살펴본 풀 텍스트 검색은 스코어 점수 기반으로 정확도(relevancy)가 높은 결과부터 가져옵니다. Elasticsearch는 정확도를 고려하는 풀 텍스트 외에도 검색 조건의 참 / 거짓 여부만 판별해서 결과를 가져오는 것이 가능합니다. 풀 텍스트와 상반되는 이 특성을 정확값(Exact Value) 이라고 하는데 말 그대로 값이 정확히 일치 하는지의 여부 만을 따지는 검색입니다. Exact Value 에는 term, range 와 같은 쿼리들이 이 부분에 속하며, 스코어를 계산하지 않기 때문에 보통 bool 쿼리의 filter 내부에서 사용하게 됩니다. bool : filter (스코어 계산 X) bool쿼리의 filter 안에 하위 쿼리를 사용하면 스코어에 영향을 주지 않습니다. 다음 3개의..
복합 쿼리 - Bool Query Bool query란? 여러개의 Query를 같이 쓰려면 Bool Query를 사용해야합니다. Bool Query 안에 여러개의 Query를 넣으면 되는 것입니다. RDBMS는 and, or 을 사용해서 복합 쿼리를 사용할 수 있다면 Elasticsearch 에서는 must, must not, should, filter를 사용할 수 있습니다. must : 쿼리가 참인 도큐먼트들을 검색합니다. must_not : 쿼리가 거짓인 도큐먼트들을 검색합니다. should : 검색 결과 중 이 쿼리에 해당하는 도큐먼트의 점수를 높입니다. filter : 쿼리가 참인 도큐먼트를 검색하지만 스코어를 계산하지 않습니다. must 보다 검색 속도가 빠르고 캐싱이 가능합니다. Bool query 사용 예제 기본 사용법은 아..
정확도 - Relevancy (Score 책정) Elasticsearch의 검색 결과에는 스코어 점수가 표시가 됩니다. 이 점수는 검색된 결과가 얼마나 검색 조건과 일치하는지를 나타내며 점수가 높은 순으로 결과를 보여줍니다. 다음의 match 쿼리 결과를 살펴보겠습니다.Elasticsearch의 검색 결과에는 스코어 점수가 표시가 됩니다. 이 점수는 검색된 결과가 얼마나 검색 조건과 일치하는지를 나타내며 점수가 높은 순으로 결과를 보여줍니다. 다음의 match 쿼리 결과를 살펴보겠습니다. GET my_index/_search { "query": { "match": { "message": "quick dog" } } } 각 검색 결과의 _score 항목에 스코어 점수가 표시되고 이 점수가 높은 결과부터 나타납니다. 그리고 상단의 max_score에는 전..
검색과 쿼리 - Query DSL (domain specific language) 연습용 데이터 생성 my_index라는 인덱스를 연습용으로 사용해 보도록 하겠습니다. my_index가 존재하는 경우 먼저 인덱스 삭제부터 진행하도록 하겠습니다. DELETE my_index my_index에 5개의 field를 넣어주고 각각의 field에는 message 값이 있는 데이터를 넣어줍니다. POST my_index/_bulk {"index":{"_id":1}} {"message":"The quick brown fox"} {"index":{"_id":2}} {"message":"The quick brown fox jumps over the lazy dog"} {"index":{"_id":3}} {"message":"The quick brown fox jumps over the quick do..
CRUD - 입력, 조회, 수정, 삭제 Elasticsearch 커맨드 소개 단일 데이터는 document 이며 인덱스 document의 논리적인 집합을 말합니다. Elasticsearch에서는 단일 도큐먼트별로 고유한 URL을 갖습니다. 도큐먼트에 접근하는 URL은 아래와 같습니다. http://://_doc/ 6.x 이전버전 참고 http://:/// 인덱스 생성 및 데이터 저장 (PUT) 데이터를 저장하는 경우 인덱스가 존재하지 않는다면, 인덱스가 먼저 생성이 된 후 데이터가 저장됩니다. PUT을 이용해 데이터를 저장하는 방법은 두가지가 있습니다. 1. 덮어쓰기 2. 덮어쓰기 방지 각각의 방법을 살펴보겠습니다. 덮어쓰기 (_doc) 기존 데이터가 존재한다면 덮어쓰는 방법입니다. _doc 이라는 명령어를 이용하여 데이터를 저장하는데 1번 ..