2
0

SearchController.php 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. <?php
  2. namespace App\Http\Controllers\Library;
  3. use App\Http\Controllers\Controller;
  4. use Illuminate\Http\Request;
  5. use App\Services\OpenSearchService;
  6. use App\DTO\Search\SearchDataDTO;
  7. use Carbon\Carbon;
  8. class SearchController extends Controller
  9. {
  10. public function search(Request $request)
  11. {
  12. $query = trim($request->input('q', ''));
  13. $category = $request->input('category', 'all');
  14. $page = max(1, (int) $request->input('page', 1));
  15. $perPage = 10;
  16. $lang = $request->input('language');
  17. $search = app(OpenSearchService::class);
  18. // 组装搜索参数
  19. $params = [
  20. 'query' => $query,
  21. 'pageSize' => $perPage,
  22. 'page' => $page,
  23. 'language' => $lang,
  24. 'resourceType' => $request->input('resource_type'),
  25. ];
  26. $result = $search->search($params);
  27. $dto = SearchDataDTO::fromArray($result);
  28. $results = [];
  29. foreach ($dto->hits->items as $key => $item) {
  30. $results[] = [
  31. 'id' => $item->resId,
  32. 'title' => $item->title,
  33. 'type' => $item->type,
  34. 'lang' => $item->language,
  35. 'category' => $item->type,
  36. 'quality' => 'featured',
  37. 'snippet' => !empty($item->highlight) ? $item->highlight : $item->content,
  38. 'updated' => Carbon::parse($item->updated)->format('Y-m-d'),
  39. ];
  40. }
  41. $aggregations = $dto->aggregations->toArray();
  42. unset($aggregations['resource_type']);
  43. // 分页对象(兼容 Blade paginator 风格)
  44. $pagination = [
  45. 'total' => $dto->hits->total,
  46. 'per_page' => $perPage,
  47. 'current_page' => $page,
  48. 'last_page' => max(1, (int) ceil($dto->hits->total / $perPage)),
  49. ];
  50. return view('library.search', [
  51. 'lang' => $lang,
  52. 'query' => $query,
  53. 'results' => $results,
  54. 'pagination' => $pagination,
  55. 'category' => 'all',
  56. 'filters' => $aggregations,
  57. 'types' => $this->types(),
  58. 'recentUpdates' => [],
  59. ]);
  60. }
  61. // ── Helpers ──────────────────────────────────────────────────
  62. private function types(): array
  63. {
  64. return [
  65. ['slug' => 'term', 'label' => '百科词条'],
  66. ['slug' => 'tipitaka', 'label' => '巴利三藏'],
  67. ['slug' => 'article', 'label' => '文章文集'],
  68. ['slug' => 'course', 'label' => '课程'],
  69. ['slug' => 'dictionary', 'label' => '字典'],
  70. ];
  71. }
  72. }