[elasticsearch] create index & bulk data

yoon-bomi·2022년 11월 21일
0

elasticsearch

목록 보기
2/4
post-thumbnail

인덱스 생성하기

만약 이미 생성한 인덱스가 있는데 매핑 정보를 바꾸려 한다면 가장 좋은 방법은 해당 인덱스를 삭제하고 새로 생성하는 것이다. (혹시 모를 인덱스 매핑 오류를 막기 위해 인덱스를 밀고 새로 넣는 게 제일 좋다고 한다.)

  • 인덱스에 이미 데이터가 들어있다면 매핑 정보를 수정할 수 없다.

포스트맨을 이용해 PUT http://es_url:port/생성할_인덱스_명칭 에 요청 보내기

  • headers : 로컬이 아닌 경우 Authorization - ApiKey 를 함께 넣어서 요청한다.

  • body

{
  "settings": {
    "analysis": {
      "filter": {
        "english_stop": {
          "type":       "stop",
          "stopwords":  "_english_" 
        },
        "english_stemmer": {
          "type":       "stemmer",
          "language":   "english"
        },
        "english_possessive_stemmer": {
          "type":       "stemmer",
          "language":   "possessive_english"
        }
      },
      "analyzer": {
        "default": {
          "tokenizer": "standard",
           "filter": [
            "english_possessive_stemmer",
            "lowercase",
            "english_stop",
            "english_stemmer"
          ],
          "char_filter": [
            "my_char_filter"
          ]
        }
      },
      "char_filter": {
        "my_char_filter": {
          "type": "pattern_replace",
          "pattern": "(\\d+)-(\\d+)-(\\d+)",
          "replacement": "$1$2$3"
        }
      }
    }
  }
}

english_analyzerchar_filter 를 이용해 커스텀 했다.

Language analyzers | Elasticsearch Guide [8.5] | Elastic

Mapping character filter | Elasticsearch Guide [8.5] | Elastic




인덱스에 데이터 bulk 하기

많은 양의 데이터를 한 번에 밀어 넣기 위해 bulk API 를 사용한다.

Bulk API | Elasticsearch Guide [8.5] | Elastic

이번엔 포스트맨이 아닌 스크립트를 이용해 API 를 호출한다. (인덱스에 저장할 id 를 따로 지정해줘야하기 때문에 스크립트를 사용했고, 그냥 한 개를 입력할 것이라면 포스트맨으로 보내도 된다.)

  1. npm i @elastic/elasticsearch

  2. list api 를 호출해서 받은 데이터를 list.json 으로 저장한다.

  3. 스크립트에서 list.json 을 import 해서 bulk 데이터로 넣어준다.

  4. 아래 스크립트를 만들고 실행한다.

// bulk.js
const accounts = require("./account.json");
const { Client } = require("@elastic/elasticsearch");

const client = new Client({
  node: "요청보낼 es url 입력하면 됩니다. (http, port 포함)",
  maxRetries: 3,
  auth: {
    apiKey: "security 가 설정되어 있다면 es api key 를 넣어주시면 됩니다.",
  },
});

const bulk = async (index, data) => {
  const operations = data.flatMap((doc) => [
    { index: { _index: index, _id: doc.id } },
    doc,
  ]);

  await client.bulk({ refresh: true, operations });
};



데이터 검색하기

위에서 bulk 한 데이터를 검색해보자.

포스트맨을 이용해 GET http://es_url:port/생성한_인덱스 에 요청 보내기

  • headers : 로컬이 아닌 경우 Authorization - ApiKey 를 함께 넣어서 요청한다.

  • body

 {
 "query": {
      "bool": {
        "must": [
          {
            "multi_match": {
              "query": "검색하고 싶은 내용",
              "type": "phrase_prefix"
            }
          }
        ]
      }
    }
 }

검색한 내용에 맞는 결과가 반환되면 성공 👏

profile
웹 풀스택에서 백엔드로 진화중 🧚🏻‍♀️

0개의 댓글