Maison  >  Questions et réponses  >  le corps du texte

Donner la priorité aux résultats de recherche en texte intégral pour les « meilleures correspondances » pour les correspondances exactes, y compris les tables de jointure

Que dois-je modifier dans la requête pour obtenir une correspondance exacte en premier lieu ?

Par exemple, n'importe qui saisit happy song dans le formulaire de recherche, il obtiendra désormais ce résultat..

Joyeux enfant

Jours heureux

Des gens heureux

Chanson joyeuse

Bonne station

...

C'est ma requête..

SELECT  `artist`, `song`, `genre`, `pass`, `id`
        FROM  `songs`
        JOIN  `artists` USING (`pass`)
        WHERE  MATCH(`artist`) AGAINST("happy song")
          OR  MATCH(`song`, `genre`) AGAINST("happy song")
        ORDER BY  `song` ASC
        LIMIT  0,30
') or die(mysql_error($_connect));```

Thank you!

EDIT 03.07.22
Changed query to:<br>
```$query = mysqli_query($_connect, '
    SELECT  `artist`, `song`, `genre`, `pass`, `id`
        FROM  `songs`
        JOIN  `artists` USING (`pass`)
        WHERE  MATCH(`artist`) AGAINST("happy song")
          OR  MATCH(`song`, `genre`) AGAINST("happy song")
        ORDER BY  `song` = "happy song" DESC
') or die(mysql_error($_connect));```

The output is the same, result with only "song" in the text are above in the result when searched for "happy song"

**EDIT 14.7.22**
**Table Artists:**

CREATE TABLE `artists` (
  `artist` varchar(40) NOT NULL,
  `pass` int(10) UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 PACK_KEYS=1;

ALTER TABLE `artists`
  ADD PRIMARY KEY (`pass`),
  ADD UNIQUE KEY `uni_que` (`artist`) USING BTREE;
ALTER TABLE `artists` ADD FULLTEXT KEY `full_txt` (`artist`);
COMMIT;

**Table Songs:**

    CREATE TABLE `songs` (
      `song` varchar(80) NOT NULL,
      `tags` varchar(40) NOT NULL,
      `style` varchar(20) NOT NULL,
      `pass` bigint(20) UNSIGNED NOT NULL,
      `id` bigint(20) UNSIGNED NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 PACK_KEYS=1;
    
    ALTER TABLE `songs`
      ADD PRIMARY KEY (`id`);
    ALTER TABLE `songs` ADD FULLTEXT KEY `song` (`song`,`tags`,`style`);
    COMMIT;

P粉002572690P粉002572690203 Il y a quelques jours379

répondre à tous(1)je répondrai

  • P粉116654495

    P粉1166544952024-03-30 00:57:29

    Vous demandez actuellement ORDER BY 歌曲 ASC Trier par ordre alphabétique

    changé en ORDER BY MATCH(...) AGAINST(...) DESC

    Cela pourrait placer « Une chanson sur un enfant heureux » en tête de liste. Cela dit, s'il faut d'abord « chanter », il faut travailler plus dur :

    SELECT ...
        FROM ...
        WHERE ...
        ORDER BY song = "happy song" DESC,
                 MATCH(...) AGAINST (...)

    (Puisque vous avez OR et plusieurs colonnes impliquées, la requête peut devenir assez déroutante.)

    Si vous ne voulez pas de chansons avec un seul mot, consultez l'opérateur +, ou

    MATCH(song) AGAINST('+"happy song"')

    Notez l’utilisation intentionnelle de guillemets.

    répondre
    0
  • Annulerrépondre