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