fulltext search выводит не полное соответствие из выражения AGAINST

iis80

Новичок
fulltext search выводит не полное соответствие из выражения AGAINST

доброго дня уважаемое сообщество phpclub-a

пробежался по ветке PHP & Mysql, но не нашел ничего похожего, не судите строго, если "смотрю в книгу а вижу..."

в общем ситуация следующая:

есть таблица:
CREATE TABLE `tbl_new` (
`prov_id` int(10) unsigned NOT NULL DEFAULT '1',
`code` int(10) unsigned NOT NULL DEFAULT '1',
`cat_N` varchar(25) DEFAULT NULL,
`name` varchar(255) NOT NULL,
`odm` varchar(50) DEFAULT NULL,
`quant` int(10) unsigned NOT NULL,
`price` double NOT NULL,
PRIMARY KEY (`code`,`prov_id`),
FULLTEXT KEY `FT` (`cat_N`,`name`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

делаю такой запрос:
SELECT * FROM `tbl_new` LEFT JOIN `prov_det` USING(prov_id) where match(cat_N,name) against($good2 IN BOOLEAN MODE) ORDER BY `tbl_new`.`prov_id`

cat_N,name - каталожный номер и имя соответственно(в данном случае это автоколеса)

после всех операций со строкой поиска например $good2 присваивается '+185/65', мусукл отвечает 192-мя строками, но при этом если $good2='+185' - те же 192 строки, и при этом в первом варианте('+185/65') выдаются в т ч строки содержащие '185/60' '185/70', т е все, что содержит ''185'

Подскажите, как экранировать слеш в данном случае, или дело не в нем?
 

Sepuka

Новичок
Если я правильно понял, 185/65 разбивается на две составляющие 185 и 65. Если нужно фразу в точности, то наверно надо обернуть ее в "двойные кавычки".
 

Sepuka

Новичок
а зачем вообще полнотекстовый поиск по номерам категорий?
 

damngood

Мозг был, но ушел...
Надо хранить все в БД нормально. 185 отдельно от 60 и т.д.
Чтобы не возникало таких странных идей искать в данном случае через MATCH.
 

iis80

Новичок
to Sepuka

каталожный номер а не номер категории. Там может быть что угодно - поэтому поле текстовое. заполняется автоматически из екселя который приходит "из вне"

to damngood

см. п. to Sepuks

И тем не менее, господа, по существу вопроса есть ли у кого-нить соображения!? Если это принципиально невозможно - это тоже ответ. Будем придумывать как это обойти
 

damngood

Мозг был, но ушел...
iis80
То, что у тебя там берется и откуда, меня вообще не волнует, это не отменяет необходимости хранить все как надо.

В boolean mode есть чудный оператор *
 

iis80

Новичок
damngood спасибо за конкретику в ответе.

-~{}~ 23.11.09 14:40:

Sepuka "каталожный номер" это название, это не обязательно номер в привычном понимании, там может быть как число так и буква, причем как русская так и анг.

-~{}~ 23.11.09 14:45:

я могу переформулировать, есть 2 поля cat_N` varchar(25) и name` varchar(255), проиндексированы fulltext. Используя конструкцию match(cat_N,name) against($some_str IN BOOLEAN MODE) можно найти только полное вхождение $some_str в этих полях?
 

Sepuka

Новичок
Получишь вхождение любого из слов в любом из полей cat_N и name, а слова это "последовательность букв, цифр, 'одинарная кавычка', или _". Слова в той форме в какой написаны минус стоп слова и короткие слова, меньше 4х символов по-умолчанию. ну и все это не отсортировано по реливантности.
 

damngood

Мозг был, но ушел...
Если тебе нужно четкое вхождение строки - двойные кавычки, если маска поиска по 185 и далее пофик что - оператор *
 

iis80

Новичок
to Sepuka
по кол-ву символов у меня ft_min_word_len = 3, все, что меньше - режу regexp до ввода. Да, мне именно нужно искать последовательность 186/65.

to both:
Sepuka damngood
про двойные кавычки: в том то и дело мужики, что проверяю вручную, ввожу: SELECT * FROM `tbl_new` LEFT JOIN `prov_det` USING(prov_id) where match(cat_N,name) against("185/65" IN BOOLEAN MODE) ORDER BY `tbl_new`.`prov_id` и получаю рез-ты, кот содержат 185, но не обязательно 185/65. мускул сам делит на слова как я понимаю.
Поэтому и спрашивал:"Подскажите, как экранировать слеш в данном случае, или дело не в нем?" т е как мне заставить его понимать за одно слово(последовательность). Может дело в том, что он на виндовсе поднят? пытаюсь узнать, что называется, "это баг или фича"!
 

damngood

Мозг был, но ушел...
Я не знаю что у тебя там не выводится. Сейчас протестировал простой запрос без джоинов в виде:

SELECT * FROM `m` WHERE MATCH(`test`,`name`) AGAINST ("185/60" IN BOOLEAN MODE)

прекрасно выводятся как строки 185/60, 185/90, так и 185 просто.
 

iis80

Новичок
так в том то и дело:
зачем мне строка с 185/90 если я прошу только 185/60

-~{}~ 23.11.09 19:06:

может я непонятно объяснил, но нужно чтоб выводились строки которые содержат тольк полностью 185/60 а не 185/90 или просто 185
 

Sepuka

Новичок
А ты смотрел вообще в 192 результатах есть ли то что тебе нужно? Ты ведь не забывай что они не сортируются по релевантности, может твой результат посередине где-то. Мне кажется ты развел тут (точнее мы развели) вообще непонятно что. Ты просто не правильно хранишь свои данные и не правильно их ищешь.
 

damngood

Мозг был, но ушел...
iis80
Тогда твоя задача сводится не к MATCH AGAINST а к SELECT * FROM `m` WHERE `test` = '185/60' OR `name`='185'.
 

iis80

Новичок
to Sepuka
да, конечно в результатах есть то, что мне нужно, просто там есть ещё и то, что не совсем удовлетворяет условиям поиска.

to damngood

да, согласен, только я использую LIKE, просто при этом способе нельзя искать по несоседним словам(последовательностям символов).

Ладно парни, видимо я не могу объяснить номально, то, что мне нужно.

и последний вопрос, если знаете: когда мускул обрабатывает последовательность символов в выражении AGAINST он все воспринимает "как есть" или может выделять служебные символы?
 
Сверху