sql >> Databasteknik >  >> RDS >> Mysql

Hur får du din booleska fulltextsökning att ta upp termen C++?

Du måste ändra MySQL:s uppfattning om vad ett ord är.

För det första är den förinställda minsta ordlängden 4. Det betyder att ingen sökterm som bara innehåller ord med <4 bokstäver kommer att matcha, oavsett om det är "C++" eller "cpp". Du kan konfigurera detta med ft_min_word_len konfigurationsalternativ, t.ex. i din my.cfg:

[mysqld]
ft_min_word_len=3

(Stoppa/starta sedan MySQLd och bygg om fulltextindex.)

För det andra, "+" anses inte vara en bokstav av MySQL. Du kan göra det till en bokstav, men då betyder det att du inte kommer att kunna söka efter ordet 'fisk' i strängen 'fish+chips', så viss försiktighet krävs. Och det är inte trivialt:det kräver omkompilering av MySQL eller hacka en befintlig teckenuppsättning. Se avsnittet som börjar "Om du vill ändra uppsättningen tecken som anses vara ordtecken..." i avsnitt 11.8.6 av dokumentet.

Ja, något sådant är en vanlig lösning:du kan behålla dina "riktiga" data (utan att behöva fly) i en primär, definitiv tabell — vanligtvis med InnoDB för ACID-efterlevnad. Sedan kan en extra MyISAM-tabell läggas till, som endast innehåller de manglade orden för fulltextsökbete. Du kan också göra en begränsad form av härdning med detta tillvägagångssätt.

En annan möjlighet är att upptäcka sökningar som MySQL inte kan göra, till exempel de med bara korta ord eller ovanliga tecken, och falla tillbaka till en enkel men långsam LIKE- eller REGEXP-sökning endast för dessa sökningar. I det här fallet vill du förmodligen också ta bort stopplistan genom att ställa in ft_stopword_file till en tom sträng, eftersom det inte är praktiskt att plocka upp allt i det som speciellt också.



  1. PostgreSQL-arv med JPA, Hibernate

  2. MySQL - CASE vs IF Statement vs IF-funktion

  3. hur man arbetar med rekursiv fråga i MySql?

  4. ORA-04021:timeout inträffade i väntan på att låsa objekt