Eğer kullandığınız MySQL versiyonu 5.6'dan küçük ise, full-text arama için sadece MyISAM depolama unitini kullanabilirsiniz. Çoğu kişi MyISAM'i ACID işlemlerini desteklememesi, bilgi tutarlılığı desteklememesi, kilitlenme güvenliği sağlamaması ve tablo düzeyinde kilit uygulaması (fazla okuma ve yazma işlemlerinde çok yavaş olur) nedeniyle tercih etmiyor. MySQL versiyonunu en azından 5.6'ya yükseltmenizi ve full-text arama için InnoDB'yi kullanmanızı tavsiye ederim.


Gerçekler



Test tablosu


# Tabloyu yarat.
CREATE TABLE `person` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
`middlename` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
`surname` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
`code` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`),
FULLTEXT(`name`,`middlename`,`surname`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

# Tabloyu doldur.
INSERT INTO `person` (`name`, `middlename`, `surname`, `code`) VALUES
('John', 'Joseph', 'Travolta', 'JJT'),
('John', '', 'Lenon', 'JL'),
('John', '', 'Wayne', 'JW'),
('John', 'Paul', 'John', 'JPJ'),
('Robert', '', 'DeNiro', 'RD'),
('Elton', '', 'John', 'EJ'),
('Abi', 'John John', '', 'AJ'),
('Johny', '', '', 'J'),
('John', 'John', 'John', 'JJJ');

Örnek sorgular


Bu örneklerde IN NATURAL LANGUAGE MODE arama niteleyicisini kullanıyoruz. Eğer aranan kelime, mevcut olan kayıtların %50'sinde veya daha fazlasında mevcut ise, o kelime "sıradan" olarak nitelendirilir ve sonuç vermez, bu nedenle size IN BOOLEAN MODE arama niteleyicisini kullanmanızı tavsiye ederim.


# Basit bir select sorgusu.
SELECT *
FROM person
WHERE
MATCH(`name`, `middlename`, `surname`) AGAINST ('John' IN NATURAL LANGUAGE MODE);

+----+-------+------------+----------+------+
| id | name | middlename | surname | code |
+----+-------+------------+----------+------+
| 9 | John | John | John | JJJ |
| 4 | John | Paul | John | JPJ |
| 7 | Abi | John John | | AJ |
| 1 | John | Joseph | Travolta | JJT |
| 2 | John | | Lenon | JL |
| 3 | John | | Wayne | JW |
| 6 | Elton | | John | EJ |
+----+-------+------------+----------+------+
7 rows in set (0.00 sec)

# Arama alaka derecesini (skor) hesaplama bize sadece sıralama yaparken faydalı olur.
SELECT *,
MATCH(`name`, `middlename`, `surname`) AGAINST ('John' IN NATURAL LANGUAGE MODE) AS score
FROM person
ORDER BY score DESC;

+----+--------+------------+----------+------+----------------------+
| id | name | middlename | surname | code | score |
+----+--------+------------+----------+------+----------------------+
| 9 | John | John | John | JJJ | 0.035737544298172 |
| 4 | John | Paul | John | JPJ | 0.023825030773878098 |
| 7 | Abi | John John | | AJ | 0.023825030773878098 |
| 1 | John | Joseph | Travolta | JJT | 0.011912515386939049 |
| 2 | John | | Lenon | JL | 0.011912515386939049 |
| 3 | John | | Wayne | JW | 0.011912515386939049 |
| 6 | Elton | | John | EJ | 0.011912515386939049 |
| 5 | Robert | | DeNiro | RD | 0 |
| 8 | Johny | | | J | 0 |
+----+--------+------------+----------+------+----------------------+
9 rows in set (0.00 sec)