Elasticsearch
Elasticsearch는 비정형 데이터 검색에 최적화된 데이터베이스(search engine)이다.
Elasticsearch의 기원
런던의 아파트에서 살고 있는 Shay Banon은 구직중 남는 시간에 아내의 요리법 목록을 위한 검색 엔진을 만들었다. 이 최초의 버전이 컴파스(Compass ,2004)이고, 두번째 버전이 Elasticsearch(2010)이다.
Elasticsearch와 관련된 용어들
- 시스템 아키텍트가 신경써야 할 부분
- Cluster
- Node
- Shard
- Replica
- 내(데이터 엔지니어)가 신경써야 할 부분
- Index
- Documents
- Mappings
- Analyzer
- Scoring
관계형 데이터베이스(RDB) VS 엘라스틱 서치(Elasticsearch)
관계형 데이터베이스 (mysql) | 엘라스틱 서치 |
Database | index |
Table | Type |
Row | Document |
Column | Field |
Schema | Mapping |
index 설정가능 | 모두 index 되어있음 |
SQL | Query DSL |
Index
- 원본 데이터에 빠르게 접근하기 위한 추가적인 데이터 집합
- 데이터가 저장될 때 그 데이터를 위한 인덱스 데이터를 자동으로 생성
- 데이터의 타입이나 목적성에 따라 구현 방식만 다를 뿐 결국 추가적인 저장용량을 쓰면서 검색 속도를 향상시키는 방법이다.
- B-tree, B+tree, Hash Table, Inverted index ...
시간 복잡도 (time complex)
Big이라는 단어를 포함하는 문서들을 찾는데 걸리는 시간 복잡도
Elasticsearch O(1)
Term | Document |
Big | Doc1, Doc2, ... |
Data | Doc1, Doc3, ... |
RDB O(n)
Document_id | Content |
Doc1 | Big data is very big |
Doc2 | Data science is science |
어떻게 Term을 추출해야 좋을까?
Term과 Document를 매칭을 시켜야 하는데...
Text mining 101스타일
- 특수문자 제거, 원형복원, 불용어제거 등
- Analyzer를 활용
- Tokenizer: 문장 자르기
- Filter: 번형, 제거하기
Inverted Index
Term | Docs (doc_id, offset) |
'The' | '{(1,0), (1,32), (2,0)}' |
'big' | '{(1,4)}' |
'brown' | '{(1,8), (2,4)}' |
Analyzer
Tokenizer : 어떤 기준으로 단어를 자를 것인가?
- 한국어는 보통 KSS로 [Korean Sentence Splitter]: initializing KSS
- 공식 가이드라인 참고
- https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-tokenizers.html
Tokenizer reference | Elasticsearch Guide [8.6] | Elastic
A tokenizer receives a stream of characters, breaks it up into individual tokens (usually individual words), and outputs a stream of tokens. For instance, a whitespace tokenizer breaks text into tokens whenever it sees any whitespace. It would convert the
www.elastic.co
Filter: 어떤 단어를 어떻게 바꿀 것인가?
Char Filter: Before tokenizing
- HTML Strip Character Filter
- Mapping Character Filter
- Pattern Replace Character Filter
Token Filter: After tokenizing
- 우리가 알고 있는 대부분의 텍스트 전처리 기법들
- stemmer, n-gram, stop words, shingle, uppercase, lowercase
Scoring: 쿼리와 문서간의 점수계산
Query 또한 analyzer에 의해 분해가 되고, 이렇게 분해된 term들을 활용하여, 이전에 index된 문서와 점수 계산
BM25가 기본이지만, 다양한 옵션을 제공
- BM25
- DFR
- DFI
- IB
- LM Dirichlet
- LM Jelinek Mercer
Mappings
- 문서가 어떠한 필드들을 갖고 이들을 어떻게 인덱싱 할지를 정의하는 과정
- 최초에 인덱스를 생성할 때 설정
- 필요에 따라 각 field에 Analyzer도 정의
Settings
- Analyzer 관련 세팅
- Similarity 관련 세팅
- Shard, Replica 등과 같은 아키텍쳐적인 세팅
예시 코드
def set_index(self):
"""index 생성 과정"""
index_config = {
'settings': {
'analysis': {
'analyzer': {
'nori_analyzer': {
'type': 'custom',
'tokenizer': 'nori_tokenizer',
'decompound_mode': 'mixed',
'filter': ['shingle'],
}
}
}
},
'mappings': {
'dynamic': 'strict',
'properties': {
'document_text': {
'type': 'text',
'analyzer': 'nori_analyzer',
}
}
}
}
Install
아래 깃허브 저장소 Read_me 참고
https://github.com/thejungwon/search-engine-tutorial
GitHub - thejungwon/search-engine-tutorial
Contribute to thejungwon/search-engine-tutorial development by creating an account on GitHub.
github.com
'AI-Tech 부스트캠프' 카테고리의 다른 글
[특강] AI와 저작권법 (0) | 2023.01.20 |
---|---|
[특강] Kaggle에 대하여 (0) | 2023.01.20 |
[특강] 자연어 처리를 위한 언어 모델의 학습과 평가 (0) | 2022.12.31 |
2021_10_06_(수) (0) | 2021.10.06 |
2021_10_01_(금) (0) | 2021.10.01 |
댓글