Cách buộc API tìm kiếm để giới thiệu lại một nút / một thực thể


9

Tôi đang làm việc trên Sear API. Thực thể của tôi có nhiều mục và dữ liệu thay đổi theo hành động của người dùng. Tôi không muốn reindex tất cả các mục dữ liệu. Vì vậy, tôi muốn reindex một thực thể sau khi người dùng thực hiện hành động. Tôi đã tìm thấy chủ đề nhưng chỉ dành cho Drupal 7. Vậy với API tìm kiếm cho Drupal 8, làm cách nào để tôi có thể triển khai API tìm kiếm để giới thiệu lại một thực thể? Cách hoặc đoạn mã tôi có thể sử dụng? Xin vui lòng giúp đỡ!

ví dụ: tôi có chỉ mục tìm kiếm với một số trường cơ bản như thế này:

nhập mô tả hình ảnh ở đây

Tôi muốn cập nhật số lượng giá trị bình luận sau khi sử dụng thêm một bình luận mới. Api tìm kiếm mặc định không hỗ trợ điều đó. Và tôi không muốn đợi một cron cập nhật giá trị. Hãy tưởng tượng một lĩnh vực rất quan trọng không giống như số lượng bình luận. Lĩnh vực đó cần cập nhật ngay lập tức.

Câu trả lời:


8

Bạn có thể đi sâu vào mã của search_api để tìm giải pháp cho vấn đề. Xem hàm search_api_entity_update ()search_api_search_api_index_update () . Trong trường hợp số lượng bình luận reindex, bạn có thể thử mã này:

// Example reindex after has new comment at node article id 1
$entity = Node::load(1);
$indexes = ContentEntity::getIndexesForEntity($entity);

foreach ($indexes as $index) {
    // Becarefull with indexes. Just for this case.
    // $datasource_id: entity:node (entity type)
    // $updated_item_ids: 1:en (node ID and Language)
    $index->trackItemsUpdated('entity:node', ['1:en']);
}

Bạn có thể gỡ lỗi trong search_api.module để biết thêm thông tin.


2

Giống như D7, bạn không cần phải đánh dấu ngầm định thực thể được tìm kiếm lại bởi API tìm kiếm. Nó đã làm việc cho bạn.

Trong tệp mô-đun, có một triển khai hook_entity_update () , đảm nhiệm việc lập lại các mục ngay lập tức. Không bắt buộc phải chờ cron chạy.

Tôi đã tạo một trang web trên Simplytest https://du6hi.ply.st (admin / admin) để xác nhận.


cảm ơn vì sự giúp đỡ. Nhưng tôi muốn cập nhật ngay lập tức. Đừng chờ đợi cron để reindex.
Jonh

@Jonh Tôi đọc sai cách thực hiện trong mã. Bạn không cần đợi cron chạy. Các mục được tự động giới thiệu lại. Chỉnh sửa câu trả lời để phản ánh nó.
AjitS

Hãy thử với du6hi.ply.st/seach và thêm nhận xét mới tại nút / 10.
Jonh

Chỉ số tìm kiếm sẽ không bị ảnh hưởng bởi các bình luận. Đó là bởi vì thực thể bình luận không được chọn để được lập chỉ mục bởi nguồn dữ liệu. du6hi.ply.st/admin/config/search/search-api/index/default_index/ mẹo @Jonh
AjitS

Chỉ là một ví dụ chúng ta cần mã để thực hiện khi sử dụng thực hiện một hành động. Cảm ơn đã giúp đỡ thời gian.
Jonh

0

Như được nhận xét bởi @Duncanmoo (D7), có nhiều trường hợp sử dụng khác nhau trong đó bạn có thể muốn lập chỉ mục lại một trang hoặc thực thể trong mã tùy chỉnh.

Trong trường hợp của tôi, các cập nhật thực thể nút có liên quan đã được triển khai như sau:

$node = node_load($nid);
$node->field_search_rank[LANGUAGE_NONE][0]['value'] = $movie->order;
field_attach_presave('node', $node);
field_attach_update('node', $node);
entity_get_controller('node')->resetCache([$node->nid]);

Tuy nhiên, search_api_entity_update () không được kích hoạt để trường cập nhật được lập chỉ mục lại thành Solr, vì hook không nghe trường_attach_update ()

Thay vào đó, tôi đã áp dụng mã tùy chỉnh bổ sung được đề xuất này để hoàn thành việc lập chỉ mục lại trên mỗi mục.

$node = node_load($nid);
$node->field_search_rank[LANGUAGE_NONE][0]['value'] = $movie->order;
field_attach_presave('node', $node);
field_attach_update('node', $node);
entity_get_controller('node')->resetCache([$node->nid]);
// Re-index the node updates : 
search_api_track_item_change('node', array($node->nid));
$combined_id = 'node/' . $node->nid;
search_api_track_item_change('multiple', array($combined_id));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.