Как использовать полнотекстовый индекс для точных совпадений? - PullRequest
4 голосов
/ 06 марта 2012

У меня есть таблица MyISql MyISAM с полнотекстовым индексом, например:

CREATE TABLE `tblsearch` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `title` varchar(100) NOT NULL,
    `brand` varchar(100) DEFAULT NULL,
    PRIMARY KEY (`id`),
    FULLTEXT KEY `index_all` (`title`,`brand`)
) ENGINE=MyISAM AUTO_INCREMENT=1316109 DEFAULT CHARSET=utf8;

Теперь мне нужно написать запрос, подобный этому, чтобы найти все записи с точным названием и маркой:

SELECT id FROM tblsearch WHERE title=?title AND brand=?brand;

Важно, чтобы запрос давал только точные совпадения. Я хотел бы иметь возможность использовать полнотекстовый индекс, который у меня уже есть. Можно ли написать запрос, чтобы он использовал полнотекстовый индекс?

Ответы [ 2 ]

2 голосов
/ 06 марта 2012

Примерно так:

SELECT id 
  FROM tblsearch 
 WHERE MATCH (title, brand) AGAINST ("exact phrase") 
   AND CONCAT(title, ' ', brand) LIKE '%exact phrase%';

Надеюсь, это поможет

1 голос
/ 06 марта 2012

Если вам нужно найти точное название или марку, вам нужно использовать оператор равенства с классическим индексом:

ALTER TABLE tblsearch ADD INDEX search_idx(title, brand);
SELECT id FROM tblsearch WHERE title = 'foo' AND brand = 'bar';

Теперь, если вам просто нужно сопоставить точные слова с названием и маркой:

SELECT id FROM tblsearch WHERE
MATCH(title) AGAINST('+foo' IN BOOLEAN MODE)
AND MATCH(brand) AGAINST('+bar' IN BOOLEAN MODE);
...