Đề xuất, đôi khi được gọi là tự động đề xuất, tìm kiếm trước hoặc tự động hoàn thành, hiện là một tính năng tìm kiếm thiết yếu kể từ khi Google thêm nó gần 5 năm trước .
Lucene có một số triển khai; Tôi đã mô tả trước đây AnalyzingSuggester
. Kể từ đó, FuzzySuggester
cũng được thêm vào, mở rộng AnalyzingSuggester
bằng cách chấp nhận các đầu vào sai chính tả.
Ở đây tôi mô tả suggester mới nhất của chúng tôi : AnalyzingInfixSuggester
, bây giờ trải qua các lần lặp lại về vấn đề LUCENE-4845 Jira.
Không giống như các đề xuất hiện có, thường tìm thấy các đề xuất có toàn bộ tiền tố khớp với đầu vào của người dùng hiện tại, suggester này sẽ tìm thấy các mã thông báo phù hợp ở bất cứ đâu trong đầu vào của người dùng và trong đề xuất; đây là lý do tại sao nó có Infix trong tên của nó.
Bạn có thể thấy nó hoạt động tại ví dụ ứng dụng tìm kiếm Jira mà tôi đã xây dựng để giới thiệu các tính năng khác nhau của Lucene .
Ví dụ: nếu bạn nhập, japan
bạn sẽ thấy các vấn đề khác nhau được đề xuất, bao gồm:
- SOLR-4945: Tự động hoàn thành và Highlighter của Nhật Bản bị hỏng
- LUCENE-3922: Thêm chuẩn hóa số Kanji Nhật Bản vào Kuromoji
- LUCENE-3921: Thêm khả năng phân hủy hợp chất Katakana của Nhật Bản vào Kuromoji
Như bạn có thể thấy, các ký tự đến có thể khớp không chỉ là tiền tố của mỗi đề xuất mà còn là tiền tố của bất kỳ mã thông báo nào bên trong.
Không giống như các đề xuất hiện có, suggester mới này không sử dụng cấu trúc dữ liệu chuyên biệt như FST . Thay vào đó, đó là một chỉ số Lucene "thông thường", sử dụng EdgeNGramTokenFilter
để lập chỉ mục các tiền tố ngắn của mỗi mã thông báo, lên đến độ dài 3 theo mặc định, để truy vấn tiền tố nhanh.
Nó cũng sử dụng API trình sắp xếp chỉ mục mới để sắp xếp trước tất cả các bài đăng theo trọng số được đề xuất tại thời điểm chỉ mục và tại thời điểm tra cứu sử dụng một tùy chỉnh Collector
để dừng sau khi tìm thấy các lần truy cập N khớp đầu tiên vì các lần truy cập này phù hợp nhất khi sắp xếp theo trọng số. Phương pháp tra cứu cho phép bạn chỉ định liệu tất cả các thuật ngữ phải được tìm thấy hay bất kỳ thuật ngữ nào (Tìm kiếm Jira yêu cầu tất cả các điều khoản).
Do các đề xuất được sắp xếp chỉ theo trọng lượng và không có tiêu chí liên quan nào khác, nên trình duyệt này phù hợp với các ứng dụng có trọng số a-prori mạnh cho mỗi đề xuất, chẳng hạn như đề xuất xếp hạng công cụ tìm kiếm phim theo mức độ phổ biến, độ trễ hoặc pha trộn , cho mỗi bộ phim. Trong tìm kiếm Jira, tôi xếp hạng từng đề xuất (vấn đề Jira) theo cách nó được cập nhật gần đây.
Cụ thể, không có hình phạt nào đối với các đề xuất có mã thông báo phù hợp ngay từ đầu, điều đó có thể có nghĩa là mức độ liên quan kém trong một số trường hợp; một cách tiếp cận khác (bản vá là về vấn đề) thay vào đó sử dụng các FST, có thể yêu cầu các mã thông báo phù hợp nằm trong ba mã thông báo đầu tiên, ví dụ. Điều này cũng có thể với AnalyzingInfixSuggester
sử dụng bộ phân tích thời gian chỉ số đã loại bỏ tất cả trừ ba mã thông báo đầu tiên.
Một lợi ích tuyệt vời của cách tiếp cận dựa trên chỉ mục là AnalyzingInfixSuggester
xử lý làm nổi bật các mã thông báo phù hợp (màu đỏ, ở trên), điều không may được chứng minh là khó cung cấp với các đề xuất dựa trên FST. Về mặt lý thuyết, một lợi ích khác là suggester có thể hỗ trợ lập chỉ mục gần như thời gian thực, nhưng tôi đã không tiết lộ rằng trong bản vá hiện tại và có lẽ sẽ không có thời gian (bản vá chào mừng!).
Hiệu suất là hợp lý: ở đâu đó giữa AnalyzingSuggester
và FuzzySuggester
, giữa 58 - 100 kQPS (chi tiết về vấn đề này ).
Phân tích thú vị
Cũng như AnalyzingSuggester
, AnalyzingInfixSuggester
hãy để bạn định cấu hình riêng biệt các máy phân tích thời gian tìm kiếm so với thời gian tìm kiếm. Với tìm kiếm Jira, Tôi đã bật loại bỏ từ dừng tại thời điểm chỉ mục, nhưng không phải lúc tìm kiếm, do đó, một truy vấn như thế or
vẫn sẽ tìm thấy thành công bất kỳ đề xuất nào có chứa các từ bắt đầu or
, thay vì bỏ hoàn toàn cụm từ.
Bạn nên sử dụng suggester nào cho ứng dụng của bạn? Không thể nói! Bạn sẽ phải kiểm tra từng sản phẩm của Lucene và chọn một sản phẩm. Tự động đề xuất là một lĩnh vực mà một kích cỡ không phù hợp với tất cả, vì vậy thật tuyệt khi Lucene đang chọn một số triển khai cạnh tranh. Dù bạn sử dụng, xin vui lòng cung cấp cho chúng tôi thông tin phản hồi để chúng tôi có thể lặp lại và cải thiện hơn nữa!