2009-06-13 32 views
5

Tôi đang làm việc trên một dự án mà tôi sẽ có rất nhiều dữ liệu và có thể tìm kiếm được bằng một số biểu mẫu được thể hiện rất hiệu quả như truy vấn SQL, nhưng nó cũng cần được tìm kiếm thông qua xử lý ngôn ngữ tự nhiên.Các phương pháp hay nhất để kết hợp Lucene.NET và một cơ sở dữ liệu quan hệ?

Kế hoạch của tôi là xây dựng chỉ mục bằng Lucene cho dạng tìm kiếm này.

Câu hỏi của tôi là nếu tôi thực hiện điều này và thực hiện tìm kiếm, Lucene sau đó sẽ trả về ID của các tài liệu phù hợp trong chỉ mục, sau đó tôi phải tra cứu các thực thể này từ cơ sở dữ liệu quan hệ.

Điều này có thể được thực hiện theo hai cách (Rằng tôi có thể nghĩ cho đến nay):

  • N lượng truy vấn (Horrible)
  • đèo tất cả các ID để một thủ tục lưu trữ cùng một lúc (Có lẽ như thông số phân cách bằng dấu phẩy). Điều này có nhược điểm là bị giới hạn ở kích thước tham số tối đa, và hiệu năng làm chậm của UDF để chia chuỗi thành một bảng tạm thời.

Tôi gần như bị cám dỗ để phản ánh mọi thứ thành chỉ mục lucenes, để tôi có thể tạo chỉ mục định kỳ từ cửa hàng sao lưu, nhưng chỉ cần truy cập chỉ mục cho giao diện người dùng.

Lời khuyên?

+0

Xin chào. Bạn đã hoàn thành dự án của mình chưa? Bạn đã làm gì? – Eduardo

Trả lời

2

Khi gặp phải sự cố này, tôi đã đi với một cơ sở dữ liệu quan hệ có khả năng tìm kiếm toàn văn (tôi đã sử dụng PostgreSQL 8.3, được hỗ trợ ft, hỗ trợ xuất phát và từ điển). Bằng cách này, cơ sở dữ liệu có thể truy vấn bằng cách sử dụng cả hai lệnh SQL và ft. Nhược điểm là bạn cần một DB có khả năng tìm kiếm toàn văn bản, và những khả năng này có thể thua kém những gì lucene có thể làm.

4

Tôi sẽ lưu trữ dữ liệu 'giao diện người dùng' bên trong chính chỉ mục, tránh bất kỳ tương tác db nào. Chỉ có thể truy vấn db khi bạn muốn biết thêm thông tin về bản ghi cụ thể.

1

Tôi đoán câu trả lời phụ thuộc vào những gì bạn sẽ làm với kết quả, nếu bạn định hiển thị kết quả trong lưới và cho phép người dùng chọn tài liệu chính xác mà anh ấy muốn truy cập thì bạn có thể muốn thêm chỉ mục đủ văn bản để giúp người dùng xác định tài liệu, như một sự xáo trộn nói 200 ký tự và sau đó khi thành viên chọn một tài liệu nhấn DB để truy xuất toàn bộ nội dung.

Điều này sẽ ảnh hưởng đến kích thước chỉ mục của bạn, vì vậy đó là một cân nhắc khác mà bạn cần lưu ý. Tôi cũng sẽ đặt một bộ nhớ đệm giữa DB và giao diện người dùng để các mục được sử dụng nhiều nhất sẽ không phải chịu toàn bộ chi phí truy cập DB mỗi lần.

+0

Tôi nghĩ Lucene KHÔNG có bộ nhớ đệm trong bộ nhớ. Không? –

0

Có lẽ không phải là tùy chọn tùy thuộc vào số lượng nội dung trong cơ sở dữ liệu của bạn, nhưng những gì tôi đã làm là lưu trữ id db trong chỉ mục tìm kiếm cùng với các thuộc tính mà tôi muốn được lập chỉ mục. Sau đó, trong các lớp dịch vụ của tôi, tôi lưu trữ tất cả dữ liệu cần thiết để hiển thị kết quả tìm kiếm cho tất cả các đối tượng (ví dụ: tên, id db, url của hình ảnh, blurbs mô tả, thông tin truyền thông xã hội). Lớp dịch vụ trả về một từ điển có thể tìm kiếm các đối tượng theo id db và tôi sử dụng id được trả về bởi Lucene.NET để lấy dữ liệu từ bộ nhớ đệm trong bộ nhớ.

Bạn cũng có thể bỏ qua bộ nhớ cache trong bộ nhớ và lưu trữ tất cả các thuộc tính cần thiết để hiển thị kết quả tìm kiếm trong chỉ mục tìm kiếm. Tôi không làm điều này vì bộ nhớ đệm trong bộ nhớ cũng được sử dụng trong các trường hợp khác ngoài tìm kiếm.

Bộ nhớ cache trong bộ nhớ luôn mới trong vòng vài giờ và thời gian duy nhất tôi phải nhấn db là nếu tôi cần lấy dữ liệu chi tiết hơn cho một đối tượng duy nhất (nếu người dùng nhấp vào liên kết cho một đối tượng cụ thể để đi đến trang cho đối tượng đó).

Các vấn đề liên quan