2013-08-15 33 views
5

Tôi sử dụng chức năng tìm kiếm của marklogic để tạo trang tìm kiếm. Tính đến thời điểm hiện tại, tôi đang chạy XQuery để nhận kết quả tìm kiếm qua search:search. Như một ví dụ về xương trần, hãy xem mã này:Mối quan hệ dữ liệu dưới dạng ngữ cảnh tìm kiếm trong Marklogic

xquery version "1.0-ml"; 
import module namespace search = "http://marklogic.com/appservices/search" 
     at "/MarkLogic/appservices/search/search.xqy"; 

search:search('test', 
    <options xmlns='http://marklogic.com/appservices/search'></options>) 

Tìm kiếm này tìm kiếm tất cả nội dung trong cơ sở dữ liệu, điều này tốt trong nhiều trường hợp. Trong các trường hợp khác, tôi tìm kiếm dựa trên các bộ sưu tập với cts:collection-query. Các bộ sưu tập đóng vai trò là ngữ cảnh tuyệt vời cho các tìm kiếm của tôi.

Bây giờ, tôi muốn giới hạn kết quả tìm kiếm của mình dựa trên mối quan hệ dữ liệu trong tài liệu "chính". Tài liệu "chính" này có tất cả các mối quan hệ trong một mô hình đối tượng. Nếu mô hình đối tượng đó có tham chiếu đến một tài liệu, tôi muốn tài liệu đó được bao gồm trong tìm kiếm. Về cơ bản, tài liệu "chính"/mô hình là ngữ cảnh của tìm kiếm.

Tôi đã cố gắng suy nghĩ một số ý tưởng về cách tốt nhất để làm điều này. Dưới đây là những gì tôi đã đưa ra cho đến nay, nhưng tôi đã hy vọng một người quen thuộc hơn với Marklogic (Tôi chỉ làm việc với nó trong 6 tháng) có thể dẫn tôi theo một hướng tốt:

  1. Thêm tất cả tài liệu được tham chiếu trong tài liệu mô hình với một bộ sưu tập duy nhất. Sau đó, tìm kiếm truy vấn dựa trên bộ sưu tập đó. Tuy nhiên, các bộ sưu tập sẽ phải được cập nhật khi mô hình thay đổi.
  2. Tải tài liệu mô hình vào mã của tôi và nhận danh sách tất cả các tham chiếu và thêm chúng vào truy vấn theo cts:document-query (hoặc tương tự).
  3. Tái cấu trúc khái niệm "mô hình" của tôi bằng cách nào đó trong tài liệu XML của tôi.

Cảm ơn mọi đầu vào hoặc đề xuất.

+1

Đã kết thúc bằng # 1. # 2 là khoảng 3x chậm hơn trong cơ sở dữ liệu của tôi. Ngoài ra, vì mô hình mối quan hệ rộng lớn trong XML của tôi, mã cho # 2 bắt đầu trở nên xấu xí. Với các bộ sưu tập tại chỗ, tôi có thể cho phép tất cả các nhà phát triển sử dụng lại một cách dễ dàng. Tôi rất có thể sẽ triển khai các trình kích hoạt trong tương lai. – Paul

Trả lời

2

Tất cả những ý tưởng này sẽ hoạt động tốt. Việc quyết định sử dụng tùy thuộc vào các chi tiết cụ thể của ứng dụng của bạn, chẳng hạn như mức độ thường xuyên của tài liệu chính được thay đổi (và bạn có quyền kiểm soát nó), mức độ khó khăn của việc sửa đổi XML của bạn.

Một điều cần xem xét là bạn có thể đặt trình kích hoạt trên các cập nhật tài liệu có thể thực hiện các thay đổi thu thập tự động.

-David Lee

+0

Tôi thích ý tưởng thêm trình kích hoạt. – Paul

3

Tôi bắt đầu với (2) và xem hiệu suất có đủ tốt hay không. Điều đó sẽ phụ thuộc vào trường hợp sử dụng của bạn, nhưng tôi hy vọng nó sẽ tốt cho hàng ngàn hoặc thậm chí hàng trăm ngàn tài liệu tham khảo.

Đảm bảo sử dụng một cụm từ đơn cts:document-query($list-of-references). Điều đó sẽ nhanh hơn cts:or-query(for $ref in $list-of-references return cts:document-query($ref)), vì việc tra cứu chỉ mục có thể là một lần truyền thay vì N lần tra cứu riêng biệt.

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