Cách nhanh chóng và hiệu quả để triển khai thành phần phía máy chủ cho tính năng tự động hoàn thành trong hộp nhập html là gì?Tự động hoàn tất phía máy chủ
Tôi đang viết dịch vụ để tự động hoàn tất truy vấn người dùng trong hộp tìm kiếm chính của giao diện web của chúng tôi và các lần hoàn thành được hiển thị trong menu thả xuống được hỗ trợ ajax. Dữ liệu mà chúng tôi đang chạy truy vấn chỉ đơn giản là một bảng lớn các khái niệm mà hệ thống của chúng tôi biết, phù hợp với bộ tiêu đề trang wikipedia. Đối với dịch vụ này tốc độ rõ ràng là vô cùng quan trọng, vì sự đáp ứng của trang web rất quan trọng đối với trải nghiệm người dùng.
Triển khai hiện tại chỉ cần tải tất cả các khái niệm vào bộ nhớ trong một tập hợp đã sắp xếp và thực hiện tra cứu nhật ký đơn giản (n) trên một phím tắt người dùng. Cái đuôi sau đó được sử dụng để cung cấp các trận đấu bổ sung ngoài trận đấu gần nhất. Vấn đề với giải pháp này là nó không mở rộng quy mô. Nó hiện đang chạy với giới hạn không gian máy ảo (tôi đã thiết lập -Xmx2g, đó là phần lớn chúng ta có thể đẩy trên các máy 32 bit), và điều này ngăn cản chúng ta mở rộng bảng khái niệm của chúng ta hoặc thêm nhiều chức năng hơn. Chuyển sang máy ảo 64 bit trên các máy có nhiều bộ nhớ hơn không phải là tùy chọn ngay lập tức.
Tôi đã do dự khi bắt đầu làm việc trên một giải pháp dựa trên đĩa vì tôi lo ngại rằng thời gian tìm kiếm đĩa sẽ giết hiệu suất. Có giải pháp nào có thể cho phép tôi mở rộng quy mô tốt hơn, hoặc hoàn toàn trong bộ nhớ hoặc với một số triển khai nhanh được hỗ trợ trên đĩa không?
Chỉnh sửa:
@Gandalf: Đối với trường hợp sử dụng của chúng tôi, điều quan trọng là các autocompletion là toàn diện và không phải là sự giúp đỡ chỉ thêm cho người sử dụng. Đối với những gì chúng tôi đang hoàn thành, nó là một danh sách các cặp kiểu khái niệm. Ví dụ: các mục có thể là [("Microsoft", "Công ty phần mềm"), ("Jeff Atwood", "Lập trình viên"), ("StackOverflow.com", "Trang web")]. Chúng tôi đang sử dụng Lucene cho tìm kiếm đầy đủ khi người dùng chọn một mục từ danh sách tự động hoàn thành, nhưng tôi chưa chắc Lucene sẽ làm việc tốt cho chính bản thân tự hoàn thành.
@Glen: Không có cơ sở dữ liệu nào đang được sử dụng tại đây. Khi tôi nói về một bảng, tôi chỉ có nghĩa là biểu diễn có cấu trúc của dữ liệu của tôi.
@Jason Day: Việc triển khai ban đầu của tôi cho vấn đề này là sử dụng Trie, nhưng bộ nhớ sưng lên với điều đó thực sự tồi tệ hơn bộ được sắp xếp do cần một số lượng lớn tham chiếu đối tượng. Tôi sẽ đọc trên cây tìm kiếm thứ ba để xem nó có thể được sử dụng hay không.
Ông có thể cho chúng tôi biết thêm một chút về những gì bạn đang "tự động hoàn thành". Tại sao rất nhiều điều khoản? Có những người rõ ràng hơn sẽ đáp ứng 90% truy vấn người dùng của bạn, thay vì sau đó tải mọi khả năng? – Gandalf
Tôi không thể chắc chắn liệu Lucene có phù hợp với nhu cầu của bạn hay không, nhưng trên dữ liệu kích thước đó, tôi rất nghi ngờ bạn sẽ không nhận được lần truy vấn thứ hai trên chỉ mục Lucene được tối ưu hóa. Tùy thuộc vào cách lập chỉ mục, bạn thậm chí có thể lưu trữ nó trong bộ nhớ. – Gandalf
Một Trie tiêu chuẩn thực sự là bộ nhớ rất chuyên sâu, cho các bộ lớn hơn, bạn muốn sử dụng một Trie nhỏ gọn giúp giảm đáng kể dung lượng bộ nhớ. Các tối ưu hóa bổ sung bao gồm việc khởi tạo lười biếng các giá trị nút và cấu trúc dữ liệu phù hợp cho các tập con/giá trị. Cách đây không lâu, tôi đã tạo một [thư viện tự động hoàn thành Java] (https://github.com/fmmfonseca/completely) có khả năng xử lý các tập dữ liệu rất lớn (10.000.000+) và trả lời một cách hiệu quả các tìm kiếm chính xác và gần đúng. –