2009-12-13 23 views
12

Gần đây tôi đã sử dụng chức năng của Wikipedia "Liên kết ở đây" (được tìm thấy trong phần tử "Hộp công cụ" trong trình đơn bên trái của bất kỳ mục nhập nào) và tôi bắt đầu tự hỏi chức năng này hoạt động như thế nào.
Tôi đoán rằng tìm kiếm thông qua tất cả các bài viết sau khi liên kết không phải là rất hiệu quả, do đó, tất cả các liên kết được lưu trữ trong một cơ sở dữ liệu riêng biệt? Nếu vậy, điều này có được cập nhật khi một bài viết được chỉnh sửa hoặc một thời gian khác không?Hoạt động "Liên kết gì ở đây" của Wikipedia hoạt động?

Cảm ơn.

Trả lời

15

Bất cứ khi nào một trang trên Wikipedia được chỉnh sửa, nó được đặt vào hàng đợi nền để xử lý thêm. Một số trong những điều đó xảy ra có:

  • cập nhật đến "những gì liên kết ở đây" cho các trang khác
  • cập nhật cho trang index loại
  • cập nhật vào bộ nhớ cache toàn cầu của các trang hiện có để giúp render "redlinks "trên các trang khác

Loại thông tin này không cần phải được cập nhật ngay khi bạn nhấn" Gửi ", do đó hàng đợi xử lý nền sẽ xử lý nó. Đôi khi hàng đợi này có thể phát triển khá lớn, nhưng thông thường nó vẫn được kiểm soát.

Bạn có thể tìm thêm thông tin về điều này tại Help:Job Queue.

1

Cách tôi sẽ thực hiện là nhận tất cả các liên kết sau khi chỉnh sửa, sau đó lưu trữ chúng trong một bảng riêng biệt với khóa là url hiện tại. Sau đó, tôi chỉ có thể truy vấn bảng bằng URL mà người dùng hiện đang truy cập và nhận tất cả các liên kết đã được đánh dấu là liên kết đến trang đó.

Nó có thể sẽ không đơn giản như vậy nhưng đó là ý tưởng chung, đơn giản. Có lẽ thay vì URL nó sẽ khôn ngoan hơn để lưu trữ ID trang và như vậy.

1

Sẽ có ý nghĩa đối với "sự kiện cập nhật" của một bài viết để kích hoạt trình phân tích cú pháp liên kết vì đây là lần duy nhất một bài viết sẽ thay đổi. Sự kiện cập nhật lần lượt sẽ chỉ quét các liên kết và truy vấn db cho các liên kết nội bộ với wikipedia.

Tôi tưởng tượng mỗi trang có khóa chính và một bảng liên kết đơn giản được tạo để liên kết các trang PK với tất cả các trang khác liên kết đến nó.

Có khả năng một số bit bổ sung được thêm vào để hỗ trợ hiệu suất trên một trang web lớn như vậy nhưng đó sẽ là cơ học cơ bản.

2

Bạn có thể nghĩ đây là vấn đề chung chung hơn. Nếu bạn có một liên kết (hoặc con trỏ hoặc bất cứ điều gì) từ A đến B, làm thế nào B có thể biết rằng A có một liên kết trỏ đến đó?

Câu trả lời là lưu trữ thông tin vào mục tiêu vị trí. Tức là, khi trang A được chỉnh sửa và liên kết được tạo thành B, đồng thời lưu trữ thông tin về nguồn liên kết tới B (liên kết ngược). Trong trường hợp trang web, liên kết ngược có thể được viết trực tiếp vào trang "liên kết ở đây". Chỉ cần một lần viết vào một trang tĩnh. Không cần thực hiện bất kỳ tìm kiếm hoặc truy vấn cơ sở dữ liệu nào.

2

Pseudo mã cho một thuật toán đơn giản mà sẽ làm điều đó

procedure updateChanges(editedPage): 
    for_each(link on editedPage): 
     if(link is not to another wikipedia page): continue 
     pageToUpdate = open(link): 
     if(pageToUpdate->whatLinksHere.contains(editedPage)): continue 
     pageToUpdate->whatLinksHere.insert(editedPage) 

Xin lỗi tôi vừa hoàn thành lớp các thuật toán của tôi vì vậy tôi có một sự thôi thúc để viết mã giả.Trong bối cảnh này, thủ tục updateChanges() sẽ được gọi là trong giai đoạn "cập nhật 'những liên kết ở đây' cho các trang khác" mà Greg Hewgill đề cập đến.

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