만약 이미 생성한 인덱스가 있는데 매핑 정보를 바꾸려 한다면 가장 좋은 방법은 해당 인덱스를 삭제하고 새로 생성하는 것이다. (혹시 모를 인덱스 매핑 오류를 막기 위해 인덱스를 밀고 새로 넣는 게 제일 좋다고 한다.)
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_analyzer
와 char_filter
를 이용해 커스텀 했다.
Language analyzers | Elasticsearch Guide [8.5] | Elastic
Mapping character filter | Elasticsearch Guide [8.5] | Elastic
많은 양의 데이터를 한 번에 밀어 넣기 위해 bulk API 를 사용한다.
Bulk API | Elasticsearch Guide [8.5] | Elastic
이번엔 포스트맨이 아닌 스크립트를 이용해 API 를 호출한다. (인덱스에 저장할 id 를 따로 지정해줘야하기 때문에 스크립트를 사용했고, 그냥 한 개를 입력할 것이라면 포스트맨으로 보내도 된다.)
npm i @elastic/elasticsearch
list api 를 호출해서 받은 데이터를 list.json
으로 저장한다.
스크립트에서 list.json
을 import 해서 bulk 데이터로 넣어준다.
아래 스크립트를 만들고 실행한다.
// 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"
}
}
]
}
}
}
검색한 내용에 맞는 결과가 반환되면 성공 👏