29/07/2019, 10:09

Tips sử dụng elasticsearch | Một vài lưu ý

Cùng xem qua những tips sử dụng Elasticsearch vô cùng bổ ích trong bài hôm nay nhé. Có thể bạn sẽ cần tìm hiểu thêm Elasticsearch là gì để tiếp tục đọc bài này nhé. Cùng bắt đầu nào! Muốn nâng cao trình độ lập trình đừng bỏ qua những tips này! 8 tips giúp tăng ...

tips sử dụng elasticsearch

Cùng xem qua những tips sử dụng Elasticsearch vô cùng bổ ích trong bài hôm nay nhé.

Có thể bạn sẽ cần tìm hiểu thêm Elasticsearch là gì để tiếp tục đọc bài này nhé.

Cùng bắt đầu nào!

  Muốn nâng cao trình độ lập trình đừng bỏ qua những tips này!
  8 tips giúp tăng hiệu suất làm việc với Github

Chú ý khi sử dụng analyzer

Có lẽ khi làm việc với elasticsearch chúng ta đều đã ít nhiều từng nghe về analyzer. Đây có thể được hiểu như là một công cụ của elasticsearch trong việc bẻ từ và cấu trúc dữ liệu giúp cho việc tìm kiếm text, khi chúng ta làm việc với text dưới các ngôn ngữ các khau.

Elasticsearch có hỗ trợ sẵn khá nhiều analyzer cho các ngôn ngữ khác nhau. Tuy nhiên với tiếng việt thì chúng ta cần phải cài thêm plugin mới sử dụng được (vi_analyzer của anh duy đỗ).

Mỗi analyzer bao gồm:

  • 0 hoặc nhiều CharFilters
  • 1 Tokenizer
  • 0 hoặc nhiều TokenFilters

Chi tiết về các loại analyzer các bạn có thể tham khảo thêm tại đây.

Điều cần chú ý ở đây là mặc định elasticsearch sử dụng standard analyzer để phân tích text. Mọi thứ đều sẽ ổn cho đến khi giá trị search của bjan có chứa một và kí tự đặc biệt ví dụ như “C#”.

Standard analyzer sẽ loại bỏ ký tự “#” (và một số ký tự đặc biệt khác). Điều đó dẫn đến việc kết quả trà về của bạn sẽ khồng được như momg muốn. Giải pháp cho vấn đề này là tự tạo một analyzer của riêng mình.

Ví dụ như:

Config cần chú ý ở đây là token_chars: Các lớp ký tự nên chứa trong một token, với giá trị “symbol” thì khi phân tích text elasticsearch sẽ không loại bỏ kí tự đặc biệt ( ví dụ kí tự “#”) nữa.

Hoặc đơn giản hơn hãy sử dụng tokenizer whitespace nếu bạn cần tìm kiếm theo từ chứ không phải theo từng chữ.

Chú ý về maximum result elasticsearch

Trong thực tế, sau khi search bằng elasticsearch, kết quả trả về thường sẽ được phân trang. Để hỗ trợ cho việc phân trang elasticsearch cung cấp cho chúng ta from/size.

Tham số from xác định phần bù từ kết quả đầu tiên bạn muốn tìm nạp. Tham số size cho phép bạn định cấu hình số lần truy cập tối đa được trả về. Mặc dù from và size có thể được đặt làm tham số yêu cầu, chúng cũng có thể được đặt trong body search. From có giá trị mặc định là 0 và size mặc định là 10.

Lưu ý rằng from + size không thể lớn hơn index.max_result_window mặc định là 10.000. Điều này có thể hiểu đơn giản là kết qura sau khi search trả về mặc định sẽ nhỏ hơn hoặc bằng 10000.

Vấn đề xảy ra khi chúng ta muốn lấy về tất cả kết quả của việc search và số lượng kết quả lại lớn hơn có số 10000.

Để giải quyết vấn đề này có 3 cách:

  • Cách đơn giản nhất là thay đổi index.max_result_window. Nhưng có thể thấy cách này khá là cứng chúng ta có thể set index.max_result_window lên 20000, 30000… Nhưng có trời mới biết được biết đâu có 1 ngày kết quả trả về còn lớn hơn con số chúng ta cấu hình. Ngoài ra thì khi kết quả trả về quá lớn, quá trình sắp xếp có thể thực sự trở nên rất nặng nề, sử dụng lượng lớn CPU, bộ nhớ và băng thông. Vậy nên theo mình nên bỏ qua cách này (trừ trường hợp cần fix nhanh). có 2 cách được khuyến nghị nên sử dụng từ trang chủ của elasticsearch đó là Scroll và Search after.
  • Cách 2 sử dụng Scroll API: Để truy xuất một lượng dữ liệu lớn 1 cách hiệu quả thì chúng ta nên dùng Scroll Api, nó giống như cách bạn sử dụng con trỏ trên cơ sở dữ liệu truyền thống. Để sử dụng Scroll, bạn sẽ chỉ định tham số scroll trong chuỗi truy vấn để cho Elasticsearch biết nó nên giữ “ngữ cảnh tìm kiếm” trong bao lâu. Ví dụ: scroll=1 phút.

Kết quả từ yêu cầu trên bao gồm:

_scroll_id: DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ==.

Nó được chuyển đến API scroll để truy xuất lô kết quả tiếp theo.

Khi ban sử dụng Scroll Api thì bạn sẽ phải loại bỏ đi tham số FROM , tham số SIZE cho phép bạn định cấu hình số lần truy cập tối đa được trả về với mỗi lô kết quả. Mỗi cuộc gọi đến API scroll sẽ trả về lô kết quả như vậy với 1 _scroll_id mới cho đến khi không còn kết quả nào để trả lại, tức là mảng truy cập trống.

  • Cách 3 sử dụng Search After: ý tưởng vẫ nlaf sử dụng 1 con trỏ để lấy ra kết quả ở trang sau từ trang trước. nhưng ở đây là một con trỏ trực tiếp (có thể sử dụng một trường giá trị unique để làm việc này). Ví dụ dưới đây mình sử dụng code ruby khi muốn lấy ra hết tất các Product thỏa mãn điều kiện name là samsung:

Như đoạn code trên khi số lượng kết quả trả về nhỏ hơn 10000 thì sẽ tiếp tục query một lần nữa và bỏ qua những kết quả đã search đc từ lần trc đó cuối cùng ta sẽ đc mảng tất cả nhưng kết quả thỏa mãn điều kiện.

Kết luận

Trên đây là một số tips sử dụng elasticsearch mà mình tổng hợp được. Cảm ơn các bạn đã theo dõi bài viết.

Tham khảo: https://discuss.elastic.co/

Có thể bạn quan tâm:

  • Elasticsearch là gì? Tìm hiểu về Elasticsearch
  • So sánh các nền tảng tìm kiếm mã nguồn mở Elasticsearch, SOLR và SPHINX
  • Đồ nghề không thể thiếu của Coder

Xem thêm việc làm Software Developers trên TopDev

TopDev via viblo.asia

  25 Tips cho React Native lập trình viên phải biết
  Coding Tip: Thử code mà không dùng IF
0