Mặc dù, có rất nhiều bài viết giới thiệu về Full Text Search, Elasticsearch, Elasticsearch trong Rails, cách cài cắm, sử dụng …,trên Viblo cũng như trên Internet mà các bạn có thể dễ dàng tìm kiếm được. Nhưng mình vẫn muốn viết 1 bài về Elasticsearch dưới góc nhìn của mình để cho các bạn mới làm việc với Elasticsearch sẽ có cái nhìn dễ dàng hơn với “công cụ” search nổi tiếng và vô cùng mạnh mẽ này.
Mình xin mạn phép diễn giải theo ý hiểu của mình :v, còn để có định nghĩa chính xác, và đầy đủ nhất các bạn có thể tham khảo trên Google thông qua keyword: “Elasticsearch là gì?” sẽ ra cơ số kết quả nha.
(2) Ví dụ nữa là …, tiếng Việt mình đi, bạn có từ khóa có dấu là “Sơn Tùng”, mà lại gõ “Son Tung” thì truy vấn LIKE là sẽ không trả về được kết qủa đó (như thế là hỏng rồi, tìm Sếp mà mãi không ra ), nhưng cái này ES làm được nha
(3) Về Perfomance thì ES sẽ là tốt hơn, truy vấn LIKE sẽ tìm kiếm đơn thuần toàn văn bản không sử dụng index
, nghĩa là tập dữ liệu càng lớn thì tìm kiếm càng lâu, trong khi ES lại “đánh index” cho các trường được chọn để tìm kiếm, cái này thì hồi sau đến đoạn Demo mình nó rõ hơn còn giờ các bạn cứ tạm công nhận như vậy đi (lol)
Elasticsearch là 1 server riêng biệt để “phục vụ” việc tìm kiếm dữ liệu. Hiểu đơn giản thì là như thế này:
(2) Reindex Data & Push Data lên Server ES
(3) Get Data từ server ES về
Mapping là quá trình định nghĩa làm thế nào một document và các fields của nó được lưu trữ và đánh index. Cụ thể sử dụng mapping để định nghĩa:
Ví dụ:
Tạo Mapping là phần đầu tiên cũng là phần quan trọng nhất trong quá trình xây dựng lên base ES, nên các bạn chú ý tổ chức Mapping sao cho hợp lý và tối ưu nhất
Quá trình này gồm 2 phần đánh Index và đẩy dữ liệu lên ES
inverted index
. Cái này thì hơi trừu tượng 1 chút, hiểu đơn giản thì dữ liệu là 1 quyển sách, để tìm kiếm nhanh thì người ta sinh ra 1 cái là mục lục đánh dấu các content, thì cách mục lục bản chất giống như việc đánh index vậy.
1
2
3
4
5
|
Title (A1) = "Hello World"
Question (A2) = "What is the World"
Answer (A3) = "Hello Baby"<code class=" language-none">
|
1
2
3
4
5
6
7
8
|
"Hello" => {A1, A3}
"World" => {A1, A2}
"What" => {A2}
"is" => {A2}
"the" => {A2}
"Baby" => {A3}
|
Tokenize
là bài toán quan trọng trong thuật toán tìm kiếm của ES, trong đó có 2 kỹ thuật cơ bản:(1) N-Gram Morphological Analysis: là kỹ thuật chia các chuỗi to thành các chuỗi con theo trọng số với độ dài N, N = (1..3), ví dụ N = 2, khi tách chuối “HELLO WORLD” ta sẽ được các term như sau
1
2
3
|
"HELLO WORLD" => {"HE", "EL", "LL", "LO", "O ", " W", "WO", "OR", "RL", "LD"}
|
1
2
3
|
"HELLO WORLD" => {"HELLO", "WORLD"}
|
Searchkick
Searchkick
rất đơn giản, ví dụ ta cần đẩy bảng Faq lên server ES thì đơn giản làm như sau:
1
2
3
|
Faq.reindex<code class=" language-none">
|
reindex
là method được gem Searchkick define hỗ trợ cho việc push data lên server ES. Để tìm hiểu hơn về kỹ thuật này các bạn có thể tham khảo tại đây.Sau khi dữ liệu đã có trên ES, chúng ta phải lấy về để dùng, giống như SQL bình thường, khi muốn lấy data về chúng ta phải sử dụng các lệnh SQL kiểu như Select
… thì bên ES cũng define kiểu query của riêng họ, được gọi là query DSL. Về cơ bản thì query này sẽ tạo 1 request với format nhất định và gửi request này lên server ES (cổng 9200) để get dữ liệu về. Sẽ kiểu như thế này
1
2
3
|
Faquestion Search (11.6ms) curl http://localhost:9200/faquestions_development/_search?pretty -H 'Content-Type: application/json' -d '{"query":{"bool":{"must":[],"filter":[{"term":{"field_id":1}}],"must_not":{"exists":{"field":"deleted_at"}}}},"size":10000,"from":0,"highlight":{"fields":{"title.analyzed":{},"question.analyzed":{},"answer.analyzed":{}}}}'
|
Xây dựng query dsl là 1 phần quan trọng không kém với việc xây dựng mapping mà phía đầu mình có nói đến, để nói sâu hơn về query này và các kiểu query thông thường từ cơ bản đến nâng cao mình sẽ đề cập thêm khi Implement ES với 1 ứng dụng Rails ở phần tới.
Trên đây là 1 cách giới thiệu về ES theo góc nhìn và kinh nghiệm của mình, hy vọng cách nhìn nhận vấn đề này sẽ ít nhiều mang lại sự đơn giản cho các bạn khi mới tiếp cận làm việc với ES. Trong phần tới mình sẽ đi sâu hơn về việc triển khai ES trong 1 ứng dụng Rails cụ thể (từ việc cài cắm Server Elasticsearch ở local, xây dựng Mapping, đánh Index data và query lấy dữ liệu về …)
Nguồn: Sưu tầm từ internet via Viblo