Thư viện fulltextsearch(Chắc chỉ hỗ trợ tiếng Việt)
-
Hôm nay mình xin chia sẻ với anh em thư viện fulltextsearch
https://github.com/leduykhoa/fulltextsearch
demo
Cái này là sản phẩm cây nhà lá vườn
Áp dụng cho các bài toán ao làng, đối với hệ thống lớn cần tối ưu thì cần xem xét
Mình không giỏi thuật toán nên nghĩ sao code vậy
Có gì anh em góp ý
-
@Khoa-Lê-Duy Ý tưởng chính của bạn ở đây là gì ? Có thể đóng gọi thành plugin cho mongoose được ko ?
Ví dụ:
// 1. Khai báo plugin trên model schema var vnFulltextSearchPlugin = require('fulltextsearch') modelSchema.plugin(vnFulltextSearchPlugin) // 2. Tìm kiếm model.find({ $searchText: { field1: 'tiêu chí 1', field2: 'tiêu chí 2' } }).then(records => { console.log('Results: ', records) })
Mình thấy như vậy khá tiện, nếu muốn tìm kiếm xấp xỉ như vậy. Giải pháp tạm thời cho tiếng Việt! Bạn thấy ok, mình sẽ contribute cùng
-
@Vũ
Ý tưởng chính của bạn ở đây là gì ?
Mình tìm giải pháp đế search tiếng Việt thôi
Nó cũng là bài toán của mình hiện tạiCó thể đóng gọi thành plugin cho mongoose được ko ?
Cái này mình không hiểu lắm
Nhưng mình nghĩa đưa lên đây là cho mọi người tham khảo, góp ý xây dựng
Bởi mình vẫn thấy có hạt sạn nó to đùng
Nhìn thấy, nhưng nội công không đủ để hốt nó đi
Chi tiết
@Khoa-Lê-Duy said in Search tiếng Việt - mongoose:@Acenter-Ha
Bạn qua bên này nhé https://nodejs.vn/topic/1230/thư-viện-fulltextsearch-chắc-chỉ-hỗ-trợ-tiếng-việt
Cái này mình không can thiệp bên mongodb
Mình dùng nodejs để tạo ra các kết quả giả địnhVí dụ: từ "duoc"
nó sẽ ra "duoc|đuoc|dùoc|dủoc|dũoc|dúoc|dụoc|dưoc|dừoc|dửoc|...."
Ít nhiều ảnh hưởng tới hiệu xuất
nhưng hiện tại nó giải quyết được bài toán của mìnhHy vọng bạn nào đó có thuật toán để loại bỏ các từ vô nghĩa như 'duoc|đuoc|dùoc|dủoc|dũoc|dúoc|dụoc|dưoc|dừoc|dửoc..."
Để nó chỉ ra các từ có nghĩa như
được|dược|...
-
@Khoa-Lê-Duy do chưa trải nghiệm nên mình cũng ko biết đóng góp thế nào :)) Ko biết vấn đề hiện tại của thư viện
Như mình thấy có 1 vấn đề lớn ở đây, cỡ hòn sỏi, ko phải là hạt sạn :v
// tổng hợp mẫu tìm kiếm, thì nó ra thế này fullTextSearchVi('xin chào') "xin|xìn|xỉn|xĩn|xín|xịn|chào|chao|chảo|chão|cháo|chạo|chăo|chằo|chẳo|chẵo|chắo|chặo|châo|chầo|chẩo|chẫo|chấo|chậo|chaò|chaỏ|chaõ|chaó|chaọ|chaô|chaồ|chaổ|chaỗ|chaố|chaộ|chaơ|chaờ|chaở|chaỡ|chaớ|chaợ|chàò|chàỏ|chàõ|chàó|chàọ|chàô|chàồ|chàổ|chàỗ|chàố|chàộ|chàơ|chàờ|chàở|chàỡ|chàớ|chàợ|chảò|chảỏ|chảõ|chảó|chảọ|chảô|chảồ|chảổ|chảỗ|chảố|chảộ|chảơ|chảờ|chảở|chảỡ|chảớ|chảợ|chãò|chãỏ|chãõ|chãó|chãọ|chãô|chãồ|chãổ|chãỗ|chãố|chãộ|chãơ|chãờ|chãở|chãỡ|chãớ|chãợ|cháò|cháỏ|cháõ|cháó|cháọ|cháô|cháồ|cháổ|cháỗ|cháố|cháộ|cháơ|cháờ|cháở|cháỡ|cháớ|cháợ|chạò|chạỏ|chạõ|chạó|chạọ|chạô|chạồ|chạổ|chạỗ|chạố|chạộ|chạơ|chạờ|chạở|chạỡ|chạớ|chạợ|chăò|chăỏ|chăõ|chăó|chăọ|chăô|chăồ|chăổ|chăỗ|chăố|chăộ|chăơ|chăờ|chăở|chăỡ|chăớ|chăợ|chằò|chằỏ|chằõ|chằó|chằọ|chằô|chằồ|chằổ|chằỗ|chằố|chằộ|chằơ|chằờ|chằở|chằỡ|chằớ|chằợ|chẳò|chẳỏ|chẳõ|chẳó|chẳọ|chẳô|chẳồ|chẳổ|chẳỗ|chẳố|chẳộ|chẳơ|chẳờ|chẳở|chẳỡ|chẳớ|chẳợ|chẵò|chẵỏ|chẵõ|chẵó|chẵọ|chẵô|chẵồ|chẵổ|chẵỗ|chẵố|chẵộ|chẵơ|chẵờ|chẵở|chẵỡ|chẵớ|chẵợ|chắò|chắỏ|chắõ|chắó|chắọ|chắô|chắồ|chắổ|chắỗ|chắố|chắộ|chắơ|chắờ|chắở|chắỡ|chắớ|chắợ|chặò|chặỏ|chặõ|chặó|chặọ|chặô|chặồ|chặổ|chặỗ|chặố|chặộ|chặơ|chặờ|chặở|chặỡ|chặớ|chặợ|châò|châỏ|châõ|châó|châọ|châô|châồ|châổ|châỗ|châố|châộ|châơ|châờ|châở|châỡ|châớ|châợ|chầò|chầỏ|chầõ|chầó|chầọ|chầô|chầồ|chầổ|chầỗ|chầố|chầộ|chầơ|chầờ|chầở|chầỡ|chầớ|chầợ|chẩò|chẩỏ|chẩõ|chẩó|chẩọ|chẩô|chẩồ|chẩổ|chẩỗ|chẩố|chẩộ|chẩơ|chẩờ|chẩở|chẩỡ|chẩớ|chẩợ|chẫò|chẫỏ|chẫõ|chẫó|chẫọ|chẫô|chẫồ|chẫổ|chẫỗ|chẫố|chẫộ|chẫơ|chẫờ|chẫở|chẫỡ|chẫớ|chẫợ|chấò|chấỏ|chấõ|chấó|chấọ|chấô|chấồ|chấổ|chấỗ|chấố|chấộ|chấơ|chấờ|chấở|chấỡ|chấớ|chấợ|chậò|chậỏ|chậõ|chậó|chậọ|chậô|chậồ|chậổ|chậỗ|chậố|chậộ|chậơ|chậờ|chậở|chậỡ|chậớ|chậợ"
Trước khi tổng hợp mẫu tìm kiếm, bạn nên map nó với 1 từ điển tiếng Việt trước. Đây là dự án mã mở về xử lý tiếng việt mình đang contribute cùng, bạn tham khảo bộ từ điển của nó:
Sample trong python, việc chuyển nó sang nodejs không khó:
from unittest import TestCase from underthesea.dictionary import Dictionary from underthesea.feature_engineering.text import Text class TestDictionary(TestCase): def test_1(self): dictionary = Dictionary.Instance() senses = dictionary.lookup(Text("đi")) self.assertEqual(22, len(senses)) sense = senses[0] self.assertEqual("V", sense["pos"]) self.assertGreater(len(sense["definition"]), 0) def test_2(self): dictionary = Dictionary.Instance() word = dictionary.lookup(Text("không có từ này")) self.assertEqual(None, word)
-
Mình sẽ sớm đưa bộ từ điển này vào Vntk, toolkit cho NodeJS.
-
@Vũ
Mình cần phân trần thế này
quê mình gọi hòn sỏi là "hạt sạn to đùng" :))Theo những gì mình nhận ở đây
1, Theo cách mình làm nó sẽ đẩy phần xử lý về phía mongodb
2, Kết hợp với bộ từ điển như trên thì lại đẩy phần xử lý về phía nodejs
Mình cũng không rõ cái nào tối ưu
Cần ai đó phán xử vụ nàyTheo cách mình thì nếu mà search nhiều sợ thằng mongodb nó nghẻo mất
String càng dài thì nguy cơ nghẻo càng caoPython đúng là mình chỉ dừng ở skill "hello world" thôi
Nhưng thấy có trong source code có mấy file(chắc là data) cũng tương đối bự có đính kèm ở ảnh
Mà đọc file chắc chậm hơn rồi
Nhưng nếu nhét vào mongodb những data đó hoặc có cơ chế cache kiểu gì đó chắc giải quyết đượcMà lại nhưng nữa. Nếu đã chuẩn hóa từ khóa để search rùi(tử khóa để tìm kiếm chuẩn men) thì tỉ dụ trong db nó input không đúng thì cũng hèo
Ví dụ: string "xin chào"
trong db là "chaò"
Mình dùng ubuntu và typing bằng iBus nên cũng hay bị chuyện nàyThôi thì what the "best choose"?
-
@Khoa-Lê-Duy said in Thư viện fulltextsearch(Chắc chỉ hỗ trợ tiếng Việt):
Theo những gì mình nhận ở đây
1, Theo cách mình làm nó sẽ đẩy phần xử lý về phía mongodb
2, Kết hợp với bộ từ điển như trên thì lại đẩy phần xử lý về phía nodejs
Mình cũng không rõ cái nào tối ưu
Cần ai đó phán xử vụ nàyBenchmark về hiệu năng chắc phải có kế hoạch cẩn thận, trước và sau khi áp dụng, so với tool khác thì như thế nào.
Nhưng nếu nhét vào mongodb những data đó hoặc có cơ chế cache kiểu gì đó chắc giải quyết được
File từ điển này thì cũng nhẹ, việc đọc 1 lần lúc khởi động + truy xuất bộ nhớ thì nhanh hơn nhiều nên có thể ko cần dùng thêm cơ chế cache khác nữa.
Thôi thì what the "best choose"?
Trong quá trình phát triển, cải tiến sẽ biết được cái nào là the best
-
@Vũ
Okie mod
Mình cũng vừa update lại 1 số trường hợp đặc biệt
Hy vọng nó sẽ không lòi ra tiếp nữaFile từ điển này thì cũng nhẹ, việc đọc 1 lần lúc khởi động + truy xuất bộ nhớ thì nhanh hơn nhiều nên có thể ko cần dùng thêm cơ chế cache khác nữa.
Thôi đợi mod convert xong thì mình làm tiếp.
Gọi là contribute
Mà phần thư viện xử lý tiếng Việt cũng hơi quá tải với mình
Mà thank mod lần nữa vì cái bảng mã public ở đâu đó
Cũng đúng lúc mình cần. Hơi bị hên.