Полнотекстовый поиск MySQL возвращает 0 результатов

Я только что создал полнотекстовый индекс в своей базе данных MySQL, но, к сожалению, он не возвращает никаких результатов.

Кажется, это распространенная проблема, и типичные ответы - использовать движок MyISAM и функцию «В БУЛЕВОМ РЕЖИМЕ». Ну, ни один из них, похоже, не работает для меня.

Вот мой пример кода:

DROP TABLE IF EXISTS parentregionlist;
CREATE TABLE parentregionlist
(
    RegionID INT NOT NULL,
    RegionType VARCHAR(50),
    RelativeSignificance VARCHAR(3),
    SubClass VARCHAR(50),
    RegionName VARCHAR(255),
    RegionNameLong VARCHAR(510),
    ParentRegionID INT,
    ParentRegionType VARCHAR(50),
    ParentRegionName VARCHAR(255),
    ParentRegionNameLong VARCHAR(510),
    CountryCode VARCHAR(2),
  TimeStamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (RegionID),
    FULLTEXT (RegionNameLong)
) ENGINE = MyISAM;

INSERT INTO parentregionlist
VALUES (575, 
"City", 
"", 
"", 
"Birmingham", 
"Birmingham, England, United kingdom", 
6023342, 
"Multi-City (Vicinity)", 
"Birmingham (and Vicinity)", 
"Birmingham (and vicinity), England, United Kingdom", 
"", 
now());

SELECT * 
FROM parentregionlist
WHERE MATCH(regionnamelong) 
AGAINST ('Birm' IN BOOLEAN MODE);

Любые идеи?

P.S. В реальной таблице у меня более 200 тыс. строк. Я знаю, что поиск не будет работать только с одной строкой, это просто пример.


person PizzaTheHut    schedule 20.07.2013    source источник


Ответы (1)


С текущим запросом вы ищете полное совпадение слов. Так, например, чтобы вставить показанную выше строку, вам нужно будет сделать:

SELECT * 
FROM parentregionlist
WHERE MATCH(regionnamelong) 
AGAINST ('Birmingham (and vicinity), England, United Kingdom' IN BOOLEAN MODE);

Однако, если вы хотите найти все результаты, начинающиеся с «Birm», вам нужно будет добавить модификатор «*»:

SELECT * 
FROM parentregionlist
WHERE MATCH(regionnamelong) 
AGAINST ('Birm*' IN BOOLEAN MODE);

В качестве альтернативы вы также можете использовать LIKE:

SELECT * 
FROM parentregionlist
WHERE regionnamelong LIKE 'Birm%';

Документация MySQL дает хорошие примеры MATCH для работы: http://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html

person user387049    schedule 13.08.2013