Tôi đã nghĩ về nó rất nhiều và tôi nghĩ rằng cách tốt nhất là sử dụng 1 chỉ mục cho mỗi mô hình và lấy tiền của lệnh gọi lại mà bạn có thể chuyển đến ::search()
Dữ liệu lập chỉ mục
Trước tiên, bạn cần sử dụng toSearchableArray()
để chuẩn bị dữ liệu. Tôi sẽ bỏ đặt mọi thuộc tính không cần thiết (như ngày tháng), sau đó lồng nội dung vào ISO của nó.
{
objectID: 1,
en: {
title: "Title in english",
body: "trucated body in english"
},
fr: {
title: "Titre en français",
body: "contenu tronqué en français"
}
}
Xin lưu ý rằng Algolia có giới hạn 10KB cho mỗi bản ghi. Cách tốt nhất để xử lý điều này là cắt bớt các thuộc tính lớn nhất của bạn. Đừng lo lắng, điều đó không ảnh hưởng đến mức độ liên quan . Nếu bạn bỏ lỡ nửa sau của bài viết, thường thì tất cả nội dung liên quan đã có ở phần đầu tiên.
Thiết lập cấu hình Algolia trong trang tổng quan
Sau đó đi đến trang tổng quan của bạn và thêm fr
và en
vào searchableAttributes
.
Tìm kiếm
Bạn có thể hạn chế searchableAttributes
tại thời điểm truy vấn với một lệnh gọi lại được chuyển đến tìm kiếm
$lang = 'en';
Model::search($query, function ($algolia, $query, $options) use ($lang) {
$options = array_merge($options, [
'restrictSearchableAttributes' => [$lang],
]);
return $algolia->search($query, $options);
});
Tôi đã tạo một đặc điểm để đạt được điều gì đó tương tự . Có thể bạn có thể làm điều gì đó tương tự, để có cú pháp dễ sử dụng như:
Model::searchLang($lang, $query);
Sau tất cả những suy nghĩ, tôi thực sự nghĩ rằng đó là cách ít hack nhất để sử dụng Laravel Scout với những ràng buộc của bạn.
Hãy cho tôi biết suy nghĩ của bạn :)