2010-03-11 34 views
5

Tôi đang lập chỉ mục một hàng dữ liệu từ cơ sở dữ liệu trong Lucene.Net. Một hàng tương đương với Tài liệu.Làm cách nào để có được DocId khi thêm tài liệu trong chỉ mục Lucene?

Tôi muốn cập nhật cơ sở dữ liệu của mình bằng DocId, để tôi có thể sử dụng DocId trong kết quả để có thể truy xuất hàng nhanh chóng.

Tôi hiện đang lần đầu tiên lấy lại PK từ các tài liệu kết quả mà tôi cho rằng nên chậm hơn so với truy xuất trực tiếp từ cơ sở dữ liệu bằng DocId.

Tôi làm cách nào để tìm DocId khi thêm tài liệu vào Lucene?

Trả lời

2

Như Yuval đã nêu, rò rỉ chi tiết triển khai Lucene bên trong là xấu, đặc biệt là do thay đổi của id doc doc khi chỉ mục bị tắt tiếng.

Nếu tra cứu khóa chính bằng doc.get ("pk") quá chậm đối với bạn, hãy sử dụng FieldCache để lưu tất cả bộ nhớ trong bộ nhớ. Sau đó, các tra cứu sẽ rất nhanh.

+0

Đoạn mã mẫu nào để sử dụng FieldCache? – Rohit

+0

Tôi đồng ý rằng dựa vào doc id hầu như luôn luôn là thiết kế kém. Tuy nhiên, tôi có một trường hợp sử dụng cụ thể trong đó tôi có chỉ mục chỉ đọc và cần xử lý bên ngoài những gì có thể với truy vấn tìm kiếm, vì vậy tôi cần lưu trữ id tài liệu của một số tài liệu nhất định để tham khảo sau này. Bạn có thể vui lòng xây dựng trên bằng cách sử dụng FieldCache để làm như vậy? – Lyle

3

Dựa vào Docind của Lucene là một chính sách tồi, thậm chí Lucene cố gắng tránh điều này. Tôi đề nghị bạn tạo DocId của riêng bạn. Trong một cơ sở dữ liệu tôi sẽ sử dụng một auto-increment field. Nếu ứng dụng của bạn không sử dụng cơ sở dữ liệu quan hệ, bạn có thể tạo loại trường này theo lập trình. Ngoài ra, tôi đề nghị bạn đọc Search Engine versus DBMS - Tôi tin rằng chỉ những trường có thể được tìm kiếm mới được lưu trữ trong Lucene; Phần còn lại của hàng nằm trong cơ sở dữ liệu, do đó, chuỗi sự kiện là:

  1. Sử dụng Lucene, tìm kiếm một số văn bản và nhận DocId.
  2. Sử dụng DocId để truy xuất toàn bộ hàng từ cơ sở dữ liệu.
Các vấn đề liên quan