mirror of https://github.com/kcal-app/kcal.git
				
				
				
			
		
			
				
	
	
		
			48 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			48 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
| <?php
 | |
| 
 | |
| namespace App\Http\Controllers;
 | |
| 
 | |
| use App\Models\Food;
 | |
| use App\Models\Recipe;
 | |
| use ElasticScoutDriverPlus\Builders\MultiMatchQueryBuilder;
 | |
| use ElasticScoutDriverPlus\Builders\TermsQueryBuilder;
 | |
| use Illuminate\Database\Eloquent\Collection;
 | |
| use Illuminate\Http\JsonResponse;
 | |
| use Illuminate\Http\Request;
 | |
| 
 | |
| class IngredientPickerController extends Controller
 | |
| {
 | |
|     /**
 | |
|      * Search for ingredients.
 | |
|      */
 | |
|     public function search(Request $request): JsonResponse
 | |
|     {
 | |
|         $results = new Collection();
 | |
|         $term = $request->query->get('term');
 | |
|         if (!empty($term)) {
 | |
|             $results = Food::boolSearch()
 | |
|                 ->join(Recipe::class)
 | |
| 
 | |
|                 // Attempt to match exact phrase first.
 | |
|                 ->should('match_phrase', ['name' => $term])
 | |
| 
 | |
|                 // Attempt multi-match search on all relevant fields with search-as-you-type on name.
 | |
|                 ->should((new MultiMatchQueryBuilder())
 | |
|                     ->fields(['name', 'name._2gram', 'name._3gram', 'detail', 'brand', 'source'])
 | |
|                     ->query($term)
 | |
|                     ->type('bool_prefix')
 | |
|                     ->analyzer('simple')
 | |
|                     ->fuzziness('AUTO'))
 | |
| 
 | |
|                 // Attempt to match on any tags in the term.
 | |
|                 ->should((new TermsQueryBuilder())
 | |
|                     ->terms('tags', explode(' ', $term)))
 | |
| 
 | |
|                 // Get resulting models.
 | |
|                 ->execute()
 | |
|                 ->models();
 | |
|         }
 | |
|         return response()->json($results->values());
 | |
|     }
 | |
| }
 |