Сортировка результатов поиска по релевантности в полнотекстовом поиске Laravel в MariaDB

Как я могу сортировать по релевантности моему поисковому запросу в Laravel при выполнении полнотекстового поиска?

Миграция

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    public function up(): void
    {
        Schema::dropIfExists('posts');

        Schema::create('posts',function (Blueprint $table){
            // More columns will be added in next migrations.
            $table->id();
            $table->string('name');
            $table->fulltext(['name']);
        });
    }

    public function down(): void
    {
        Schema::dropIfExists('posts');
    }
};

Модель

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
   use HasFactory;
   protected $table = "posts";
}

Я выполняю полнотекстовый поиск в контроллере следующим образом:

class PostController extends Controller
{
  public function search()
  {
     $searchterm = $request->get('searchterm');
     $qb = Post::query();
     
     if (!empty($searchterm)){
         $qb=$qb->whereFullText(['name'],$searchterm);
     }

     $page = $request->get('page')??1;
     $limit = $request->get('limit')??20;

     $results = $qb->offset(($page - 1) * $limit)
            ->simplePaginate($limit);

     return new JsonResponse($results,200);
  }
}

Однако мне нужно выяснить, как вернуть результаты, упорядоченные по релевантности, в моем контроллере. Я хочу, чтобы наиболее близкие совпадения отображались первыми. Как я могу этого добиться?

В PHP есть встроенные функции для взвешивания спичек. Возможно, вы захотите поиграть с ними. Левенштейн(), аналогичный_текст(), soundex() и т. д.

GetSet 10.04.2024 12:12

Но мои данные хранятся в базе данных, и в базе данных есть встроенные функции для этого.

Dimitrios Desyllas 11.04.2024 09:43
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
97
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Подход к размещению необработанных частей запроса, таких как:

class PostController extends Controller
{
  public function search()
  {
     $searchterm = $request->get('searchterm');
     $qb = Post::query();
     
     if (!empty($searchterm)){
        $qb=$qb->whereRaw("MATCH(name) AGAINST(? IN BOOLEAN MODE)",["*".$searchterm."*"])
                ->orderByRaw("MATCH(name) AGAINST(?) DESC", ["*".$searchterm."*"]);
     }

     $page = $request->get('page')??1;
     $limit = $request->get('limit')??20;

     $results = $qb->offset(($page - 1) * $limit)
            ->simplePaginate($limit);

     return new JsonResponse($results,200);
  }
}

Я использовал whereRaw и orderByRaw для сортировки и фильтрации результатов. Это применимо ТОЛЬКО при использовании mysql или mariadb, и это только его недостаток, особенно при реализации приложения, доступного для нескольких rdbms (например, ваше приложение поддерживает как mysql, так и postgres).

Другие вопросы по теме