ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Elasticsearch] 엘라스틱 서치 인덱스 생성
    Elasticsearch 2023. 4. 6. 15:38

     

    인덱스를 생성하는 기본 쿼리

    PUT /<인덱스명>
    {
      "settings": {
        "number_of_shards": <샤드 개수>,
        "number_of_replicas": <복제본 개수>,
        ...
      },
      "mappings": {
        <매핑 설정>
      }
    }
    

     

    Settings와 Mappings

    • 모든 인덱스는 두 개의 정보 단위를 가지고 있는데 바로 settings와 mappings이다.

     

    Mappings

    데이터 타입

    • 필드의 데이터 타입을 정의합니다. 데이터 타입에는 숫자, 문자열, 날짜 등이 있으며, 데이터의 형식과 크기에 따라 적절한 데이터 타입을 지정해야 합니다.
    "properties": {
      "title": {
        "type": "text"
      },
      "price": {
        "type": "integer"
      },
      "created_at": {
        "type": "date",
        "format": "strict_date_optional_time||epoch_millis"
      },
      "price": {
        "type": "double"
      }
    }
    

    검색 가능 여부, 정렬 가능 여부 등 설정

    • 필드의 검색 가능 여부, 정렬 가능 여부, 필드의 유일성 여부 등을 설정할 수 있습니다.
    • 데이터의 검색 및 정렬 요구사항에 따라 필드의 설정을 적절하게 지정해야 합니다.
    • 필드의 설정이 검색 결과와 정확성에 직접적인 영향을 미치므로, 데이터의 특성을 고려하여 필드의 속성을 설정해야 합니다.

    중첩된 객체 및 배열 설정

    • 문서 내에 중첩된 객체나 배열이 있는 경우, 해당 객체나 배열의 매핑을 정의해야 합니다.
    • 중첩된 객체나 배열의 구조와 데이터 타입을 정확하게 지정하여 데이터의 검색과 분석이 원활하게 이루어질 수 있도록 해야 합니다.
    "mappings": {
      "properties": {
        "author": {
          "properties": {
            "first_name": {
              "type": "text"
            },
            "last_name": {
              "type": "text"
            }
          }
        },
        "tags": {
          "type": "nested",
          "properties": {
            "name": {
              "type": "keyword"
            },
            "score": {
              "type": "integer"
            }
          }
        }
      }
    }
    
    

    동적 매핑 설정

    • 엘라스틱 서치는 동적으로 매핑을 생성할 수 있는 기능을 제공합니다.
    • 인덱스에 문서가 추가될 때, 자동으로 필드의 매핑을 생성하는 기능을 사용할 수 있습니다.
    • 동적 매핑 설정을 통해 데이터의 다양성과 확장성을 고려할 수 있습니다.
    "mappings": {
      "dynamic": "true",
      "properties": {
        "title": {
          "type": "text"
        },
        "author": {
          "type": "keyword"
        }
      }
    }
    

    필드 별칭 설정

    • 필드 별칭은 검색 요청 시 필드의 별칭을 사용하여 더 간편하고 유연한 검색을 할 수 있게 해줍니다.
    • 필드 별칭을 설정하여 필드의 이름을 추상화하고, 검색 요구사항의 변경에 대응할 수 있도록 해야 합니다.
    "mappings": {
      "properties": {
        "title": {
          "type": "text"
        },
        "author": {
          "type": "keyword"
        },
        "pub_date": {
          "type": "alias",
          "path": "published_date"
        }
      }
    }
    

     

     

    Settings

    인덱스의 기본 설정

    • 인덱스의 샤드 수와 복사본 수를 설정할 수 있습니다.
    • 샤드는 인덱스의 데이터를 분산 저장하는 단위이며, 복사본은 데이터의 안정성을 보장하기 위해 사용됩니다.
    • 사용자의 데이터 크기와 검색 요구사항에 맞게 적절한 값을 선택해야 합니다.
    • shard는 분산해서 저장하기 때문에 replica 수보다 많게 설정하는 것이 좋으며, shard와 replica를 합한 수가 index 수가 될 수 있도록 설정하는 것을 권장합니다. (shard수+replica수=index수)
    • replica는 많을수록 성능 이슈가 많이 발생하기 때문에 0 or 1 개를 사용할 것을 권장합니다.
    PUT /index_name
    {
      "settings": {
        "number_of_shards": 3,
        "number_of_replicas": 2
      }
    }
    

    성능 및 저장 옵션 설정

    • 인덱스의 성능과 저장 옵션을 설정할 수 있습니다.
    • 인덱스의 메모리 할당량, 검색 요청 시간 제한, 데이터 복구 설정 등을 고려하여 적절한 값을 지정해야 합니다.
    • 각 설정 옵션의 의미와 영향을 이해하고 설정하는 것이 중요합니다.
    PUT /index_name/_settings
    {
      "index": {
        "refresh_interval": "30s",
        "max_result_window": 10000,
        "translog.flush_threshold_size": "512mb"
      }
    }
    
    

    데이터 백업 및 복구 설정

    • 인덱스의 데이터 백업과 복구 설정을 정의할 수 있습니다.
    • 데이터의 안정성과 보존을 위해 정기적인 백업 설정과 데이터 손실 발생 시의 복구 방법을 고려해야 합니다.
    • 백업과 복구에 사용될 스냅샷 및 리포지토리를 설정하는 것도 중요합니다.
    PUT /_snapshot/my_repository
    {
      "type": "fs",
      "settings": {
        "location": "/mnt/backups/my_repository",
        "compress": true}
    }
    

     

    Filter, Tokenizer, Analyzer

    Elasticsearch에서 검색을 수행하려면, 검색어를 인덱싱할 때 사용된 텍스트를 정규화(normalization)해야합니다. 이를 위해 Elasticsearch는 filter, tokenizer, analyzer 등의 기능을 제공합니다.

    Filter

    Filter는 토큰 스트림에서 토큰을 처리하는 방법을 정의합니다. 주요한 filter 종류로는 소문자 변환(Lowercase), 불용어 제거(Stopwords) 및 동의어 처리(Synonyms)가 있습니다.

    "filter": {
      "my_stopwords": {
        "type": "stop",
        "stopwords": [
          "the",
          "a",
          "an"
        ]
      },
      "my_synonyms": {
        "type": "synonym",
        "synonyms": [
          "u.s, united states, usa",
          "search, query"
        ]
      }
    }
    

    Tokenizer

    Tokenizer는 텍스트를 토큰으로 분리하는 방법을 정의합니다. 일반적인 tokenizer 종류로는 Standard, Whitespace, Keyword 등이 있습니다.

    "tokenizer": {
      "my_tokenizer": {
        "type": "standard",
        "max_token_length": 5
      }
    }
    

    Analyzer

    "analyzer": {
      "my_analyzer": {
        "type": "custom",
        "tokenizer": "standard",
        "filter": [
          "lowercase",
          "my_stopwords",
          "my_synonyms"
        ]
      }
    }
    

     

     

    // settings 예시
    PUT /index_name
    {
      "settings": {
        "number_of_shards": 5,
        "number_of_replicas": 1,
        "analysis": {
          "analyzer": {
            "my_analyzer": {
              "type": "custom",
              "tokenizer": "standard",
              "filter": [
                "lowercase",
                "my_stopwords",
                "my_synonyms"
              ]
            }
          },
          "filter": {
            "my_stopwords": {
              "type": "stop",
              "stopwords": [
                "the",
                "a",
                "an"
              ]
            },
            "my_synonyms": {
              "type": "synonym",
              "synonyms": [
                "u.s, united states, usa",
                "search, query"
              ]
            }
          }
        }
      }
    }
    

     

     

     

     

     

     

     

     

    엘라스틱 서치 가이드북

    - https://esbook.kimjmin.net/

     

    Elastic 가이드 북 - Elastic 가이드북

    7. 인덱스 설정과 매핑 - Settings & Mappings

    esbook.kimjmin.net

     

    728x90
Designed by Tistory.