2012-06-29 36 views
9

Chúng tôi sử dụng Sunspot Solr để lập chỉ mục và tìm kiếm trong ứng dụng Ruby on Rails của chúng tôi.Cách chỉ reindex một số đối tượng trong Sunspot Solr

Chúng tôi muốn kết nối lại một số đối tượng và ai đó vô tình chạy lệnh Product.reindex từ Bảng điều khiển Rails. Kết quả là việc lập chỉ mục tất cả các sản phẩm bắt đầu từ đầu và danh mục của chúng tôi xuất hiện trống trong khi lập chỉ mục đang diễn ra.

Vì chúng tôi có một lượng lớn dữ liệu, việc tái lập chỉ mục đã được thực hiện ba ngày cho đến nay. Sáng nay khi tôi kiểm tra tiến trình tái lập, có vẻ như đã có một mục nhập dữ liệu bị hỏng khiến cho việc tái lập chỉ dừng lại mà không hoàn thành.

Tôi không thể khởi động lại toàn bộ hoạt động Product.reindex vì quá trình này mất quá nhiều thời gian. Có cách nào để chỉ chạy reindexing trên các sản phẩm được chọn không? Tôi muốn chọn một loạt các sản phẩm không được lập chỉ mục và sau đó chỉ cần chạy lập chỉ mục trên thise. Làm thế nào tôi có thể thêm một sản phẩm vào chỉ mục mà không phải chạy một reindex hoàn chỉnh của toàn bộ tập dữ liệu?

+0

Khi bạn nói - Làm cách nào tôi có thể thêm một sản phẩm vào chỉ mục mà không .. ", ý của bạn là một cột/trường đơn lẻ hoặc một tập hợp con của tài liệu? – user1452132

Trả lời

7

Tôi đã tìm thấy câu trả lời trên https://github.com/sunspot/sunspot#reindexing-objects

Bất cứ khi nào một đối tượng được lưu, nó sẽ tự động lập chỉ mục lại như một phần của tiết kiệm callbacks. Vì vậy, tất cả những gì cần thiết là thêm tất cả các đối tượng cần reindexing vào một mảng và sau đó lặp qua mảng, gọi lưu trên từng đối tượng. Điều này đã cập nhật thành công các đối tượng cần thiết trong chỉ mục.

+0

Làm thế nào bạn biết cái nào chưa được lập chỉ mục? – kidbrax

+0

Chúng tôi đã thực hiện một vài kiểm tra tại chỗ thủ công. Chúng tôi biết rằng các reindex bị rơi đôi khi sau khi thực hiện các sản phẩm từ năm 2011, vì vậy chúng tôi đã kiểm tra thủ công một số sản phẩm của chúng tôi từ năm 2012. Sau đó, chúng tôi đã thực hiện các truy vấn trong Rails console để xây dựng một mảng chứa các sản phẩm này và lưu chúng lại, kích hoạt callbacks. – Stanley

+1

Nếu reindexing đang thực hiện việc này lâu thì có thể bạn đang làm điều đó một cách ngây thơ, mà không tính đến bất kỳ liên kết nào bạn đang sử dụng trong các định nghĩa tìm kiếm. Đây là cách tác vụ cào tích hợp hoạt động, và nó rất chậm. Tuy nhiên, lệnh reindex có thể sử dụng ActiveRecord, cho phép hiệu quả cao hơn nhiều. Tôi lấy chỉ số đầy đủ từ 15 phút xuống còn 15 giây. Hãy thử cú pháp này: '' 'Book.solr_reindex (: batch_size => 1000,: include => [: author, {: chapter =>: paragraphs}])' '' Ngoài ra, hãy xem liệu bạn có cần thiết cho phép một phần từ không tìm kiếm, thực sự làm lớn chỉ mục. –

12

Sunspot không lập chỉ mục một đối tượng trong lưu gọi lại để bạn có thể lưu từng đối tượng nhưng có thể kích hoạt các cuộc gọi lại khác. Một cách chính xác hơn để làm điều đó sẽ là

Sunspot.index [post1, post2] 
Sunspot.commit 

hoặc với autocommit

Sunspot.index! [post1, post2] 

Bạn thậm chí có thể vượt qua trong quan hệ đối tượng như họ chỉ là một mảng quá

Sunspot.index! post1.comments 
Các vấn đề liên quan