ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ElasticSearch - text, keyword 대체 무엇이 다른가?
    ElasticSearch 2024. 9. 25. 23:09
    반응형

    1. text 타입: 전문 검색(Full-text Search) 용도

    • 주요 기능: 전문 검색을 위해 데이터를 처리할 때 사용됩니다. 검색어의 일부분만 일치해도 검색 결과에 포함될 수 있도록 데이터를 분석하고 토큰화합니다.
    • 토큰 생성 방식: 텍스트 데이터는 분석기(Analyzer)에 의해 처리되고, 여러 개의 토큰으로 나눠집니다. 예를 들어, "quick brown fox"라는 텍스트가 있다면 text 타입의 필드에서는 이를 "quick", "brown", "fox"로 분리하여 각각의 토큰으로 저장됩니다.
    • 사용 예시: 검색어를 부분적으로 입력해도 문서 내에서 해당 단어의 변형이나 동의어 등을 찾아낼 수 있습니다. 문장이나 긴 텍스트에서 자유롭게 검색을 진행해야 하는 경우에 적합합니다.

    장점

    • 검색 유연성: 여러 단어를 부분 일치하거나 유사한 형태로 검색할 수 있습니다.
    • 검색 정확도 향상: 단순한 단어 검색을 넘어 텍스트 내의 맥락과 관계를 고려한 검색이 가능해집니다.

     

     

    2. keyword 타입: 정확한 매칭(Exact Matching) 용도

    • 주요 기능: 정확한 값을 일치시키기 위해 사용됩니다. 데이터는 그대로 저장되며 토큰화되지 않습니다.
    • 토큰 생성 방식: keyword 타입의 필드는 분석되지 않고, 입력된 데이터를 하나의 토큰으로 취급합니다. 예를 들어, "quick brown fox"라는 값이 있다면, 이를 전체 하나의 값으로 저장하여 정확히 이 값과 일치하는 데이터만 검색됩니다.
    • 사용 예시: 이메일 주소, 사용자 ID, 국가 코드와 같은 정확한 값이 필요한 필드에서 사용됩니다.

    장점

    • 빠른 검색: 분석과 토큰화 과정이 없기 때문에 검색 속도가 빠릅니다.
    • 정확한 일치: 데이터의 정확한 일치가 필요한 상황에 적합합니다.

     

     

    Text의 경우 

    GET /_analyze
    {
      "analyzer": "standard",
      "text": "I am a boy"
    }

    이와같이 분석할 텍스트 즉 'I am a boy'를 분석한다. 

     

    {
      "tokens": [
        {
          "token": "i",
          "start_offset": 0,
          "end_offset": 1,
          "type": "<ALPHANUM>",
          "position": 0
        },
        {
          "token": "am",
          "start_offset": 2,
          "end_offset": 4,
          "type": "<ALPHANUM>",
          "position": 1
        },
        {
          "token": "a",
          "start_offset": 5,
          "end_offset": 6,
          "type": "<ALPHANUM>",
          "position": 2
        },
        {
          "token": "boy",
          "start_offset": 7,
          "end_offset": 10,
          "type": "<ALPHANUM>",
          "position": 3
        }
      ]
    }

     

    standard 분석기를 사용한 경우, 텍스트는 공백을 기준으로 토큰화되며, 모든 텍스트가 소문자로 변환됩니다. 예시 응답은 위와 같다. 

     

    상세 설명

    1. 토큰(Token): 분석된 텍스트의 각 단어가 토큰으로 변환되었습니다. I, am, a, boy가 각각 소문자로 변환된 i, am, a, boy로 출력됩니다.
    2. **start_offset**과 end_offset: 각 토큰의 원래 텍스트에서의 위치를 나타냅니다. 예를 들어, "I"는 문자열의 0번째에서 1번째 문자에 위치하고, "boy"는 7번째에서 10번째 문자에 위치합니다.
    3. type: 각 토큰의 타입을 나타내며, 대부분의 경우 알파벳과 숫자가 혼합된 경우 <ALPHANUM>으로 나타납니다.
    4. position: 토큰의 순서를 나타냅니다. "I"는 0번째 위치, "am"은 1번째 위치, "a"는 2번째 위치, "boy"는 3번째 위치입니다.

     

    표준 분석기(standard analyzer)의 특징

    • 소문자 변환: 모든 대문자는 소문자로 변환됩니다.
    • 단어 단위 토큰화: 공백을 기준으로 텍스트가 단어 단위로 나누어집니다.
    • 기본적이고 범용적인 분석기: 다양한 언어와 상황에 적합한 기본적인 분석기입니다.

    keyword의 경우

    GET /_analyze
    {
      "analyzer": "keyword",
      "text": "I am a boy"
    }

     

    {
      "tokens": [
        {
          "token": "I am a boy",
          "start_offset": 0,
          "end_offset": 10,
          "type": "word",
          "position": 0
        }
      ]
    }

    상세 설명

    1. 토큰(Token): "I am a boy"라는 전체 텍스트가 하나의 토큰으로 변환되었습니다. keyword 분석기에서는 텍스트를 분리하지 않고 그대로 저장하므로, 입력된 텍스트 전체가 하나의 단위로 처리됩니다.
    2. **start_offset**과 end_offset: 텍스트의 시작 위치와 끝 위치를 나타냅니다. 여기서 start_offset은 0이고, end_offset은 10입니다. (공백을 포함한 전체 텍스트 길이)
    3. type: 토큰의 타입을 나타냅니다. 이 경우는 단어 전체를 하나로 처리하므로 "word"로 표시됩니다.
    4. position: 텍스트 내에서의 토큰의 위치를 나타냅니다. "I am a boy"는 하나의 토큰이므로 position은 0입니다.

    keyword 분석기의 특징

    • 토큰화 없음: 텍스트를 분리하지 않고, 입력된 원문을 그대로 하나의 토큰으로 취급합니다.
    • 정확한 매칭: keyword 분석기는 검색 시 정확한 매칭이 필요한 경우, 예를 들어 이메일 주소, ID, 코드와 같은 데이터에서 유용하게 사용됩니다.
    • 소문자 변환 없음: standard 분석기와 달리 keyword 분석기는 대소문자를 변환하지 않습니다. 원문 그대로 유지됩니다.

     

     

    text와 keyword 둘 다 문자열을 다루지만 그림과 같이 다르게 생성이 된다.


     

    Keyword와 Text색인 속도 

    1. keyword 타입의 색인 속도

    • 색인 속도: 빠름
    • 이유: keyword 타입은 데이터를 토큰화하거나 분석하지 않고, 입력된 값을 그대로 저장합니다. 이는 색인 과정에서 추가적인 분석 작업이 없기 때문에 매우 빠릅니다.
    • 과정: 데이터는 단순히 하나의 단위로 저장되며, 색인할 때 분석이나 변형 없이 바로 색인됩니다. 예를 들어, 이메일 주소나 사용자 ID와 같은 데이터는 keyword 타입으로 처리되면, 분석기 없이 그대로 색인됩니다.

    장점:

    • 분석 작업이 없으므로 색인 속도가 빠릅니다
    • 정확한 매칭이 필요할 때 유리합니다.

    단점:

    • 텍스트에 대한 자유로운 검색(부분 검색, 유사 검색)은 어렵습니다.

     

     

    2. text 타입의 색인 속도

    • 색인 속도: 느림
    • 이유: text 타입은 데이터를 분석하고 여러 개의 토큰으로 분리하는 과정을 거칩니다. 텍스트가 분석기를 통해 처리되면서 색인할 때 각 단어를 토큰화하고, 필요에 따라 대소문자를 변환하거나 불용어를 제거하는 등 다양한 처리를 수행합니다.
    • 과정: 예를 들어 "I am a boy"라는 문장이 들어오면, text 타입에서는 "I", "am", "a", "boy"로 나눠서 각 단어가 별도의 토큰으로 색인됩니다. 이 과정에서 분석기(analyzer)가 작동하며, 이로 인해 추가적인 처리 시간이 발생합니다.

    장점 : 

    • 전문 검색(Full-text Search)에 매우 적합합니다.
    • 다양한 검색 기능(부분 검색, 유사 검색, 동의어 처리 등)을 지원합니다.

    단점:

    • 분석기 처리로 인해 색인 속도가 느려질 수 있습니다.
    • 텍스트가 길고 복잡할수록 색인 시간이 더 길어질 수 있습니다.

    비교 정리

    • keyword 타입: 분석 과정이 없으므로 데이터 처리 및 색인 속도가 매우 빠릅니다. 데이터가 그대로 저장되기 때문에 메모리와 자원의 소모가 적고, 정확한 매칭이 필요한 경우 적합합니다.
    • text 타입: 텍스트를 분석하고 여러 개의 토큰으로 분리하는 작업이 필요하기 때문에 색인 속도가 상대적으로 느립니다. 하지만 전문 검색과 유사 검색을 지원할 수 있는 강력한 기능을 제공합니다.

    결론

    • 빠른 색인이 필요하고 정확한 매칭을 원한다면 keyword 타입이 적합합니다.
    • 유연한 검색 기능을 위해 텍스트 분석이 필요하다면, text 타입을 사용하는 것이 좋습니다. 다만, 이 경우 색인 속도가 상대적으로 느릴 수 있습니다.

     


    동적 매핑의 경우

     

    lasticsearch에서 문자열 필드가 동적 매핑(Dynamic Mapping) 될 때, 기본적으로 text 타입과 keyword 타입 두 가지가 모두 생성됩니다.

     

    동적 매핑(Dynamic Mapping) 개념

    동적 매핑은 Elasticsearch가 미리 정의된 매핑 없이도 자동으로 데이터 구조를 감지하고, 적절한 필드 유형을 할당하는 기능입니다. 문자열 데이터는 Elasticsearch에서 기본적으로 **text**와 keyword 두 가지로 매핑됩니다. 이를 통해 전체 텍스트에 대한 검색과 정확한 매칭이 모두 가능합니다.

     

    {
      "type": "book",
      "title": "elasticsearch essential",
      "author": "alden",
      "rating": 5.0
    }
    • type: "book" - 문서의 유형을 나타내는 필드로, 이 필드는 문자열이지만 Elasticsearch는 일반적으로 이를 keyword로 간주하여 동적 매핑할 수 있습니다.
    • title: "elasticsearch essential" - 책의 제목을 나타내는 문자열 필드.
    • author: "alden" - 저자의 이름을 나타내는 문자열 필드.
    • rating: 5.0 - 평점을 나타내는 숫자형(float) 필드.

    동적 매핑이 작동하는 방식

    1. text와 keyword 필드 동시 생성 문자열 필드인 title과 author에 대해 동적 매핑이 적용되면, Elasticsearch는 자동으로 이 필드들에 대해 **text**와 keyword 타입을 모두 생성합니다. 이 필드들은 **다중 필드(Multi-field)**로 저장됩니다. 즉, 문자열 필드는 두 가지 버전으로 색인됩니다:
      • text 필드: 전문 검색(Full-text Search)에 사용됩니다. 분석기를 통해 텍스트를 토큰화하고 처리합니다. 부분 일치나 유사 검색이 가능하게 합니다.
      • keyword 필드: 정확한 매칭을 위해 사용됩니다. 텍스트를 분석하지 않고, 그대로 저장하여 데이터의 정확한 일치(Exact Match)가 필요한 경우 사용됩니다.
    2. 예시에서의 동적 매핑 결과
    GET /library/_mapping
    {
      "library": {
        "mappings": {
          "author": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "rating": {
            "type": "float"
          }
        }
      }
    }
     
    • type 필드: "book"은 문자열이지만, 정확한 매칭이 필요할 것으로 예상되므로 keyword 타입으로 자동 매핑됩니다.
    • title 필드: "elasticsearch essential"은 text 타입으로 매핑되고, 여기에 keyword 서브필드가 추가됩니다. 이를 통해 title 필드를 전문 검색으로 사용할 수 있으며, title.keyword 필드를 통해 정확한 매칭도 가능합니다.
    • author 필드: "alden"도 동일하게 text 타입으로 매핑되며, keyword 서브필드가 생성되어 유사한 방식으로 처리됩니다.
    • rating 필드: 5.0은 숫자(float)로 인식되므로, float 타입으로 자동 매핑됩니다.

     

     

    문자열의 특성에 따라 text와 keyword를 정적 매핑해 주면 성능에 도움이 된다.

    기존의 그림과 같이 두타입은 검색 과정에서도 차이를 보인다.

    text로 정의되면 좋을만한 필드 keyword로 정의되면 좋을 만한 필드
    주소, 이름, 물품 상세 정보... 성별, 물품 카테고리 ...

     

    반응형

    댓글

Designed by Tistory.