Elasticsearch Bulk with Node.js
이번 bulk코드를 작성해보면서 느낀게 엘라스틱서치는 뭔가 정보가 많지 않은 (?) 느낌이다.(공식 문서는 있지만,,,) node.js, JS, TS, mongoDB 등 자료가 되게 많은 거였구나~ 생각이 들었다.
그래서 정리해본 Node.js + Elasticsearch + Bulk
I feel like there isn't much information about Elasticsearch on Google unlike JS, TS, mongoDB etc. So I decided to record what I tried.
BEFORE THAT,
먼저 clinet 연결을 해둔다. first, connect to the client.
const client = new Client({
node: 'http://localhost:9200',
})
bulk operation
const ESBulkResult = await client.bulk({
index: 'bulk_test', // 모두 동일한 인덱스일 경우, if the index all the doc points to is the same
refresh: true,
operations: [
// BULK INDEX
{ // here set _id and _type
'index':
{
// '_index': 'test', // 각기 다른 인덱스라면 개별적으로 적어준다. if the index differ, write individually
'_type': '_doc',
'_id': 1
}
},
{ // document to index
field1: 'one',
field2: 'two',
field3: 'three'
},
// BULK CREATE
{ // here set _id and _type
'create':
{
// '_index': 'test',
'_type': '_doc',
'_id': 2
}
},
{ // document to create
field1: 'hi1',
field2: 'hi2',
field3: 'hi3'
},
// BULK UPDATE
{ // here filter
'update': {
// '_index': 'test',
'_type': '_doc',
'_id': 22
}
},
{ // document to update
'doc': {
field1: 'update1',
field2: 'update2',
field3: 'update3'
}
},
// BULK DELETE
{ // filter
'delete': {
// '_index: 'test',
'_type': '_doc',
'_id': 22
}
}
],
})
나는 모든 bulk 도큐먼트들이 모두 같은 index를 바라보고 있어서 가장 위 레벨에 한번만 적고 개별적인 도큐먼트 안에의 _index 는 사용하지 않았다.
다른 Bulk 들과는 다르게 index, create, update는 {} 두 개의 객체가 연이어 나와야 한다! 처음 코드를 봤을 땐 매우 헷갈렸다. delete는 하나의 객체로만 이루어져 있다.
index와 create는 보면 똑같은 코드로 이루어져 있는데 사실 실행되는 것도 똑같다. 차이점은 아래와 같다.
Since all the documents point to the same index so I just wrote _index at the top level of bulk and deleted the ones in individual docs. Index, create, update need two consecutive objects, the first object is showing whcin index, which type (now type is not used) etc. and the second one has the document to be created, updated. Delete needs only one object which is like a filter.
index vs create
index : 해당 인덱스 안에 똑같은 도큐먼트가 있든 없든 관계없이 무조건 입력이 된다. (suceed)
존재하지 않으면 입력하고, 존재한다면 대체한다. (하지만 propery 몇 개를 수정한다면 update를 쓰는 것이 낫다.)
index API는 scripted updates를 지원하지 않아서 scripts를 사용하고 싶다면 update를 써야 한다.
ES will create a document even though the index has the same document, it won't throw an error. but it will replace the existing one.
create : 해당 인덱스 안에 새로 넣으려하는 도큐먼트가 반드시 없어야 성공한다. 만약 똑같은 도큐먼트가 존재하면 에러를 낸다. (error)
You must ensure that the document doesn't exist yet in your index otherwise the call will fail.
결론 : 어떤 걸 쓰더라도 상관없다. 단지 같은 도큐먼트의 존재여부에 따라 성공/실패가 있다는 점을 제외하고는 큰 불이익? 차이? 는 없다고 한다.
There isn't any disadvantage, but some people prefer using "index" because the call will always succeed.
Elasticsearch 다운 설치 방법
https://blckchainetc.tistory.com/378
Elasticsearch + Node.js insert update delete 방법