Maison > base de données > tutoriel mysql > Tutoriel de base de MySQL 10 - Fonction Fonction de recherche en texte intégral

Tutoriel de base de MySQL 10 - Fonction Fonction de recherche en texte intégral

黄舟
Libérer: 2017-02-24 11:44:32
original
1768 Les gens l'ont consulté

Syntaxe :

  • MATCH (col1,col2,...) CONTRE (expr [EN MODE BOOLÉEN | AVEC EXPANSION DE REQUÊTE])

MySQL prend en charge les fonctions d'indexation et de recherche en texte intégral. L'index de texte intégral de type FULLTEXT dans MySQL. Les index FULLTEXT ne sont disponibles que sur les tables MyISAM ; ils peuvent être créés à partir de colonnes CHAR, VARCHAR ou TEXT dans le cadre d'une instruction CREATE TABLE, ou ajoutés ultérieurement à l'aide de ALTER TABLE ou CREATE INDEX. Pour les ensembles de données plus volumineux, il est plus rapide de saisir vos données dans une table qui ne possède pas d'index FULLTEXT, puis de créer l'index, plutôt que de saisir les données dans un index FULLTEXT existant.

La recherche en texte intégral s'effectue avec la fonction MATCH().

mysql> CREATE TABLE articles (    
->   id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,    
->   title VARCHAR(200),    
->   body TEXT,    
->   FULLTEXT (title,body)    
-> );Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO articles (title,body) VALUES    
-> ('MySQL Tutorial','DBMS stands for DataBase ...'),    
-> ('How To Use MySQL Well','After you went through a ...'),    
-> ('Optimizing MySQL','In this tutorial we will show ...'),    
-> ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),    
-> ('MySQL vs. YourSQL','In the following database comparison ...'),    
-> ('MySQL Security','When configured properly, MySQL ...');Query OK, 6 rows affected (0.00 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM articles    
-> WHERE MATCH (title,body) AGAINST ('database');
+----+-------------------+------------------------------------------+
| id | title             | body          |
+----+-------------------+------------------------------------------+
|  5 | MySQL vs. YourSQL | In the following database comparison ... |
|  1 | MySQL Tutorial    | DBMS stands for DataBase ...            |
+----+-------------------+------------------------------------------+
2 rows in set (0.00 sec)
Copier après la connexion

La fonction MATCH() effectue une recherche en langage naturel dans la base de données pour une chaîne. Une base de données est un ensemble de 1 ou 2 colonnes contenues dans FULLTEXT. La chaîne de recherche est donnée en argument à AGAINST(). Pour chaque ligne du tableau, MATCH() renvoie une valeur de corrélation, c'est-à-dire une mesure de similarité entre la chaîne recherchée et le texte de cette ligne dans la colonne spécifiée du tableau MATCH().

Par défaut, les recherches sont effectuées sans tenir compte de la casse. Toutefois, vous pouvez effectuer une recherche en texte intégral sensible à la casse en utilisant un tri binaire sur les colonnes indexées. Par exemple, vous pouvez attribuer une méthode de tri latin1_bin à une colonne qui utilise le jeu de caractères latin1, ce qui rend les recherches en texte intégral sensibles à la casse.

Comme dans l'exemple ci-dessus, lorsque MATCH() est utilisé dans une instruction WHERE, la valeur pertinente est un nombre à virgule flottante non négatif. Une corrélation nulle signifie aucune similitude. Le calcul de pertinence est basé sur le nombre de mots dans la ligne, le nombre d'uniques dans la ligne, le nombre total de mots dans la base de données et le nombre de fichiers (lignes) contenant le mot particulier.

Pour la recherche en texte intégral en langage naturel, il est nécessaire que les colonnes nommées dans la fonction MATCH() soient les mêmes que les colonnes contenues dans certains index FULLTEXT de votre table. Pour la requête ci-dessus, veuillez noter que les colonnes nommées dans la fonction MATCH() (titre et texte intégral) sont les mêmes que les colonnes de l'index FULLTEXT de la table article. Si vous souhaitez rechercher le titre et le texte intégral séparément, vous devez créer un index FULLTEXT sur chaque colonne.

Vous pouvez également exécuter une recherche booléenne ou une recherche en utilisant l'expansion des requêtes.

L'exemple ci-dessus montre essentiellement comment utiliser la fonction MATCH() qui renvoie les lignes dans un ordre décroissant de corrélation. L'exemple suivant montre comment récupérer explicitement la valeur pertinente. L'ordre des lignes renvoyées est incertain car l'instruction SELECT ne contient pas de clause WHERE ou ORDER BY :

mysql> SELECT id, MATCH (title,body) AGAINST ('Tutorial')    
-> FROM articles;
+----+-----------------------------------------+
| id | MATCH (title,body) AGAINST ('Tutorial') |
+----+-----------------------------------------+
|  1 |                        0.65545833110809 |
|  2 |                                       0 |
|  3 |                        0.66266459226608 |
|  4 |                                       0 |
|  5 |                                       0 |
|  6 |                                       0 |
+----+-----------------------------------------+
6 rows in set (0.00 sec)
Copier après la connexion

L'exemple suivant est plus compliqué. La requête renvoie les valeurs pertinentes, en triant les lignes par ordre décroissant de pertinence. Pour obtenir ce résultat, vous devez spécifier MATCH() deux fois : une fois dans la liste SELECT et une fois dans la clause WHERE. Cela n'entraîne aucune maintenance supplémentaire car l'optimiseur MySQL remarque que les deux appels MATCH() sont identiques et n'active le code de recherche en texte intégral qu'une seule fois.

mysql> SELECT id, body, MATCH (title,body) AGAINST    
-> ('Security implications of running MySQL as root') AS score    
-> FROM articles WHERE MATCH (title,body) AGAINST    
-> ('Security implications of running MySQL as root');
+----+-------------------------------------+-----------------+
| id | body                                | score           |
+----+-------------------------------------+-----------------+
|  4 | 1. Never run mysqld as root. 2. ... | 1.5219271183014 |
|  6 | When configured properly, MySQL ... | 1.3114095926285 |
+----+-------------------------------------+-----------------+
2 rows in set (0.00 sec)
Copier après la connexion

Il y a 2 lignes dans le tableau (0,00 seconde)

L'exécution MySQL FULLTEXT traite toute séquence de prototypes de caractères d'un seul mot (lettres, chiffres et parties de soulignement) comme un mot . Cette séquence peut également contenir des guillemets simples ('), mais il n'y en aura pas plus d'un sur une ligne. Cela signifie que aaa'bbb sera traité comme un seul mot, tandis que aaa''bbb sera traité comme 2 mots. Les guillemets simples avant ou après un mot seront supprimés par l'analyseur FULLTEXT ; « aaa'bbb » deviendra aaa'bbb.

L'analyseur FULLTEXT détermine où commence et se termine un mot en recherchant certains délimiteurs, tels que ' ' (espaceur), , (virgule) et (point). Si les mots ne sont pas séparés par des délimiteurs (comme en chinois), l'analyseur FULLTEXT ne peut pas déterminer les positions de début et de fin d'un mot. Afin de pouvoir ajouter des mots ou d'autres termes indexés à un index FULLTEXT dans une telle langue, vous devez les prétraiter afin qu'ils soient séparés par un délimiteur arbitraire tel que ".

Certains mots seront ignorés dans recherche en texte intégral :

  • Tout mot trop court sera ignoré. La longueur minimale par défaut d'un mot trouvé par la recherche en texte intégral est

    . >
  • Les mots dans les mots vides sont ignorés. Un mot comme « le » ou « certains » est trop courant pour être considéré comme sémantique. Il existe un mot vide intégré. Il peut être remplacé par des listes définies par l'utilisateur
  • .

  • Chaque mot correct dans le vocabulaire et la requête est mesuré en fonction de son importance dans le vocabulaire et la requête. De cette manière, un mot qui apparaît dans de nombreux documents a une importance moindre (et même de nombreux mots l'ont). importance nulle) en raison de sa valeur sémantique inférieure dans ce vocabulaire particulier. Au contraire, si le mot est rare, il obtient alors une importance plus élevée. L'importance des mots est alors combinée et utilisée pour calculer la pertinence de la ligne.

    这项技术最适合同大型词库一起使用 (事实上, 此时它经过仔细的调整 )。对于很小的表,单词分布并不能充分反映它们的语义价值, 而这个模式有时可能会产生奇特的结果。例如, 虽然单词 “MySQL” 出现在文章表中的每一行,但对这个词的搜索可能得不到任何结果:

    mysql> SELECT * FROM articles

    -> WHERE MATCH (title,body) AGAINST ('MySQL');

    找不到搜索的词(0.00 秒)

    这个搜索的结果为空,原因是单词 “MySQL” 出现在至少全文的50%的行中。 因此, 它被列入停止字。对于大型数据集,使用这个操作最合适不过了----一个自然语言问询不会从一个1GB 的表每隔一行返回一次。对于小型数据集,它的用处可能比较小。

    一个符合表中所有行的内容的一半的单词查找相关文档的可能性较小。事实上, 它更容易找到很多不相关的内容。我们都知道,当我们在因特网上试图使用搜索引擎寻找资料的时候,这种情况发生的频率颇高。可以推论,包含该单词的行因其所在特别数据集 而被赋予较低的语义价值。 一个给定的词有可能在一个数据集中拥有超过其50%的域值,而在另一个数据集却不然。

    当你第一次尝试使用全文搜索以了解其工作过程时,这个50% 的域值提供重要的蕴涵操作:若你创建了一个表,并且只将文章的1、2行插入其中, 而文中的每个单词在所有行中出现的机率至少为 50% 。那么结果是你什么也不会搜索到。一定要插入至少3行,并且多多益善。需要绕过该50% 限制的用户可使用布尔搜索代码。

    1. 布尔全文搜索

    利用IN BOOLEAN MODE修改程序, MySQL 也可以执行布尔全文搜索:

    mysql> SELECT * FROM articles WHERE MATCH (title,body)    
    -> AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);
    +----+-----------------------+-------------------------------------+
    | id | title                 | body                                |
    +----+-----------------------+-------------------------------------+
    |  1 | MySQL Tutorial        | DBMS stands for DataBase ...        |
    |  2 | How To Use MySQL Well | After you went through a ...        |
    |  3 | Optimizing MySQL      | In this tutorial we will show ...   |
    |  4 | 1001 MySQL Tricks     | 1. Never run mysqld as root. 2. ... |
    |  6 | MySQL Security        | When configured properly, MySQL ... |
    +----+-----------------------+-------------------------------------+
    Copier après la connexion

    这个问询检索所有包含单词“MySQL”的行,但检索包含单词“YourSQL”的行。

    布尔全文搜索具有以下特点:

    • 它们不使用 50% 域值。.

    • 它们不会按照相关性渐弱的顺序将行进行分类。你可以从上述问询结果中看到这一点:相关性最高的行是一个包含两个“MySQL” 的行,但它被列在最后的位置,而不是开头位置。

    • 即使没有FULLTEXT,它们仍然可以工作,尽管这种方式的搜索执行的速度非常之慢。

    • 最小单词长度全文参数和最大单词长度全文参数均适用。

    • 停止字适用。

    布尔全文搜索的性能支持以下操作符:

    • +

    一个前导的加号表示该单词必须 出现在返回的每一行的开头位置。

    • -

    一个前导的减号表示该单词一定不能出现在任何返回的行中。

    • (无操作符)

    在默认状态下(当没有指定 + 或–的情况下),该单词可有可无,但含有该单词的行等级较高。这和MATCH() ... AGAINST()不使用IN BOOLEAN MODE修改程序时的运作很类似。

    • > <

    这两个操作符用来改变一个单词对赋予某一行的相关值的影响。 > 操作符增强其影响,而 <操作符则减弱其影响。请参见下面的例子。

    • ( )

    括号用来将单词分成子表达式。括入括号的部分可以被嵌套。

    • ~

    一个前导的代字号用作否定符, 用来否定单词对该行相关性的影响。 这对于标记“noise(无用信息)”的单词很有用。包含这类单词的行较其它行等级低,但因其可能会和-号同时使用,因而不会在任何时候都派出所有无用信息行。

    • *

    星号用作截断符。于其它符号不同的是,它应当被追加到要截断的词上。

    • "

    一个被括入双引号的短语 (‘"’) 只和字面上包含该短语输入格式的行进行匹配。全文引擎将短语拆分成单词,在FULLTEXT索引中搜索该单词。 非单词字符不需要严密的匹配:短语搜索只要求符合搜索短语包含的单词且单词的排列顺序相同的内容。例如, "test phrase" 符合 "test, phrase"。

    若索引中不存在该短语包含的单词,则结果为空。例如,若所有单词都是禁用词,或是长度都小于编入索引单词的最小长度,则结果为空。

    以下例子展示了一些使用布尔全文符号的搜索字符串:

    • 'apple banana'

    寻找包含至少两个单词中的一个的行。

    • '+apple +juice'

    寻找两个单词都包含的行。

    • '+apple macintosh'

    寻找包含单词“apple”的行,若这些行也包含单词“macintosh”, 则列为更高等级。

    • '+apple -macintosh'

    寻找包含单词“apple” 但不包含单词 “macintosh”的行。

    • '+apple +(>turnover

    寻找包含单词“apple”和“turnover” 的行,或包含“apple” 和“strudel”的行 (无先后顺序),然而包含 “apple turnover”的行较包含“apple strudel”的行排列等级更为高。

    • 'apple*'

    寻找包含“apple”、“apples”、“applesauce”或“applet”的行。

    • '"some words"'

    寻找包含原短语“some words”的行 (例如,包含“some words of wisdom” 的行,而非包含 “some noise words”的行)。注意包围词组的‘"’ 符号是界定短语的操作符字符。它们不是包围搜索字符串本身的引号。

    2. 全文搜索带查询扩展

    全文搜索支持查询扩展功能 (特别是其多变的“盲查询扩展功能” )。若搜索短语的长度过短, 那么用户则需要依靠全文搜索引擎通常缺乏的内隐知识进行查询。这时,查询扩展功能通常很有用。例如, 某位搜索 “database” 一词的用户,可能认为“MySQL”、“Oracle”、“DB2” and “RDBMS”均为符合 “databases”的项,因此都应被返回。这既为内隐知识。

    在下列搜索短语后添加WITH QUERY EXPANSION,激活盲查询扩展功能(即通常所说的自动相关性反馈)。它将执行两次搜索,其中第二次搜索的搜索短语是同第一次搜索时找到的少数顶层文件连接的原始搜索短语。这样,假如这些文件中的一个 含有单词 “databases” 以及单词 “MySQL”, 则第二次搜索会寻找含有单词“MySQL” 的文件,即使这些文件不包含单词 “database”。下面的例子显示了这个不同之处:

    mysql> SELECT * FROM articles   
     -> WHERE MATCH (title,body) AGAINST (&#39;database&#39;);
    +----+-------------------+------------------------------------------+
    | id | title             | body                                     |
    +----+-------------------+------------------------------------------+
    |  5 | MySQL vs. YourSQL | In the following database comparison ... |
    |  1 | MySQL Tutorial    | DBMS stands for DataBase ...             |
    +----+-------------------+------------------------------------------+
    2 rows in set (0.00 sec)
    
    mysql> SELECT * FROM articles    
    -> WHERE MATCH (title,body)    
    -> AGAINST (&#39;database&#39; WITH QUERY EXPANSION);
    +----+-------------------+------------------------------------------+
    | id | title             | body                                     |
    +----+-------------------+------------------------------------------+
    |  1 | MySQL Tutorial    | DBMS stands for DataBase ...             |
    |  5 | MySQL vs. YourSQL | In the following database comparison ... |
    |  3 | Optimizing MySQL  | In this tutorial we will show ...        |
    +----+-------------------+------------------------------------------+
    3 rows in set (0.00 sec)
    Copier après la connexion

    另一个例子是Georges Simenon 搜索关于Maigret的书籍, 这个用户不确定“Maigret”一词的拼法。若不使用查询扩展而搜索“Megre and the reluctant witnesses” 得到的结果只能是的“Maigret and the Reluctant Witnesses” 。 而带有查询扩展的搜索会在第二遍得到带有“Maigret”一词的所有书名。

    注释: 盲查询扩展功能很容易返回非相关文件而增加无用信息,因此只有在查询一个长度很短的短语时才有必要使用这项功能。

    3. 全文停止字

    以下表列出了默认的全文停止字:

    a estcapableenvironci-dessusselon
    en conséquenceà traversen faitaprèsaprès
    encorecontreil n'est pastoutpermettre
    permetpresqueseulavecdéjà
    aussi bien quetoujoursje suisparmi
    parmiunetun autren'importe lequel
    n'importe quide toute façonn'importe quin'importe quoide toute façon
    de toute façonn'importe oùà partapparaître apprécier
    appropriésontne sont pasautourcomme
    à partdemanderdemanderassociéà
    disponiblepartirterriblementêtredevenu
    parce quedevenirdevientdevientété
    avantavantderrière êtrecroire
    en dessousà côtéen plusmeilleurmeilleur
    entreau-delàles deuxbrefmais
    parallezc'sest venuje peux
    je ne peux pasne peut pasne peux pascausecauses
    certainescertainementchangementsclairementco
    comviensvient concernantpar conséquent
    envisagerconsidérantcontenircontenantcontient
    correspondantpourraitne pouvait pascoursactuellement
    définitivementdécritmalgréfaitn'a pas
    différentfairefaitne pasfaire
    ne pasfait vers le basvers le baspendant
    chaqueedupar exemplehuitsoit
    ailleursailleursassezentièrementsurtout
    etetcmêmejamaischaque
    tout le mondetout le mondetoutpartoutex
    exactementexemplesaufloinquelques-uns
    cinquièmepremiercinqsuivisuivant
    suitpourancien autrefoisen avant
    quatredeplus loinen outreobtenir
    obtientobtenirdonnédonnego
    vavapartiobtenuobtenu
    salutations avaitn'avait pasarriveà peine
    an'a pasavoirpasavoir
    ilil estbonjouraidedonc
    elleicivoicici-après par la présente
    ci-aprèspar-ci-dessusla sienneelle-mêmesalut
    luilui-mêmesoniciavec un peu de chance
    commentQuoi qu'il en soitCependantje le feraisje le ferai
    je suisje 'aiiesiignoré
    immédiatdansdans la mesure incen effet
    indiquerindiquéindiqueintérieurdans la mesure
    au lieuversl'intérieurestn'est pas
    c'estc'estc'estc'estc'est
    lui-mêmejustegardergardegardé
    savoir saitconnudernierdernièrement
    plus tarddernierdernièrementau moinsmoins
    de peurlaissonsfaisonsaimer j'ai aimé
    probablepeulookregardelooks
    ltdprincipalementbeaucouppeutpeut-être
    moije veux direentre-tempssimplementpourrait
    plusen plus la plupartla plupart du tempsbeaucoup
    doismonmoi-mêmenomà savoir
    ndprèspresquenécessairebesoin
    besoinsnijamaisnéanmoinsnouveau
    suivantneufnonpersonnenon
    aucunpersonneninormalementpas
    riennouveaumaintenantnulle partévidemment
    deéteintsouventohok
    okvieuxsurune foisun
    unsseulementsur oud'autres
    d'autressinondevraitnotrenotre
    nous-mêmesdehorsdehorssurdans l'ensemble
    propreparticulierparticulièrementparpeut-être
    placé s'il vous plaîtpluspossiblevraisemblablement
    probablementfournitqueassezqv
    plutôtrdrevraiment raisonnablement
    concernantpeu importecordialementrelativementrespectivement
    c'est vraiditmêmevudire
    direditdeuxièmedeuxièmementvoir
    voirsembler semblaitsemblaitsemblait
    vusoisoisensibleenvoyé
    sérieuxsérieusementseptplusieursdoit
    elledevraitne devrait pasdepuissix
    doncquelquequelqu'und'une manière ou d'une autrequelqu'un
    quelque chose parfoisparfoisun peuquelque part
    bientôtdésoléspécifiépréciserspécifier
    toujourssoustelsup bien sûr
    c'estprendreprisediretend
    ièmemercimercimercimerci
    quec'estc'estlesleurs
    leurseux eux-mêmespuisde là
    il y aaprèsainsipar conséquent
    là-dedansil y alà-dessuscesils
    ils le feraientils le feraientils seraientils auraientpenser
    troisièmeceà fondà fondceux
    bien quetroisà traverstout au longà travers
    ainsi àensembleaussipris
    versversessayéessaisvraiment
    essayezessayezdeux foisdeux un
    sousmalheureusementà moins quepeu probablejusqu'à
    àupsurnousutiliser
    utiliséutileutilisationsutilisationgénéralement
    valeurdivers trèsviaviz
    vsvouloirvouloirétaitn'était pas
    façonnousnousnous 'allnous sommes
    nous avonsbienvenuebiennous y sommes allés étaient
    n'étaient pasquoiqu'est-ce quepeu importequand
    d'oùà chaque foisoù estaprès
    alors quepar quoisur quoipartout
    quequipendantqui
    qui estqui que ce soitentier quidont
    pourquoivavolontairesouhaiteavec
    à l'intérieursansne sera pasje me demandeserait
    seraitne seriez pasouiencorevous
    tu auraistutu estu aston
    le tien vous-mêmevous-mêmeszéro


    4. Qualification en texte intégral

    • La recherche en texte intégral s'applique uniquement aux tables MyISAM.

    • La recherche en texte intégral fonctionne avec la plupart des jeux de caractères multi-octets. Unicode est une exception ; le jeu de caractères utf8 peut être utilisé à la place du jeu de caractères ucs2.

    • Les langues idéographiques telles que le chinois et le japonais n'ont pas de délimiteurs personnalisés. Par conséquent, l'analyseur FULLTEXT ne peut pas déterminer où commencent et se terminent les mots dans certaines langues.

    • Si plusieurs jeux de caractères sont pris en charge dans une seule table, toutes les colonnes de l'index FULLTEXT doivent utiliser le même jeu de caractères et la même bibliothèque.

    • La liste de colonnes MATCH() doit correspondre exactement à la liste de colonnes dans certaines définitions d'index FULLTEXT de la table, sauf si MATCH() est en MODE BOOLÉEN.

    • L'argument de AGAINST() doit être une chaîne constante.

    5. Affiner la recherche en texte intégral de MySQL


    La capacité de recherche en texte intégral de MySQL n'a presque aucun paramètre réglable par l'utilisateur. . Si vous disposez d'une distribution source MySQL, vous pouvez exercer davantage de contrôle sur les performances de recherche en texte intégral, car certaines modifications nécessitent des modifications du code source.

    Notez que pour être plus efficaces, les recherches en texte intégral doivent être soigneusement ajustées. En fait, modifier les performances par défaut ne fera que réduire ses performances dans la plupart des cas. Ne modifiez pas les sources MySQL à moins de savoir ce que vous faites.

    La plupart des variables de texte intégral décrites ci-dessous doivent être définies au démarrage du serveur. Pour les modifier, le serveur doit être redémarré ; ils ne seront pas modifiés pendant l'exécution du serveur.

    Certaines modifications de variables nécessitent de reconstruire l'index FULLTEXT dans la table. Les instructions d'utilisation correspondantes sont données à la fin de ce chapitre.

    • Les arguments système ft_min_word_len et ft_max_word_len spécifient la longueur minimale et maximale des mots indexés. La valeur minimale par défaut est de quatre caractères ; la valeur maximale par défaut dépend de la version de MySQL utilisée. Si vous modifiez une valeur, vous devez reconstruire votre index FULLTEXT. Par exemple, si vous souhaitez qu'un mot de 3 caractères puisse être recherché, vous pouvez définir la variable ft_min_word_len en déplaçant la ligne suivante dans un fichier de sélection :

    · [mysqld ]

    · ft_min_word_len=3

    Puis redémarrez le serveur et reconstruisez votre index FULLTEXT. Portez également une attention particulière aux commentaires sur myisamchk dans la description derrière la table.

    • Pour remplacer le mot vide par défaut, vous pouvez définir la variable système ft_stopword_file. La valeur de la variable doit être un chemin d'accès à un fichier contenant des mots vides ou une chaîne vide utilisée pour arrêter le filtrage des mots vides. Reconstruisez votre index FULLTEXT après avoir modifié la valeur de cette variable ou le contenu du fichier de mots vides.

    Les mots vides sont de forme libre, c'est-à-dire que vous pouvez utiliser n'importe quel caractère non alphanumérique tel qu'une nouvelle ligne, un espace ou une virgule pour séparer les mots vides. Les exceptions incluent le caractère de soulignement (_) et le guillemet simple (') qui sont considérés comme faisant partie d'un mot. Le jeu de caractères du mot vide est le jeu de caractères par défaut du serveur.

    • Le seuil de 50 % pour les requêtes en langage naturel est déterminé par le compromis particulier choisi. Pour l'éviter, recherchez la ligne suivante dans myisam/ftdefs.h :

    · #define GWS_IN_USE GWS_PROB

    Changez la ligne par :

    #define GWS_IN_USE GWS_FREQ

    puis recompilez MySQL. Il n'est pas nécessaire de reconstruire l'index pour le moment. Remarque : En faisant cela, vous réduisez sérieusement la capacité de MySQL à fournir des valeurs de corrélation appropriées pour la fonction MATCH(). Si vous devez rechercher des mots aussi courants, il est préférable d'utiliser IN BOOLEAN MODE car il ne respecte pas le seuil de 50 %.

    • Pour modifier l'opérateur utilisé pour les recherches booléennes en texte intégral, définissez la variable système ft_boolean_syntax. Cette variable peut également être modifiée pendant que le serveur est en cours d'exécution, mais vous devez disposer des privilèges SUPER pour le faire. Il n'est pas nécessaire de reconstruire l'index dans ce cas.

    Si vous modifiez les variables de texte intégral qui affectent l'indexation (ft_min_word_len, ft_max_word_len ou ft_stopword_file), ou si vous modifiez le fichier de mots vides lui-même, vous devez le reconstruire après avoir modifié et redémarré le serveur. Index TEXTE COMPLET. A ce stade, pour reconstruire l'index, effectuez simplement une opération de réparation RAPIDE :

    mysql> REPAIR TABLE tbl_name QUICK;

    Notez que si vous utilisez myisamchk pour effectuer une opération qui modifie un index de table (telle qu'une réparation ou une analyse), reconstruit l'index FULLTEXT en utilisant les valeurs par défaut des paramètres de texte intégral pour la longueur minimale et maximale des mots et les mots vides, sauf indication contraire de votre part. Cela entraînera l'échec de la requête.

    发生这个问题的原因是只有服务器认识这些参数。它们的存储位置不在 MyISAM 索引文件中。若你已经修改了最小单词长度或最大单词长度或服务器中的停止字,为避免这个问题,为你对mysqld所使用的myisamchk 指定同样的ft_min_word_len、 ft_max_word_len和ft_stopword_file值。例如,假如你已经将最小单词长度设置为 3, 则你可以这样修改一个带有myisamchk的表:

    shell> myisamchk --recover --ft_min_word_len=3 tbl_name.MYI

    为保证 myisamchk 及服务器对全文参数使用相同的值, 可将每一项都放在供选文件中的 [mysqld]和 [myisamchk] 部分:

    [mysqld]
    ft_min_word_len=3
    [myisamchk]
    ft_min_word_len=3
    Copier après la connexion

    使用 REPAIR TABLE、 ANALYZE TABLE、OPTIMIZE TABLE或ALTER TABLE来代替使用 myisamchk 。这些语句通过服务器来执行,服务器知道使用哪个全文参数值更加合适。

     以上就是MySQL基础教程10 —— 函数之全文搜索功能的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!


Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal