Ngoài ra các Website lớn trên thế giới như eBay [1], Vimeo [2] đã sử dụng ElasticSearch vào việc phát triển hệ thống tìm kiếm của mình, và về lĩnh vực y tế - sức khỏe UCLA Health [3] đã
Trang 1ỨNG DỤNG MÃ NGUỒN MỞ ELASTICSEARCH VÀO
HỆ THỐNG TÌM KIẾM DANH BẠ Y TẾ HIỆU QUẢ
LUẬN VĂN THẠC SĨ NGÀNH MÁY TÍNH
Trang 2BỘ GIÁO DỤC VIỆN HÀN LÂM
VÀ ĐÀO TẠO KHOA HỌC VÀ CÔNG NGHỆ VN
HỌC VIỆN KHOA HỌC VÀ CÔNG NGHỆ
Nguyễn Văn Thìn
ỨNG DỤNG MÃ NGUỒN MỞ ELASTICSEARCH VÀO HỆ
THỐNG TÌM KIẾM DANH BẠ Y TẾ HIỆU QUẢ
Chuyên ngành : Hệ Thống Thông Tin
Mã số : 8480104
LUẬN VĂN THẠC SĨ NGÀNH MÁY TÍNH
NGƯỜI HƯỚNG DẪN KHOA HỌC: TS TRẦN TRỌNG TOÀN
Thành phố Hồ Chí Minh – 2021
Trang 3LỜI CAM ĐOAN
Tôi cam đoan luận văn “Ứng dụng mã nguồn mở ElasticSearch vào hệ thống tìm kiếm danh bạ y tế hiệu quả” là công trình nghiên cứu của riêng tôi dưới sự hướng dẫn của Thầy TS Trần Trọng Toàn Sự gần gũi và nhiệt tình hướng dẫn của thầy là nguồn động lực rất lớn đối với tôi trong suốt thời gian thực hiện
Các số liệu, kết quả nêu trong luận văn là trung thực và chưa từng được ai công bố trong bất kỳ công trình nào khác
Thành phố Hồ Chí Minh, ngày tháng năm 2021
Học viên thực hiện
Nguyễn Văn Thìn
Trang 4LỜI CẢM ƠN
Tôi xin gửi lời cảm ơn sâu sắc đến thầy TS Trần Trọng Toàn đã tận tình hướng dẫn
và giúp đỡ tôi trong suốt quá trình thực hiện luận văn
Cảm ơn quý thầy cô Khoa Công Nghệ Thông Tin và Viễn Thông, cũng như các Thầy
Cô của Học Viện Khoa học và Công Nghệ, quý thầy cô tham gia giảng dạy và truyền đạt kiến thức cho bản thân tôi trong suốt khóa học 2018 – 2020
Cho phép tôi gửi lời cảm ơn tới các bạn, đồng nghiệp đã thường xuyên quan tâm, giúp đỡ, chia sẽ kinh nghiệm trong suốt thời gian học tập, nghiên cứu tại Học viện cũng như trong suốt quá trình thực hiện luận văn
Tôi xin bày tỏ sự biết ơn sâu sắc đến cha, mẹ, vợ, những người thân trong gia đình đã luôn ở bên tôi, động viên, dành cho tôi những gì tốt đẹp nhất trong suốt quá trình thực hiện luận văn này
Cuối cùng tôi xin chân thành cảm ơn Công ty Cổ phần MediHub đã tạo điều kiện giúp tôi thực hiện tốt luận văn
Trân trọng cảm ơn!
Trang 5
MỤC LỤC
LỜI CAM ĐOAN i
LỜI CẢM ƠN ii
MỤC LỤC iii
DANH MỤC VIẾT TẮT iv
DANH MỤC CÁC BẢNG vi
DANH MỤC CÁC HÌNH MINH HỌA vii
MỞ ĐẦU 1
CHƯƠNG 1 - TỔNG QUAN VỀ HỆ THỐNG TÌM KIẾM THÔNG TIN 4
1.1 Khái niệm về tìm kiếm thông tin 4
1.2 Khái niệm về hệ thống tìm kiếm thông tin 6
1.2.1 Khái niệm về hệ thống tìm kiếm thông tin 6
1.2.2 Các bộ phận cấu thành hệ thống tìm kiếm thông tin 6
CHƯƠNG 2 - GIỚI THIỆU BÀI TOÁN VÀ LỰA CHỌN CÔNG NGHỆ 9
2.1 Giới thiệu bài toán 9
2.2 Phương pháp giải quyết 9
2.3 Tổng quan ElasticSearch 10
2.3.1 Khái niệm về ElasticSearch 10
2.3.2 Các khái niệm cần biết trong ElasticSearch 13
2.3.3 Analyzers và mô hình truy hồi thông tin của ElasticSearch 21
2.3.4 Query DSL (domain- Specific Language) trong ElasticSearch 29
2.3.5 Mô hình truy hồi thông tin của ElasticSearch 36
CHƯƠNG 3 THỰC NGHIỆM XÂY DỰNG WEBSITE TÌM KIẾM DANH BẠ Y TẾ 45
3.1 Phân tích 45
3.2 Thiết kế 46
3.3 Cài đặt 55
3.4 Giao diện 55
Trang 63.4.1 Giao diện cho người sử dụng 55
3.4.2 Giao diện cho người quản trị 64
3.5 Đánh giá và thử nghiệm 66
3.5.1 Mô hình kiến trúc ứng dụng thử nghiệm 66
3.5.2 Kịch bản và kết quả 67
3.5.3 Đánh giá kết quả nghiên cứu 70
CHƯƠNG 4 KẾT LUẬN 72
DANH MỤC TÀI LIỆU THAM KHẢO 73
Trang 7DANH MỤC CÁC THUẬT NGỮ, CHỮ VIẾT TẮT
RESTful API Một tiêu chuẩn trong việc thiết kế API
Unicast
là 1 thuật ngữ được sử dụng trong mạng máy tính
để mô tả cách thức truyền tin được gửi từ 1 điểm đến 1 điểm khác
Trang 8DANH MỤC CÁC BẢNG
Bảng 1: Số liệu mapping các từ khóa 53 Bảng 2: Kịch bản tìm kiếm 68
Trang 9DANH MỤC CÁC HÌNH MINH HỌA
Hình 1: Lịch sử hình thành công ty ElasticSearch 10
Hình 2: Các tập đoàn sử dụng ElasticSearch 11
Hình 3: Các đối thủ của ElasticSearch 11
Hình 4: Bảng so sánh các dịch vụ 12
Hình 5: Hệ thống phân tán của ElasticSearch 13
Hình 6: Các khái niệm cần biết trong ElasticSearch 13
Hình 7: Index trong ElasticSearch 14
Hình 8: Sharding trong Index 15
Hình 9: Primary Shard và Replica Shard 15
Hình 10: quá trình chuyển dữ liệu 17
Hình 11: Cluster trong ElasticSearch 18
Hình 12: Ví dụ về sơ đồ cơ sở dữ liệu của Mapping 19
Hình 13: Analyzer trong ElasticSearch 21
Hình 14: Kết quả tìm kiếm Match all query 30
Hình 15: Kết quả Match query 30
Hình 16: Kết quả Match query thêm and 31
Hình 17: Kết quả Match phrase query 31
Hình 18: Kết quả Match Phrase Prefix Query 32
Hình 19: Kết quả Multi Match Query 32
Hình 20: Query có các parameters 33
Hình 21: Query với format ngày 33
Hình 22: Wildcard Query 34
Hình 23: Bool Query 34
Hình 24: Fuzzy Query 36
Hình 25: B25M 38
Hình 26: BM25 tiệm cận 40
Hình 27: BM25 với độ dài trung bình 41
Hình 28: Mô hình tìm kiếm văn bản tiếng Việt 46
Hình 29: lược đồ về Analyzer 47
Hình 30: lược đồ cơ sở dữ liệu Danh bạ y tế 53
Hình 31: Mô hình cho người sử dụng 54
Hình 32: giao diện gợi ý khi nhập từ khóa 56
Hình 33: kết quả tìm kiếm có dấu 56
Hình 34: kết quả tìm kiếm tiếng Việt không dấu 57
Trang 10Hình 35: Kết quả tìm kiếm 58
Hình 36: Kết quả theo định vị 59
Hình 37: Tìm kiếm theo chuyên khoa 61
Hình 38 thông tin chi tiết 61
Hình 39: thông tin bản đồ theo địa chỉ của Profile 62
Hình 40: nút lưu profile 62
Hình 41: hỏi đáp 63
Hình 42: Thông tin đã lưu, thích 63
Hình 43: Trang quản trị Admin 64
Hình 44: Cập nhật dữ liệu mới 65
Hình 45: Quản trị tài khoản 65
Hình 46 Kiến trúc Mô hình thử nghiệm 67
Trang 11MỞ ĐẦU
Hiện nay sức khỏe đang là mối quan tâm hàng đầu của nhiều người Ngoài mong muốn được tiếp cận các thông tin sức khỏe chính thống - hữu ích để chăm sóc bản thân và gia đình tốt hơn, nhu cầu tìm kiếm nơi khám chữa bệnh uy tín, bác sĩ giỏi chuyên môn của người dân cũng rất cao Để đáp ứng nhu cầu này thì cần có các công
cụ tìm kiếm nhanh, ngoài hỗ trợ người dân tiếp cận các thông tin cần biết, còn giúp chọn lựa được nơi chăm sóc sức khỏe, bác sĩ tốt nhất thông qua những tính năng tương tác trên các website trực tuyến
Song song đó, cùng với sự phát triển của Internet và điện thoại thông minh cho phép người dùng có thể kết nối mạng ở bất cứ đâu, truy cập hồ sơ bác sĩ/cơ sở khám chữa bệnh một cách dễ dàng để đánh giá, bình luận… điều này giúp tăng độ tin cậy
và chính xác của các thông tin trên Càng ngày, với sự “góp sức” của nhiều người, những thông tin ngày càng được hoàn thiện và thực sự hữu ích cho người dùng sau
Tuy nhiên, trong lĩnh vực y tế, việc phân chia các cơ sở khám chữa bệnh, hồ
sơ bác sĩ về chuyên khoa; dịch vụ khám chữa bệnh, địa chỉ, số điện thoại, thời gian làm việc… sao cho người dùng có thể tìm kiếm một cách dễ dàng – nhanh chóng – chính xác nhất thực sự là vấn đề nan giải Các website về lĩnh vực y tế trong nước như edoctor.io, bacsi247.net … đã có hỗ trợ thông tin tìm kiếm bác sĩ, phòng khám, bệnh viện… tuy nhiên việc tìm kiếm tiếng Việt vẫn là vấn đề nan giải và các website này vẫn chưa đáp ứng được
Gần đây, nhiều thư viện nguồn mở hỗ trợ mạnh việc tìm kiếm thông tin nhanh
như Elastic Search, Solr … Điều đặc biệt hơn cả là việc xuất hiện nhiều mã nguồn
mở xử lý ngôn ngữ tiếng Việt do các kỹ sư CNTT hay các nhà khoa học tại Việt Nam phát triển như underthesea, vn_tokenizer… đã làm cho việc tìm kiếm dữ liệu tiếng Việt ngày càng chính xác hơn
Ngoài ra các Website lớn trên thế giới như eBay [1], Vimeo [2] đã sử dụng
ElasticSearch vào việc phát triển hệ thống tìm kiếm của mình, và về lĩnh vực y tế -
sức khỏe UCLA Health [3] đã sử dụng ElasticSearch vào hệ thống Hồ sơ sức khỏe
điện tử (EHR) để phục vụ cho các Bác sĩ lâm sàng và các nhà nghiên cứu trong việc tìm kiếm bệnh lý, bao gồm ghi chú lâm sàng, kết quả phòng thí nghiệm, văn bản, lịch
sử khám chữa bệnh của bệnh nhân để giúp chẩn đoán bệnh
Trong nước, cũng có khá nhiều tác giả quan tâm nghiên cứu về lĩnh vực tìm kiếm thông tin như “Hỗ trợ Tìm kiếm Thông tin, thuộc lãnh vực CNTT trên Internet qua
Trang 12từ khóa bằng Tiếng Việt” [4], “Phát Triển hệ truy hồi thông tin tiếng Việt dựa trên
mã nguồn mở” [5] Tuy nhiên chúng ta vẫn chưa thấy một hệ thống tìm kiếm nào về danh bạ y tế đáp ứng được nhu cầu của người dân hiện nay, và chúng ta vẫn còn phụ thuộc vào công cụ tìm kiếm Google nên đôi khi phải mất nhiều thời gian mới tìm thấy được những thông tin mà mình cần
Tính cấp thiết của đề tài:
Từ những khó khăn như phân tích ở trên, yêu cầu cấp thiết là xây dựng một hệ thống tìm kiếm Tiếng Việt về danh bạ y tế để giúp người dùng dễ dàng tìm kiếm các thông tin như: hồ sơ bác sĩ, phòng khám, bệnh viện…đồng thời có thể tiếp cận được các thông tin hữu ích về sức khỏe chính thống từ các bác sĩ, chuyên gia y tế, và cũng chính họ là người sẽ tương tác với các tính năng sẵn có của hệ thống như bình luận, đánh giá,… làm tăng độ tin cậy của thông tin cho người dùng sau
Đối tượng và phạm vi nghiên cứu:
Để xây dựng được hệ thống tìm kiếm Tiếng Việt mang tính cấp thiết như đã đề cập ở trên, đối tượng nghiên cứu được chọn là:
Nghiên cứu dữ liệu và thông tin y tế với nguồn dữ liệu từ hệ thống tìm kiếm cơ
sở y tế của công ty MediHub
Nghiên cứu về tìm kiếm thông tin, hệ thống tìm kiếm thông tin và các thành phần cấu tạo
Nghiên cứu mã nguồn mở ElasticSearch để ứng dụng vào việc đánh chỉ mục cho
hệ thống tìm kiếm thông tin
Nghiên cứu Asp.Net Core, C# để xây dựng một hệ thống tìm kiếm thông tin hoàn chỉnh và các tính năng tương tác trên danh bạ y tế
Mục tiêu nghiên cứu:
Để thực hiện thành công, luận văn cần nghiên cứu các nội dung sau:
Nghiên cứu, phân tích, thiết kế và triển khai hệ thống tìm kiếm thông tin về danh
bạ y tế
Nghiên cứu các kỹ thuật về truy hồi thông tin và các công nghệ, nền tảng nổi bậc
về các Search Engine, trong đó trọng tâm nghiên cứu ElasticSearch để xây dựng một ứng dụng tìm kiếm danh bạ y tế
Trang 13Sản phẩm sẽ giúp người dùng dễ dàng tìm kiếm các thông tin, danh bạ y tế mà mình cần và tạo các tính năng tương tính tác trên hệ thống để tăng độ tin cậy cho người dùng sau
Phương pháp nghiên cứu:
Để đạt được mục tiêu đặt ra, luận văn sử dụng các phương pháp sau:
Thu thập, phân tích và chuẩn hóa dữ liệu danh bạ y tế đã có
Đánh giá và chọn lọc các thuật toán, tính năng trong ElasticSearch để làm cho phần tìm kiếm dữ liệu
Phân tích và thiết kế hệ thống Tìm kiếm thông tin, tích hợp ElasticSearch để trả kết quả tìm kiếm Tiếng Việt chính xác hơn, đồng thời cũng xây dựng các tính năng tiện ích giúp người dùng dễ dàng tìm kiếm và tương tác trên Website
Để thực hiện mục tiêu đã đề ra chúng tôi bố cục của luận văn như sau:
Chương 1: Nghiên cứu tổng quan về hệ thống tìm kiếm thông tin, các thành phần và nguyên lý hoạt động của hệ thống tìm kiếm thông tin
Chương 2: Giới thiệu bài toán và lựa chọn công nghệ
Chương 3: Trên cơ sở nghiên cứu về Hệ thống tìm kiếm thông tin và mã nguồn
mở ElasticSearch, tôi đề xuất xây dựng thử nghiệm hệ thống tìm kiếm Danh bạ y tế với hai thành phần chính là: Tạo chỉ mục và Tìm kiếm
Trang 14CHƯƠNG 1 - TỔNG QUAN VỀ HỆ THỐNG TÌM KIẾM
THÔNG TIN
1.1 Khái niệm về tìm kiếm thông tin
Ngày nay sự phát triển mạnh mẽ và phổ biến của công nghệ thông tin, dữ liệu, văn bản có đến hàng tỉ trang website, song song đó, nhu cầu khai thác thông tin này
để phục vụ công việc là nhu cầu cần thiết và cấp bách Bất cứ hệ thống nào sau khi xây dựng đều đòi hỏi có hỗ trợ chức năng tìm kiếm, tuy nhiên đối với việc tìm kiếm nội dung trong văn bản lại là vấn đề lớn Có những công cụ hỗ trợ tìm kiếm thông tin
và hoạt động hiệu quả như Google, Bing, Yahoo, Baidu, Yandex, DuckDuckGo… tuy nhiên, vì đây là những sản phẩm đã được thương mại hóa như bài báo khoa học [6] cũng đã đề cập, nên chúng ta không thể biết được các kỹ thuật triển khai bên dưới cũng như công nghệ ứng dụng của chúng
Sau đây sẽ là định nghĩa về tìm kiếm thông tin của một số tác giả [6]
Khái niệm [6]: Tìm kiếm thông tin (Information Retrieval – IR) là tìm kiếm tài nguyên (thường là các tài liệu - documents) trên một tập lớn các dữ liệu phi cấu trúc (thường là văn bản – text) được lưu trữ trên các máy tính nhằm thỏa mãn nhu cầu về thông tin [6]
Mục đích cuối cùng trong việc tìm kiếm là đưa ra thông tin sao cho đúng với nhu cầu tìm kiếm của người dùng, do đó cần phải có cách lưu trữ thông tin và tổ chức lại dữ liệu sao cho dễ dàng tìm kiếm và truy xuất nhanh và hiệu quả nhất Trong việc tìm kiếm có 2 phần chính:
• Các kỹ thuật để biễu diễn thông tin: bao gồm cách biểu diễn thông tin nào cần thiết cho việc truy vấn (query) từ nhu cầu người dùng, và các thông tin nào được chọn (văn bản, tài liệu)
• Các phương pháp so sánh khi biễu diễn thông tin, nhằm mục đích là
để kiểm tra so sánh tính toán dữ liệu, sao cho cuối cùng kết quả tính toán trả về phải giống với kết quả được mong đợi khi người dùng thực hiện câu truy vấn
Việc đánh giá mức độ xử lý khi trả về kết quả trong việc tìm kiếm thông tin trong một tập tài liệu và câu truy vấn cho tài liệu đó dựa vào các cách sau:
Trang 15• Độ chính xác (Precision): được đo bởi tỉ lệ của tài liệu trả về chính xác trên tổng tài liệu nhận được [6]
Độ chính xác = {tài liệu liên quan} {tài liệu nhận được}{tài liệu nhận được} (1)
• Độ bao phủ (Recall): tỉ lệ tài liệu trả về chính xác trên tổng tài liệu có liên quan [6]
Độ bao phủ = {tài liệu liên quan} {tài liệu nhận được} {tài liệu liên quan} (2)
• Kết quả sai (fall - out): tỉ lệ tài liệu không có liên quan trả về trên tổng tài liệu không liên quan [6]
Kết quả sai = {tài liệu không liên quan} {tài liệu nhận được}
{tài liệu không liên quan} (3)
Ví dụ [6]: trong tập 1000 tài liệu được sử dụng cho tìm kiếm với 200 tài liệu liên quan đến thông tin “tin học”, một hệ thống tìm kiếm thông tin “tin học” trả về được 150 tài liệu, trong đó có 130 tài liệu chính xác Khi đó:
Trang 161.2 Khái niệm về hệ thống tìm kiếm thông tin
1.2.1 Khái niệm về hệ thống tìm kiếm thông tin [7]
Theo Kowalski [8] đã định nghĩa về hệ thống tìm kiếm thông tin như sau:
“Hệ thống truy tìm thông tin là một hệ thống có khả năng lưu trữ, truy tìm và duy trì thông tin Thông tin trong các trường hợp này có thể bao gồm văn bản (bao gồm cả số liệu ngày tháng), hình ảnh, âm thanh, video và những đối tượng đa phương tiện khác.”
Gerard Salton [9, 10]: “Hệ thống tìm kiếm thông tin là một hệ thống thông tin được sử dụng để lưu trữ các mục thông tin cần được xử lý, tìm kiếm, truy xuất và trả
về cho người dùng với các yêu cầu khác nhau Việc truy tìm những thông tin phụ thuộc vào tổ chức thông tin được lưu trữ và các phương pháp tìm kiếm nhanh chóng
từ các yêu cầu, được đánh giá bằng cách so sánh các giá trị của các thuộc tính đối với thông tin được lưu trữ và các yêu cầu về thông tin.”
Do đó ta có thể tóm lại đơn giản hơn: hệ thống tìm kiếm thông tin là một hệ thống thông tin dùng để lưu trữ, xử lý, tìm kiếm và đưa ra các thông tin cho người sử dụng Hệ thống tìm kiếm thông tin thường thao tác các dữ liệu dạng văn bản và không
có giới hạn về nội dung và thông tin trong văn bản
1.2.2 Các bộ phận cấu thành hệ thống tìm kiếm thông tin [7]
1.2.2.1 Bộ phận thu thập thông tin - Robot
Bộ phận thu thập thông tin[11] là một chương trình chạy tự động dùng duyệt qua các cấu trúc siêu liên kết (hyperlink) để đi thu thập tài liệu, và một cách đệ quy
nó sẽ nhận về tài liệu có liên kết với tài liệu này, nó sẽ quét để trích xuất toàn bộ thông tin của website đó từ tiêu đề, hình ảnh đến từ khóa, các liên kết (link) đến trang khác Dữ liệu sẽ được quét theo thứ tự từ trên xuống dưới từ trái qua phải Thực tế,
bộ phận thu thập dữ liệu sẽ có những con Robot thu thập dữ liệu, được gọi là spider, những spider này sẽ truy cập từng trang web, thu thập dữ liệu trên trang đó một cách
âm thầm và nhanh chóng Sau đó nó lấy dữ liệu và lưu trữ các nội dung từ các trang web trên Internet
Bộ phận này có các thành phần chính: một thành phần để theo dõi và phát hiện các URL mới, hoặc các URL đã thay đổi Một thành phần dùng để đọc nội dung tài liệu của tất cả các trang web một cách đệ quy từ một tập các URL đã có, sau đó nó sẽ
Trang 17phân tích tài liệu, trích xuất nội dung tài liệu dưới các định dạng như html, pdf, excel… và lưu trữ về cơ sở dữ liệu thu thập
1997, đi vào hoạt động từ năm 1998 Google hoạt động dựa vào lập trình hệ thống PageRank (bằng sáng chế năm 1998) và là Search Engine hiện đại nhất ngày nay Trung bình, hệ thống PageRank xử lý hơn 3 tỷ truy vấn mỗi ngày, và hàng tỷ thông tin được xử lý, cập nhật vào hệ thống cơ sở dữ liệu của Google Với tốc độ xử lý ưu việt, và luôn phát triển, đổi mới với những thuật toán chống spam, thao túng kết quả tìm kiếm Google luôn mong muốn mang đến những thông tin hữu ích và trải nghiệm tốt nhất cho người dùng trên toàn thế giới
1.2.2.3 Bộ phận tìm kiếm thông tin và Search Engine
Bộ phận này chịu trách nhiệm tìm kiếm các tài liệu từ yêu cầu của người sử dụng, sau đó trả về danh sách các tài liệu chính xác với yêu cầu nhất, do số lượng các trang web rất lớn và thông thường người dùng chỉ đưa đưa vào một vài từ khóa trong câu truy vấn nên tập kết quả thường rất lớn Tiền xử lý khoá tìm kiếm, thực hiện phân tích từ khoá tìm kiếm, xử lý các toán tử tìm kiếm cơ bản (AND, OR, NOT, ), xử lý tìm kiếm chính xác và xây dựng câu truy vấn dữ liệu Vì vậy bộ xếp hạng (Ranking)
có nhiệm vụ sắp xếp các tài liệu này theo mức độ hợp lệ với yêu cầu tìm kiếm và hiển thị kết quả cho người sử dụng [5]
Search Engine là cụm từ dùng chỉ toàn bộ hệ thống bao gồm bộ thu thập thông tin, bộ lập chỉ mục và bộ tìm kiếm thông tin [13] Các bộ phận này hoạt động liên tục
từ lúc khởi động hệ thống, chúng phụ thuộc lẫn nhau về mặt dữ liệu nhưng độc lập với nhau về mặt hoạt động
Nguyên lý hoạt động của Search Engine:
Search Engine điều khiển các robot đi thu thập thông tin trên mạng thông qua các siêu liên kết (hyperlink) Khi các robot phát hiện ra một website mới, nó gởi tài liệu (nội dung trong web page) về cho máy chủ (Server) chính để tạo cơ sở dữ liệu
Trang 18chỉ mục phục vụ cho nhu cầu tìm kiếm thông tin [12, 13] Bởi vì thông tin trên mạng luôn thay đổi nên các robot phải liên tục cập nhật các website cũ Mật độ cập nhật phụ thuộc vào từng hệ thống Search Engine về cách cấu hình thời gian cập nhật Khi Search Engine nhận câu truy vấn từ người dùng, nó sẽ tiến hành phân tích, tìm trong
cơ sở dữ liệu chỉ mục và trả về những tài liệu thoả yêu cầu
Trang 19CHƯƠNG 2 - GIỚI THIỆU BÀI TOÁN VÀ LỰA CHỌN
CÔNG NGHỆ
2.1 Giới thiệu bài toán
Từ những khó khăn trong việc tìm kiếm tiếng Việt đã được nêu ở phần mở đầu, cũng như việc tạo ra một hệ thống tìm kiếm thông tin về lĩnh vực y tế để đáp
ứng các nhu cầu tìm kiếm của người dùng Bài toán: “Ứng dụng mã nguồn mở
ElasticSearch vào hệ thống tìm kiếm danh bạ y tế hiệu quả” sẽ giải quyết các vấn
đề sau:
- Xây dựng một hệ thống tìm kiếm Tiếng Việt về danh bạ y tế để giúp người dùng dễ dàng tìm kiếm các thông tin như: hồ sơ bác sĩ, phòng khám, bệnh viện…
- Đồng thời người dùng có thể tiếp cận được các thông tin hữu ích về sức khỏe chính thống từ các bác sĩ, chuyên gia y tế, và cũng chính họ là người
sẽ tương tác với các tính năng sẵn có của hệ thống như bình luận, đánh giá,…
- Tăng độ tin cậy của thông tin cho người dùng sau
Luận văn sử dụngthư viện mã nguồn mở ElasticSearch cho phần lập chỉ mục
và tìm kiếm, kết hợp với ngôn ngữ lập trình Web như Asp.Net Core để xây dựng một
hệ thống tìm kiếm thông tin
2.2 Phương pháp giải quyết
Để giải quyết được bài toán đã nêu bên trên, chúng tôi đã lựa chọn các phương pháp sau:
- Sử dụng mã nguồn mở ElasticSearch cho việc đánh lập chỉ mục
- Nghiên cứu tổng quan về ElasticSearch và kiến trúc của nó để cài đặt và cấu hình hệ thống phù hợp
- Nghiên cứu Plugin “Vietnamese Analysis Plugin for Elasticsearch” của tác giả Duy Đỗ [14] để phân tích và tìm kiếm với dữ liệu text là tiếng Việt Trong plugin tác giả cũng đã kế thừa và sử dụng lại bộ công cụ tách từ tiếng Việt “Lê Hồng Phương”, công cụ này sử dụng từ điển và ngram, trong
đó mô hình ngram được huấn luyện để sử dụng treebank tiếng Việt với độ chính xác 97% [15]
Trang 20- Nghiên cứu về Analyzer và mô hình truy hồi thông tin của ElasticSearch,
sử dụng các Analyzer có sẵn của ElasticSearch hoặc tạo ra các analyzer mới để tách từ và cấu trúc lại dữ liệu phục vụ cho việc tìm kiếm nhanh và hiệu quả hơn Ngoài ra tài liệu [16] cũng đã đề cập sử dụng Analyzer của ElasticSearch cho việc truy vấn mở rộng (Query Expansion) cũng như tìm kiếm theo ngữ nghĩa (semantic search)
- Nghiên cứu về các loại truy vấn trong ElasticSearch để lựa chọn các loại truy vấn phù hợp cho việc tìm kiếm dữ liệu
- Nghiên cứu về truy vấn Geo_Point và cách tổ chức dữ liệu để phục vụ cho việc tìm kiếm dữ liệu theo tọa độ và đưa ra các kết quả tìm kiếm gần với
vị trí người dùng
2.3 Tổng quan ElasticSearch
Trong phần này sẽ trình bày tổng quan về mã nguồn mở ElasticSeach và các tính năng của ElasticSeach dựa trên các tài liệu [17, 18, 19]
2.3.1 Khái niệm về ElasticSearch
ElasticSearch là một công cụ tìm kiếm (Search Engine) dựa trên nền tảng Apache Lucene Nó cung cấp một bộ máy tìm kiếm dạng phân tán, có đầy đủ công cụ với một giao diện web HTTP có hỗ trợ dữ liệu JSON ElasticSearch được phát triển bằng Java và được phát hành dạng nguồn mở theo giấy phép Apache
Tiền thân của ElasticSearch là Compas được Shay Banon tạo ra vào 2004 và đến 2/2010 Shay Banon cho ra phiên bản đầu tiên Công ty Elasticsearch được thành lập vào năm 2012 và vào tháng 5 năm 2015 thì đổi tên thành công ty Elastic
Hình 1: Lịch sử hình thành công ty ElasticSearch
Trang 21Các tập đoàn đang dùng ElasticSearch:
Hình 2: Các tập đoàn sử dụng ElasticSearch
Các đối thủ hiện nay:
Hình 3: Các đối thủ của ElasticSearch
Trang 22• ElasticSearch là một hệ thống phân tán và có khả năng mở rộng theo chiều ngang (Horizontal scalability) rất tốt Nếu ta chỉ cần tăng thêm số lượng nút (node) cho nó là nó tự động mở rộng cho hệ thống của mình.
Trang 23Hình 5: Hệ thống phân tán của ElasticSearch
• Dễ dàng khởi động và chạy
2.3.2 Các khái niệm cần biết trong ElasticSearch
Hình 6: Các khái niệm cần biết trong ElasticSearch
2.3.2.1 Document (tài liệu)
Document (tài liệu) là một đối tượng dạng JSON với một số dữ liệu Đây là đơn vị nhỏ nhất để lưu trữ dữ liệu trong ElasticSearch Document giống như row của table trong cơ sở dữ liệu quan hệ
Trang 242.3.2.2 Index (Chỉ mục)
Hình 7: Index trong ElasticSearch [19]
Index ở đây không phải là chỉ số mà là một tập hợp các document, nó tương đương với khái niệm một cơ sở dữ liệu Trong ElasticSearch, sử dụng một cấu trúc
được gọi là inverted index Nó được thiết kế để cho phép tìm kiếm full-text search
2.3.2.3 Shard - Phân đoạn
• Shard (phân đoạn) là đối tượng của Lucene, là tập con các document của 1 Index Một Index có thể được chia thành nhiều Shard
• Mỗi Node bao gồm nhiều Shard Chính vì thế Shard mà là đối tượng nhỏ nhất, hoạt động ở mức thấp nhất và đóng vai trò trong việc lưu trữ
dữ liệu
Trang 25Hình 8: Sharding trong Index [19]
• ElasticSearch đã hỗ trợ toàn bộ việc giao tiếp cũng như tự động thay đổi các Shard khi cần thiết, do đo chúng ta gần như không bao giờ làm việc trực tiếp với các Shard
• Có 2 loại Shard là: Primary Shard và Replica Shard
Hình 9: Primary Shard và Replica Shard
Trang 26Primary Shard:
• Primary Shard là sẽ lưu trữ dữ liệu và đánh index Sau khi đánh xong
dữ liệu sẽ được vận chuyển tới các Replica Shard
• Mặc định của ElasticSearch là mỗi index sẽ có 5 Primary shard và với mỗi Primary shard thì sẽ đi kèm với 1 Replica Shard
• ElasticSearch sử dụng công thức sau để chọn shard cho việc lưu trữ.Công thức tính Shard:
shard = hash(routing) % number_of_primary_shards
Hash: là một hàm tính toán cố định của ElasticSearch, routing là 1 đoạn text
duy nhất theo document, nó thường là _id của document đó
Number_of_primary_shard: là số lượng của primary shard trong cluster
Giá trị Shard sẽ đi kèm với document, nó dùng để xác định Shard nào sẽ lưu
trong document nào và đồng thời dùng để cho routing, vì hệ thống sẽ tìm document
theo id của nó Và đây cũng là lý do chúng ta không nên thay đổi số lượng Primary Shard, nếu không thì công thức trên sẽ không cho kết quả như ban đầu
Quá trình lưu dữ liệu:
Trang 27Hình 10: quá trình chuyển dữ liệu [17]
2.3.2.4 Node (Nút)
Là một server duy nhất, là một phần của cluster, là trung tâm hoạt động của ElasticSearch, là nơi lưu trữ dữ liệu, tham gia vào chức năng lập chỉ mục và thực hiện các thao tác tìm kiếm
Tên của Node rất quan trọng trong việc xác định nút này thuộc cụm nào trong
hệ thống ElasticSearch Mỗi node được định danh bằng 1 tên duy nhất (unique name) Việc đặt tên được tiến hành khi thiết lập, có thể tự định danh cho Node của server mình Tất cả các Node đều biết tất cả các Node khác của Cluster và có thể chuyển tiếp yêu cầu từ client đến Node thích hợp Ngoài ra, mỗi Node phục vụ một hoặc nhiều mục đích:
• Master-eligible node: một Node có node.master (nút chính) được đặt
giá trị bằng True làm mặc định, điều đó làm cho nó đủ điều kiện để được chọn làm Node chính, và điều khiển Cluster
• Data node: một Node có node.data được đặt giá trị bằng True làm mặc
định Các Node dữ liệu có chức năng chứa dữ liệu và thực hiện các hoạt động liên quan đến dữ liệu như thêm, xóa, sửa, tìm kiếm và tổng hợp
• Node Ingest: được sử dụng khi ta cần chạy lại (pre-process) các Document trước khi chúng được index Ingest node sẽ can thiệp vào
giữa quá trình xử lý cho số lượng lớn dữ liệu (bulk) và index, thực hiện các phép biến đổi, sau đó truyền kết quả trở lại index/bulk api Một Node có node.ingest được đặt giá trị bằng True làm mặc định Các Node
Trang 28Ingest có thể áp dụng một đường dẫn nhập vào tài liệu để chuyển đổi
và làm phong phú tài liệu trước khi lập chỉ mục
2.3.2.5 Cluster (Cụm)
Là tập hợp các Node hoạt động cùng với nhau, cùng nắm giữ toàn bộ dữ liệu, cung cấp khả năng lập chỉ mục và tìm kiếm liên kết giữa các Node với thông qua tên của Cluster (cluster name) Chính vì thế Cluster sẽ được xác định bằng 1 tên duy nhất
(unique name) Việc đặt tên cho các Cluster trùng tên sẽ gây ra lỗi cho các Node vì vậy khi cài đặt chúng ta cần lưu ý về vấn đề này
Hình 11: Cluster trong ElasticSearch
Mỗi Cluster có một Node chính (master), được lựa chọn một cách tự động và
có thể thay thế nếu sự cố xãy ra Một Cluster có thể gồm 1 hoặc nhiều Node Các Node có thể hoạt động trên cùng 1 Server Tuy nhiên trong thực tế, một Cluster sẽ gồm nhiều Node hoạt động trên các Server khác nhau để đảm bảo nếu 1 Server gặp
sự cố thì Server khác (Node khác) vẫn có thể hoạt động bình thường và đảm bảo sự
ổn định cho hệ thống tìm kiếm Các Node có thể tìm thấy nhau để hoạt động trên cùng 1 Cluster thông qua giao thức Unicast
Chức năng chính của Cluster đó chính là quyết định xem Shard nào được phân
bổ cho Node nào và khi nào thì di chuyển các Cluster để tạo cân bằng lại Cluster
Trang 292.3.2.6 Mapping
Mapping là quá trình định nghĩa làm thế nào một Document và các trường dữ liệu của nó được lưu trữ và đánh Index Ví dụ ta sử dụng Mapping trong việc để định nghĩa như sau:
• String fields nào được sử dụng như là full-text fields
• Fields nào chứa numbers, dates hay geolocations
• Liệu giá trị của tất cả các trường dữ liệu trong document được đánh index catch-all
• Format của các date field
• Các custom rules để điều khiển mapping
• Mapping Type: mỗi một index có một hoặc nhiều mapping type, chúng được sử dụng để chia các document trong một index thành các nhóm logic (logical groups) Ví dụ có index tên là my_index dùng để lưu trữ
cả thông tin user và blogpost User có thể được lưu trong user type và blog posts trong một blogpost type
Ví dụ về một mapping trong ElasticSearch như sau:
Ta có sơ đồ quan hệ giữa 2 table user và blogpost
Hình 12: Ví dụ về sơ đồ cơ sở dữ liệu của Mapping
Ta thực hiện trên ElasticSearch như sau, thông qua cơ chế RESTfull:
PUT my_index
{
Trang 30"mappings": {
"user": {
"_all": { "enabled": false },
"properties": {
"title": { "type": "text" },
"name": { "type": "text" },
"age": { "type": "integer" }
"title": { "type": "text" },
"body": { "type": "text" },
}
}
Trang 31ElasticSearch cung cấp cách để tùy chỉnh cách mọi thứ được lập chỉ mục với các trình phân tích của index analysis module Analyzers là quá trình phân tích và lập chỉ mục dữ liệu Mỗi analyzer bao gồm:
Trang 32Ví dụ: Một Tokenizer cơ bản sẽ thực hiện các thao tác sau:
"Our goal at Tryolabs is to help Startups"
-> Tokenizer ->
["Our", "goal", "at", Tryolabs", "is", "to", "help", "Startups"]
Tokenizers gồm tokenizer cơ bản và có thể sửa đổi, xóa chúng hoặc thêm những tokenizer mới Ví dụ để đặt tên sao cho có nhiều ý nghĩa nhất có thể, một TokenFilter có thể áp dụng stemming (chuyển đổi các token về từ gốc theo ngữ pháp), loại bỏ các từ không có nghĩa (stop_words), thêm từ đồng nghĩa (Synonyms)
CharFilters được sử dụng để xử lý trước các ký tự trước khi được gửi tới Tokenizers
ElasticSearch cung cấp rất nhiều Tokenizers, TokenFilters và chúng ta có thể tạo các tùy chỉnh và cài đặt chúng dưới dạng plugin
Các loại cấu hình Analyzer trong ElasticSearch:
• Standard Analyzer: chia văn bản thành các thuật ngữ về ranh giới từ,
như được xác định bởi thuật toán phân đoạn văn bản Unicode Nó loại
bỏ hầu hết các dấu câu, chuyển tất cả các ký tự thành chữ thường (lowercases) của các từ khóa và cũng hỗ trợ loại bỏ stop_words (các từ không liên quan đến nội dung và ý nghĩa của văn bản: như a, an, many, the….)
• Simple Analyzer: chia văn bản thành các thuật ngữ bất cứ khi nào nó
gặp một ký tự không phải là một chữ cái Nó sẽ chuyển các ký tự thành chữ thường tất cả từ khóa
• Whitespace Analyzer: chia văn bản thành các thuật ngữ bất cứ khi nào
nó gặp bất kỳ ký tự khoảng trắng nào Nó sẽ không chuyển các ký tự thành chữ thường như Simple Analyzer
• Stop Analyzer: giống như Simple Analyzer nhưng có thêm tính năng
loại bỏ stop_words
• Keyword Analyzer: chấp nhận bất kỳ văn bản nào và đưa ra chính xác
văn bản như 1 thuật ngữ
• Pattern Analyzer: thường dùng trong việc kiểm tra số điện thoại hoặc
Email, domain Hỗ trợ cả lower-casing and stop words
Trang 33• Language Analyzers: cung cấp nhiều phân tích ngôn ngữ cụ thể như
tiếng Anh, tiếng Pháp…
• Fingerprint Analyzer: là sự phân tích chuyên dụng tạo ra dấu vân tay
có thể được sử dụng để phát hiện trùng lặp
Chúng ta có thể điều chỉnh Analyzers (custom Analyzers): nếu không tìm thấy
sự phân tích nào phù hợp bên trên thì chúng ta cũng có thể tạo ra một bộ phân tích
tùy chỉnh kết hợp character filters, tokenizer, và token filters
2.3.3.2 Cách sử dụng và Kiểm tra Analyzer
Để sử dụng các kết hợp khác nhau của Tokenizers và TokenFilters, chúng ta cần tạo một Analyzer trong index settings và sau đó sử dụng nó trong mapping
Ví dụ, giả sử chúng ta muốn một Analyzer để tokenizer dưới dạng tiêu chuẩn,
và áp dụng bộ lọc lowercase filter và stemming như sau:
Trang 36Kiểm tra Analyzer, trong phần này sau khi đã tạo ra vi_analyzer dựa trên
Plugin của tác giả Duy Đỗ, ta kiểm tra kết quả của nó như sau:
GET danhba_yte/_analyze
Trang 39"position" : 5
}
]
}
2.3.4 Query DSL (domain- Specific Language) trong ElasticSearch
Elasticsearch cung cấp đầy đủ Query DSL dựa trên JSON để định nghĩa truy vấn Có 2 loại:
Câu truy vấn đơn: tìm kiếm một giá trị cụ thể trong một trường (field) cụ
thể Gồm các câu: match, term, range
Câu truy vấn kép: bao gồm nhiều câu truy vấn đơn cùng các truy vấn kép,
được sử dụng kết hợp theo một logic hợp lý Ví dụ: bool, dis_max
2.3.4.1 Match all query
Câu truy vấn đơn giản nhất, phù hợp với tất cả các tài liệu
Trang 40Kết quả
Hình 14: Kết quả tìm kiếm Match all query
2.3.4.2 Full text queries
Loại truy vấn full text cấp cao này thường được sử dụng cho các trường full text như nội dung email Các trường này thường được phân tích từ trước, và có các
loại phân tích (analyzer) cho mỗi loại field
• Match query: truy vấn chuẩn để thực hiện full text query Bao gồm
truy vấn kết hợp và truy vấn cụm từ hoặc gần đúng Match query chấp
nhận văn bản, số, ngày tháng
Hình 15: Kết quả Match query