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 ý


  • Global Moderator

    @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 :D

    Tech-nông
    Twitter: @nhubaovu
    Profile: about.me/vunb

    0


  • @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ại

    Có 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ả định

    Ví 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ình :(

    Hy 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|...


  • Global Moderator

    @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 :D

    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)
    

    Tech-nông
    Twitter: @nhubaovu
    Profile: about.me/vunb

    0

  • Global Moderator

    Mình sẽ sớm đưa bộ từ điển này vào Vntk, toolkit cho NodeJS.

    Tech-nông
    Twitter: @nhubaovu
    Profile: about.me/vunb

    0


  • @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ày

    Theo 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 cao

    Python đú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 được

    Mà 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ày :)

    Thôi thì what the "best choose"? :)

    0_1507722851043_Screenshot from 2017-10-11 18-41-34.png


  • Global Moderator

    @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ày

    Benchmark 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 :D

    Tech-nông
    Twitter: @nhubaovu
    Profile: about.me/vunb

    0


  • @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ữa :)

    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 đợ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.


Log in to reply