Skip to content

Commit

Permalink
기본이 중요하다
Browse files Browse the repository at this point in the history
  • Loading branch information
K-Diger committed Jan 6, 2024
1 parent c095459 commit 3f4f5ae
Showing 1 changed file with 27 additions and 32 deletions.
59 changes: 27 additions & 32 deletions _posts/2024-1-6-ElasticSearch.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,14 @@ mermaid: true

## ElasticSearch 구성요소의 용어

| ElasticSearch | 의미 | RDBMS |
|---------------|-----------------------------------------------------------------------------------------------------------------------------|--------|
| `인덱스` | 문서(데이터)들의 모음을 가리킨다. | 데이터베이스 |
| `샤드` | 인덱스를 분할한 것을 가리킨다.<br/>엘라스틱서치는 대량의 데이터를 처리하고 분산 저장하기 위해 인덱스를 여러 샤드로 분할한다.<br/>각 샤드는 별도의 노드로 저장되며 병렬로 검색/처리 작업을 수행할 수 있다. | 파티션 |
| `타입` | 7.0버전 부터는 사라진 개념이다.<br/>테이블 없이 여러 유형의 데이터를 구분하기 위해 `필드`를 활용한다. | 테이블 |
| `문서` | 엘라스틱서치 내에서 검색/색인화/분석의 대상이 되는 기본 데이터 단위이다. 일반적으로 JSON형식으로 표현하여 유연한 구조로 데이터를 표현할 수 있다. (블로그 게시물 문서 --> 제목, 내용, 작성자를 필드로 가진다.) ||
| `필드` | 문서의 특정 부분으로, 각 필드는 해당하는 데이터 유형을 정의할 수 있다. ||
| `QueryDSL` | 엘라스틱서치에서 쿼리를 작성하기 위한 DSL이다. 쿼리 형식을 JSON형식으로 작성하여 검색 요청을 전달할 수 있다. | SQL |
| ElasticSearch | 의미 | RDBMS |
|---------------|----------------------------------------------------------------------------------------------------------------------------|--------|
| `인덱스` | 문서(데이터)들의 모음을 가리킨다. | 데이터베이스 |
| `샤드` | 인덱스를 분할한 것을 가리킨다.<br/>엘라스틱서치는 대량의 데이터를 처리하고 분산 저장하기 위해 인덱스를 여러 샤드로 분할한다.<br/>각 샤드는 별도의 노드로 저장되며 병렬로 검색/처리 작업을 수행할 수 있다. | 파티션 |
| `타입` | 7.0버전 부터는 사라진 개념이다.<br/>테이블 없이 여러 유형의 데이터를 구분하기 위해 `필드`를 활용한다. | 테이블 |
| `문서` | 엘라스틱서치 내에서 검색/색인화/분석의 대상이 되는 기본 데이터 단위이다.<br/>일반적으로 JSON형식으로 표현하여 유연한 구조로 데이터를 표현할 수 있다.<br/>(블로그 게시물 문서 --> 제목, 내용, 작성자를 필드로 가진다.) ||
| `필드` | 문서의 특정 부분으로, 각 필드는 해당하는 데이터 유형을 정의할 수 있다. ||
| `QueryDSL` | 엘라스틱서치에서 쿼리를 작성하기 위한 DSL이다. 쿼리 형식을 JSON형식으로 작성하여 검색 요청을 전달할 수 있다. | SQL |

---

