Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Mysterium der MySQL-Volltextsuche

Von MySQL-Dokumentation

  • + Ein führendes Pluszeichen gibt an, dass dieses Wort in jeder zurückgegebenen Zeile vorhanden sein muss.

  • * Das Sternchen dient als Trunkierungs- (oder Wildcard-)Operator. Im Gegensatz zu den anderen Operatoren sollte es an das zu beeinflussende Wort angehängt werden. Wörter stimmen überein, wenn sie mit dem Wort beginnen, das dem *-Operator vorausgeht.

    Wenn ein Wort mit dem Trunkierungsoperator angegeben wird, wird es nicht aus einer booleschen Abfrage entfernt, selbst wenn es zu kurz ist (wie von der Einstellung ft_min_word_len bestimmt) oder ein Stoppwort ist. Dies liegt daran, dass das Wort nicht als zu kurz oder als Stoppwort angesehen wird, sondern als Präfix, das im Dokument in Form eines Wortes vorhanden sein muss, das mit dem Präfix beginnt .

Im Kontext:

MATCH(...) GEGEN(...)

MATCH (name) AGAINST ('+ski*' IN BOOLEAN MODE) bedeutet, dass Sie nach Zeilen suchen, in denen ein Wort im name enthalten ist Spalte muss enthalten ski , und muss beginnen mit dem Wort ski .

Aus dem Set, das Sie gepostet haben, Dartmouth Skiway ist der einzige name das diesen Anforderungen entspricht:es enthält das Wort ski , und ihm wird das Wort ski vorangestellt .

Der andere name Spalten, obwohl sie der ersten Regel entsprechen:muss ski enthalten , sie haben kein Präfix ski , wie in Ihrer Regel festgelegt. Die von Ihrer booleschen Suche zurückgegebene Zeile ist die einzige mit einem name Spalte, die ein Wort enthält, das beide enthält ski und ist ein Wort vorangestellt mit ski .

Versuchen Sie, wie von ajreal vorgeschlagen, die ft_min_len_word_setting zu verringern in my.cnf . Aufgrund der Standardeinstellung liefert Ihre Suche möglicherweise nicht die erwarteten Ergebnisse. Versuchen Sie es auf 3 zu reduzieren.

WHERE-Spalte LIKE %text%

WHERE name LIKE "%ski%" sucht nach Zeilen mit name Spalten, die ski enthalten , egal wo das Wort vorkommt.