Her ne kadar veritabanında veri olsa bile, IN BOOLEAN MODE kullanılarak uzunluğu 4 karakterden az olan kelimeler için yapılan MySQL full-text aramalar, herhangi bir sonuç vermezler, bunun nedeni ise aramanın ft_min_word_len ile tanımlanan "en az 4 karakter" kuralına takılmasıdır. Bu limiti delmek için aşağıdaki adımları takip edin.


Örnek tablo


# Tablo yarat.
CREATE TABLE `person` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
FULLTEXT KEY `index2` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

# Tabloyu doldur.
INSERT INTO `person` (`name`) VALUES ('abc');


Mevcut durum


Varsayılan olarak, değişken ft_min_word_len'e değer olarak 4 atanmıştır, bu nedenle "abc" kelimesini sorgulamak sonuç vermeyecektir.


inanzzz@ubuntu:~$ mysql -u root -p
Enter password:

# Variable 'ft_min_word_len'.
mysql> SHOW VARIABLES LIKE 'ft_min_word_len';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| ft_min_word_len | 4 |
+-----------------+-------+
1 row in set (0.00 sec)

# Örnek sorgu.
mysql> SELECT *
-> FROM person
-> WHERE
-> MATCH(`name`) AGAINST ('abc' IN BOOLEAN MODE);
Empty set (0.00 sec)

MySQL konfigürasyonu içindeki ft_min_word_len değişkeni yenileme


Komut SET GLOBAL ft_min_word_len = 3;'ün direkt olarak kullanımı, "#1238 - Variable 'ft_min_word_len' is a read only variable" hatası verir, o nedenle MySQL konfigürasyonunu manuel olarak ayarlayın.


inanzzz@ubuntu:~$ sudo gedit /etc/mysql/my.cnf

# Anahtar ve değer bileşenleri [mysqld] bloğuna ekleyin:
[mysqld]
ft_min_word_len = 3

MySQL'i yeniden başlatın


inanzzz@ubuntu:~$ sudo service mysql restart
mysql stop/waiting
mysql start/running, process 3797


Indexleri yeniden yaratın


Komut REPAIR, InnoDB depolama motoru için kullanılamaz, aksi takdirde "The storage engine for the table doesn't support repair" hatası oluşur. InnoDB'yi MyISAM olarak değiştirmek için ALTER TABLE

ENGINE=MyISAM; komutu kullanılır.


mysql> REPAIR TABLE person QUICK;
+----------------+--------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+----------------+--------+----------+----------+
| inanzzz.person | repair | status | OK |
+----------------+--------+----------+----------+
1 row in set (0.00 sec)

Tekrar sorgulama


mysql> SELECT *
-> FROM person
-> WHERE
-> MATCH(`name`) AGAINST ('abc' IN BOOLEAN MODE);
+----+------+
| id | name |
+----+------+
| 1 | abc |
+----+------+
1 row in set (0.00 sec)