본문 바로가기
elasticsearch

elasticsearch 기초 정의

by cactuslog 2024. 3. 4.

data indexing

 

1. elasticsearch는 빠른 검색을 위해 document를 indexing(인덱싱) 과정을 거쳐서 Inverted Index(역색인)를 만든다.

 

2. 그리고 원본 데이터와 함께 인덱스에 저장한다.

 


 

document

1. 원본 데이터를 JSON 형식으로 구조화한 것이다.

 

2. elasticsearch에서 단일 데이터 단위이다.

{"keyword":"맛은 그대로 지방은 제로, 제로 탄산 사이다", "hit_count":"1000"}

.

indexing (색인)

데이터가 검색될 수 있는 구조로 변경하기 위해 원본 문서를 검색어 토큰들로 변환하여 저장하는 과정

 

index

document들을 indexing하여 inverted index(역색인)와 함께 원본 데이터를 저장하는 논리적인 저장소

 


 

inverted index (역색인)

 

역색인이 무엇이길래 이것을 이용해서 빠른 검색이 가능한 것일까?

 

먼저 DB에서의 검색을 알아보자.

ID Text
doc1 나비처럼 날아서 처럼 쏜다
doc2 나비는 꽃을 좋아하고 도 꽃을 좋아한다

 

1. "벌"이 포함된 행을 찾으려면 다음과 같이 like 검색을 사용한다.

SELECT * FROM TABLE
WHERE text LIKE '%벌%'

 

2. 이 방식은 모든 행을 전부 확인하면서 "벌"이 포함되어 있는지 확인한다.

 

3. 데이터가 적으면 문제가 없지만, 1억, 10억건이 넘어간다면 성능에 문제가 발생한다.

 

4. elasticsearch에서는 데이터를 저장할 때  inverted index 구조를 만들어 저장한다.

TERM ID
나비 doc1, doc2
doc1
doc1 , doc2
doc1
doc2
좋아하 doc2

 

5. 이제 "벌"이 포함된 document를 찾을 때 전체 데이터를 검색하지 않는다.

 

6. 대신 "벌"이 포함된 document인 doc1, doc2 id를 바로 얻을 수 있다.

 

7. inverted index는 책 맨 뒷장에 찾아보기 페이지와 비슷하다.

 

8. 찾아보기 페이지에서 주요 키워드에 대한 내용이 몇 페이지에 있는지 찾을 수 있다.

 


텍스트 분석

 

1. 위에서 변환된 토큰들을 보면 일부 품사들이 제외된 것을 확인할 수 있다.

 

2. 나비처럼 날아서 벌처럼 쏜다 => 나비, 나, 벌, 쏘

 

3. inverted index로 구조화 하는 과정에서 텍스트 필드를 분석하는 과정인 analyzer를 거친다.

 

4. 한글은 영어에서 사용하는 analyzer로 형태소 분석이 불가능하다.

 

5. elasticsearch에서 공식으로 지원하는 nori를 사용한다.

https://www.elastic.co/guide/en/elasticsearch/plugins/current/analysis-nori.html#analysis-nori-install

 

Korean (nori) analysis plugin | Elasticsearch Plugins and Integrations [8.12] | Elastic

Korean (nori) analysis pluginedit The Korean (nori) Analysis plugin integrates Lucene nori analysis module into elasticsearch. It uses the mecab-ko-dic dictionary to perform morphological analysis of Korean texts. Installationedit This plugin can be instal

www.elastic.co

 

custom 설정 없이 기본 nori 사용

PUT test-keyword-index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "default":{
          "type": "nori"
        }
      }
    }
  }
}

 

GET test-keyword-index/_analyze
{
  "text": "나비처럼 날아서 벌처럼 쏜다"
}

 

{
  "tokens": [
    {
      "token": "나비",
      "start_offset": 0,
      "end_offset": 2,
      "type": "word",
      "position": 0
    },
    {
      "token": "나",
      "start_offset": 5,
      "end_offset": 6,
      "type": "word",
      "position": 2
    },
    {
      "token": "벌",
      "start_offset": 9,
      "end_offset": 10,
      "type": "word",
      "position": 4
    },
    {
      "token": "쏘",
      "start_offset": 13,
      "end_offset": 15,
      "type": "word",
      "position": 6
    }
  ]
}

 

6. "나비처럼 날아서 벌처럼 쏜다"에서 날아서를 형태소 분석할 때 어근인 ""이 아닌 ""가 결과로 나온다.

 

7. 이처럼 잘못된 부분이 있기 때문에 custom 처리가 필요하다.

 

8. 동의어, 반의어 등의 설정도 해야한다.

 

9. 위의 문제에 대한 해결을 중점으로 elasticsearch의 한글 형태소 분석에 대해 추후에 작성할 계획이다.