Bắt đầu vời Elasticsearch và nodejs Phần 1
Bài đăng này đã không được cập nhật trong 5 năm
Trong bài nay, chúng ta sẽ sử dụng Nodejs để kết nối vời Elasticsearch, đánh index và thực hiện tìm kiếm văn bản đơn giản
Khởi tạo môi trường Node
Đầu tiên cài đặt Node và Npm Bạn cần npm và cài đặt hai thư viện dưới đây:
- elasticseach
- get-json câu lệnh cài đặt
npm install elasticsearch get-json
Cấu hình Nodejs với Elasticsearch
Ta tạo file connection.js
để kết nối với Elasticsearch, thay đổi username, password, server và port với Elascticsearch deployment của bạn
var elasticsearch=require('elasticsearch');
var client = new elasticsearch.Client( {
hosts: [
'https://[username]:[password]@[server]:[port]/',
'https://[username]:[password]@[server]:[port]/'
]
});
module.exports = client;
Chúng ta kiểm tra kết nối đến server elasticsearch bằng cách tạo file info.js
var client = require('./connection.js');
client.cluster.health({},function(err,resp,status) {
console.log("-- Client Health --",resp);
});
Sau đó ở terminal, chạy câu lệnh sau:
node info
Kết quả trả về trông giống:
-- Client Health -- { cluster_name: 'el-petitions',
status: 'green',
timed_out: false,
number_of_nodes: 3,
number_of_data_nodes: 3,
active_primary_shards: 0,
active_shards: 0,
relocating_shards: 0,
initializing_shards: 0,
unassigned_shards: 0,
delayed_unassigned_shards: 0,
number_of_pending_tasks: 0,
number_of_in_flight_fetch: 0 }
Indexing
Tiếp theo là tạo index gov
, và chúng tạo 2 kiểu dữ liệu là 'constituencies' and 'petitions'
Tạo file create.js
var client = require('./connection.js');
client.indices.create({
index: 'gov'
},function(err,resp,status) {
if(err) {
console.log(err);
}
else {
console.log("create",resp);
}
});
Lưu vào chạy kết quả thu được
create { acknowledged: true }
Để xóa một index chúng ta tạo file delete.js
:
var client = require('./connection.js');
client.indices.delete({index: 'gov'},function(err,resp,status) {
console.log("delete",resp);
});
khi chúng ta chạy thì kết quả như sau:
delete { acknowledged: true }
Bây giờ đã có một chỉ mục, chúng ta cần một vài dữ liệu để thử nghiệm nó. Trước khi chúng ta kết nối vời dataset, thì hãy tạo vài dữ liệu đơn giản,
tạo file document_add.js
và lưu:
var client = require('./connection.js');
client.index({
index: 'gov',
id: '1',
type: 'constituencies',
body: {
"ConstituencyName": "Ipswich",
"ConstituencyID": "E14000761",
"ConstituencyType": "Borough",
"Electorate": 74499,
"ValidVotes": 48694,
}
},function(err,resp,status) {
console.log(resp);
});
Khi chạy file, thì elasticsearch sẽ add 1 index với dữ liệu ở body và kết quả trả về:
{ _index: 'gov',
_type: 'constituencies',
_id: '1',
_version: 1,
created: true }
Chạy lại thì kết quả:
...
_version: 2,
created:false
...
Chúng ta có 1 document với id 1, elasticsearch sẽ coi đây là version mới của tài liệu
Tiếp đến là chúng ta sẽ kiểm tra có bao nhiêu document trong index của chúng ta
thêm vào trong info.js
client.count({index: 'gov',type: 'constituencies'},function(err,resp,status) {
console.log("constituencies",resp);
});
Khi chạy file info.js
ta thấy kết quả hiển thị trên màn hình
chúng ta dễ dàng xóa bỏ index. Tạo một file document_del.js và add:
var client = require('./connection.js');
client.delete({
index: 'gov',
id: '1',
type: 'constituencies'
},function(err,resp,status) {
console.log(resp);
});
Khi chạy file thì kết quả hiển thị trên màn hình:
{ found: true,
_index: 'gov',
_type: 'constituencies',
_id: '1',
_version: 3 }
Khi chạy lại file info.js
thì kết quả sẽ trở về 0
Khi chúng ta muốn thêm nhiều dữ liệu cùng 1 thời điểm thì chúng ta sử dụng bulk
method trong Elasticsearch:
ví dụ:
var myBody = { index: {_index: 'gov', _type: 'constituencies', _id: '1' } },
{
"ConstituencyName": "Ipswich",
"ConstituencyID": "E14000761",
"ConstituencyType": "Borough"
...
}
client.bulk({
index: 'gov',
type: 'constituencies',
body: myBody
};
Tìm kiếm
Rõ ràng mục tiêu cuối cùng của elasticsearch là đánh index và tìm kiếm.
Tạo file search.js
:
var client = require('./connection.js');
client.search({
index: 'gov',
type: 'constituencies',
body: {
query: {
match: { "constituencyname": "Harwich" }
},
}
},function (error, response,status) {
if (error){
console.log("search error: "+error)
}
else {
console.log("--- Response ---");
console.log(response);
console.log("--- Hits ---");
response.hits.hits.forEach(function(hit){
console.log(hit);
})
}
});
tham khảo: getting-started-with-elasticsearch-and-node
All rights reserved