sql >> Database teknologi >  >> RDS >> Mysql

MySQL Full Text Search Mystery

Fra MySQL-dokumenter

  • + Et indledende plustegn angiver, at dette ord skal være til stede i hver række, der returneres.

  • * Stjernen tjener som trunkeringsoperatoren (eller jokertegn). I modsætning til de andre operatorer skal den føjes til ordet, der skal påvirkes. Ord matcher, hvis de begynder med ordet foran *operatoren.

    Hvis et ord er angivet med trunkeringsoperatoren, fjernes det ikke fra en boolsk forespørgsel, selvom det er for kort (som bestemt ud fra indstillingen ft_min_word_len) eller et stopord. Dette sker, fordi ordet ikke ses som for kort eller astopord, men som et præfiks, der skal være til stede i dokumentet i form af et ord, der begynder med præfikset .

I sammenhæng:

MATCH(...) MOD(...)

MATCH (name) AGAINST ('+ski*' IN BOOLEAN MODE) betyder, at du søger efter rækker, hvor et ord i name kolonne skal indeholde ski , og skal begynde med ordet ski .

Fra det sæt, du har sendt, Dartmouth Skiway er det eneste name der overholder disse krav:den indeholder ordet ski , og har ordet ski foran .

Det andet name kolonner, selvom de matcher den første regel:skal indeholde ski , de har ikke forstavelse med ski , som fastsat i din regel. Rækken returneret af din boolske søgning er den eneste med et name kolonne, der indeholder et ord, som begge indeholder ski og er et ord med præfiks af ski .

Som foreslået af ajreal, prøv at mindske ft_min_len_word_setting i my.cnf . Din søgning kan muligvis ikke give de resultater, du forventer, på grund af standardindstillingen. Prøv at reducere den til 3.

WHERE kolonne LIKE %text%

WHERE name LIKE "%ski%" søger efter rækker med name kolonner, der indeholder ski , uanset hvor ordet forekommer.



  1. Sådan opretter du bruger i Oracle og tildeler privilegier

  2. .NET Core 2.0 med MySQL:Den angivne nøgle var for lang; max nøglelængde er 3072 bytes

  3. MySQL - GROUP_CONCAT med joinforbindelser

  4. Hurtigste måde at køre den samme forespørgsel flere gange i SQL Server