+4

Bắt đầu vời Elasticsearch và nodejs Phần 1

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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí