Chia sẻ cách index dữ liệu từ SQL qua Elasticsearch nhanh nhất, khi dữ liệu lớn và thời gian index không có nhiều.
Khi dữ liệu cần index lên Elasticsearch (ES) nhiều, thời gian xử lý sẽ rất lâu, ngoài các gợi ý được đưa ra ở đây:
Bài viết này sẽ chia sẻ 1 cách để đẩy nhanh quá trình bulk insert vào Elasticsearch. Dưới đây là các bước tiến hành.
Bước 1: Chuẩn bị dữ liệu cần Index lên Elasticsearch. Chú ý: Dữ liệu cần chuẩn cả viết hoa/ viết thường (case sensitive). Với các bạn dùng NEST hoặc Elasticseach.NET thì thường không quan tâm đến vấn đề này vì các thư viện trên đã chuẩn hóa tên trường trước khi đẩy vào ES.
Bước 2: Mở command và chạy dòng lệnh sau:
BCP "SELECT CONCAT('{ \"index\" : { \"_index\" : \"index_name\" } }',CHAR(13),CHAR(10),[dbo].[Table].Field) FROM [dbo].[Table]" queryout C:\sqloutput.txt -c -S sql_server_address -d database_name -U user_name -P user_password
Chú ý: thay các tham số: sql_sever_address, database_name, user_name, user_password bằng thông tin kết nối đến CSDL MSSQL của bạn.
Nếu đúng, 1 file có tên sqloutput.txt sẽ sinh ra ở thư mục chỉ định, trong câu lệnh sẽ là: C:\sqloutput.txt
Bước 3: Với windows, sẽ cần cài thêm git (để sử dụng bash linux, sau đây có 1 số lệnh chỉ chạy trên bash). Có thể bỏ qua.
Bước 4: Mở Git bash tại thư mục chứa file sqloutput.txt (Với windows bạn chuột phải vào thư mục và chọn: Git bash here)
#!/bin/sh
LINES=10000
split -l $LINES sqloutput.txt
for xf in $(ls | grep x..$)
do
curl -o log.txt --progress-bar -H 'Content-Type: application/x-ndjson' -XPOST localhost:9200/_bulk --data-binary @$xf --dump-header @"dumpHeader.txt"
rm $xf
done
Nếu đúng sẽ sinh ra nhiều file tên ngẫu nhiên, mỗi file này ứng với 10000 lines cấu hình phía trên, bạn có thể tăng/giảm con số này cho phù hợp.
Sau khi dữ liệu được đẩy vào Elasticsearch thành công thì các file này sẽ được tự động xóa đi.
Chú ý: Trong quá trình thao tác nếu có lỗi, bạn kiểm tra ở 2 file dumpHeader.txt & log.txt
Chúc các bạn thành công. Nếu có thắc mắc hoặc phương pháp nào nhanh hơn nữa thì hãy chia sẻ nhé!