SearchSuggestController.php 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Http\Controllers\Controller;
  4. use Illuminate\Http\Request;
  5. use App\Services\OpenSearchService;
  6. /**
  7. * 返回示例
  8. * 请求:GET /api/v2/suggest?q=慈&type=term&limit=5
  9. * 返回:
  10. * {
  11. "success": true,
  12. "data": {
  13. "suggestions": [
  14. {
  15. "text": "慈悲",
  16. "resource_type": "translation",
  17. "language": "zh-Hans"
  18. },
  19. {
  20. "text": "mettā",
  21. "resource_type": "origin_text",
  22. "language": "pali"
  23. },
  24. {
  25. "text": "compassion",
  26. "resource_type": "translation",
  27. "language": "en-US"
  28. }
  29. ]
  30. }
  31. }
  32. */
  33. class SearchSuggestController extends Controller
  34. {
  35. protected $searchService;
  36. /**
  37. * 构造函数,注入 OpenSearchService
  38. *
  39. * @param \App\Services\OpenSearchService $searchService
  40. */
  41. public function __construct(OpenSearchService $searchService)
  42. {
  43. $this->searchService = $searchService;
  44. }
  45. /**
  46. * Display a listing of suggestions.
  47. *
  48. * 自动建议接口,基于 OpenSearch completion suggester。
  49. * 支持术语、巴利罗马化拼写、页码等建议。
  50. *
  51. * @param \Illuminate\Http\Request $request
  52. * - q (string): 输入的部分文本(必填)
  53. * - type (string): 建议类型,可选值 term|pali_romanized|page_ref,默认 term
  54. * - language (string): 语言过滤,可选
  55. * - limit (int): 返回数量,默认 10,最大 50
  56. *
  57. * @return \Illuminate\Http\JsonResponse
  58. */
  59. public function index(Request $request)
  60. {
  61. $query = $request->input('q', '');
  62. $type = $request->input('type', 'term');
  63. $language = $request->input('language');
  64. $limit = min(50, (int) $request->input('limit', 10));
  65. if (empty($query)) {
  66. return response()->json([
  67. 'success' => false,
  68. 'error' => '缺少参数 q'
  69. ], 400);
  70. }
  71. try {
  72. $rawSuggestions = $this->searchService->suggest($query, $type, $language, $limit);
  73. // 格式化返回结果:包含 text + resource_type + language
  74. $suggestions = collect($rawSuggestions)->map(function ($item) {
  75. return [
  76. 'text' => $item['text'] ?? '',
  77. 'resource_type' => $item['resource_type'] ?? null,
  78. 'language' => $item['language'] ?? null,
  79. ];
  80. })->all();
  81. return response()->json([
  82. 'success' => true,
  83. 'data' => [
  84. 'suggestions' => $suggestions
  85. ]
  86. ]);
  87. } catch (\Exception $e) {
  88. return response()->json([
  89. 'success' => false,
  90. 'error' => $e->getMessage(),
  91. ], 500);
  92. }
  93. }
  94. }