Expand Down Expand Up @@ -73,15 +73,15 @@ Lucene은 사용자가 텍스트 데이터(Word 및 PDF 문서, 이메일, 웹

Lucene이 수행하는 단계는 다음과 같은 두 가지가 있다.

1. 검색하려는 문서의 역인덱스를 만든다.
1. 검색하려는 문서의 역 인덱스를 만든다.

2. 구문 분석 쿼리, 인덱스 탐색 후 결과를 반환한다.

![img_2.png](https://github.com/K-Diger/K-Diger.github.io/blob/main/images/lucene/lucene-diagram.png?raw=true)

---

### 역인덱스 개념
### 역 인덱스 개념

[참고 자료](https://blog.lael.be/post/3056)

Expand All @@ -105,32 +105,24 @@ SQL 에서는 **LIKE 검색이 INDEX 기능을 이용할 수 없다**는 단점

---

### Lucene에서의 역인덱스 (Analyzer, Write Index)
### Lucene에서의 역 인덱스 (Analyzer, Write Index)

다양한 유형의 문서를 인덱싱하기 위해선 Lucene이 주어진 문서에서 테스트를 구문 분석할 수 있는 형식으로 추출할 수 있어야 한다.

이를 위해 `Analyzer`가 사용된다.

`Analyzer`는 텍스트 데이터를 필터링하고 정리한다. 텍스트 데이터는 아래와 같은 여러 단계를 거쳐 가공된다.

- 단어 추출
- 불용어 제거
- 단어를 소문자로 만들기
1. 단어 추출
2. 불용어 제거
3. 단어를 소문자로 만들기

등의 과정을 통해 텍스트를 인덱스에 추가할 수 있는 토큰(단어 == 용어 == Term)으로 변환한다.(코드상에선 TokenStream을 반환한다.)

아래 그림은 추출된 텍스트 데이터를 바탕으로 기본 파일 시스템에 역 인덱스로 저장되는 인덱싱 프로세스를 나타낸다.

![](https://miro.medium.com/v2/resize:fit:640/format:webp/0*08Wz_ZBv7et6Mhrt.png)

Lucene은 검색하려는 필드를 저장하기 위해 역인덱스를 사용한다고 다시 한 번 말한다.

역인덱스는 토큰을 조회 키로 사용하여 해당 토큰이 포함된 문서를 찾는다.

쉽게 말하자면 단어 하나가 인덱싱된 PK가 되는 느낌이다.

이렇게 만들어진 인덱스들은 디렉토리의 일부로 물리적으로 저장될 수 있다.(파일 시스템 또는 메모리)

아래 그림은 특정 텍스트가 들어있는 `Document``불용어`를 바탕으로 역 인덱스를 만들어내는 작업을 도식화 한 것이다.

![](https://miro.medium.com/v2/resize:fit:1100/format:webp/0*qwlpYyz4pZBrfXnq.jpg)
Expand All @@ -139,15 +131,11 @@ Lucene은 검색하려는 필드를 저장하기 위해 역인덱스를 사용

### Lucene이 검색을 수행하는 과정

역인덱스를 기반으로 구문을 분석하여 DB든 File System이든 Memeory든 Write를 했으면 그 내용을 바탕으로 검색을 수행할 수 있다.
역 인덱스를 기반으로 구문을 분석하여 DB든 File System이든 Memeory든 Write를 했으면 그 내용을 바탕으로 검색을 수행할 수 있다.

이 때 인덱스의 모든 쿼리는 IndexSearcher를 통해 수행된다.
이 때 **인덱스의 모든 쿼리는** `IndexSearcher` 통해 수행된다. 검색 하고자하는 내용이 주어지면 쿼리 구문을 분석할 `QueryParser`를 만들어 인덱스에서 결과를 검색한다.

검색 하고자하는 내용이 주어지면 쿼리를 구문 분석하고 QueryParser를 만들고 인덱스에서 결과를 검색한다.

결과는 문서 ID와 쿼리와 일치하는 결과의 신뢰도 점수를 포함하는 ScoreDocs를 포함하는 TopDocs로 반환된다.

검색을 위한 클래스는 아래와 같다.
결과는 **문서 ID와 쿼리와 일치하는 결과의 신뢰도 점수(ScoreDocs)를 포함**하는 `TopDocs로 반환`된다.

#### IndexSearcher

Expand All @@ -167,15 +155,22 @@ Lucene은 검색하려는 필드를 저장하기 위해 역인덱스를 사용

#### Query

Lucene은 TermQuery, BooleanQuery, PrefixQuery, WildcardQuery, PhraseQuery 및 FuzzyQuery를 비롯한 여러 유형의 쿼리를 제공한다. 각 쿼리 유형은 인덱스를 검색하는 고유한 방법을 가지고 있다.
Lucene은 아래 유형의 쿼리를 비롯한 여러 유형의 쿼리를 제공한다. 각 쿼리 유형은 인덱스를 검색하는 고유한 방법을 가지고 있다.

- `TermQuery`
- `BooleanQuery`
- `PrefixQuery`
- `WildcardQuery`
- `PhraseQuery`
- `FuzzyQuery`

#### QueryParser

사람이 읽을 수 있는 쿼리(예: "opower AND arlington")를 검색에 사용할 수 있는 쿼리 개체로 구문 분석한다.
`사람이 읽을 수 있는 쿼리`(예: "opower AND arlington")를 `검색에 사용할 수 있는 쿼리 개체로` 구문 분석한다.

#### TopDocs

N개의 검색 결과에 대한 포인터를 위한 컨테이너이다. 각 TopDoc에는 문서 ID와 Confidence Score(검색 결과에 대한 적합도)가 포함되어있다.
N개의 검색 결과에 대한 포인터를 위한 컨테이너이다. 각 **TopDoc**에는 `문서 ID``Confidence Score(검색 결과에 대한 적합도)`가 포함되어있다.

---

Expand Down

0 comments on commit 3f4f5ae

Please sign in to comment.