Как-то не очень релевантно ищет фуллтекст

Denixxx

Мой дом здесь!
Регистрация
7 Фев 2014
Сообщения
244
Реакции
216
Здравствуйте.
Пишу запрос:
Код:
SELECT `name`,`short`,`full` FROM `items` WHERE MATCH(`name`,`short`,`full`) AGAINST('+MX-2 термопаста Аrctic Cooling, 65гр' IN BOOLEAN MODE) LIMIT 0,12;

Результат выборки:
Код:
0 =>
array (
'name' => 'MX-2 термопаста Аrctic Cooling, 30гр',
'short' => 'MX-2 термопаста Аrctic Cooling, 30гр',
'full' => 'MX-2 термопаста Аrctic Cooling, 30гр',
),
1 =>
array (
'name' => 'MX-2 термопаста Аrctic Cooling, 4гр',
'short' => 'MX-2 термопаста Аrctic Cooling, 4гр',
'full' => 'MX-2 термопаста Аrctic Cooling, 4гр',
),
2 =>
array (
'name' => 'MX-2 термопаста Аrctic Cooling, 65гр',
'short' => 'MX-2 термопаста Аrctic Cooling, 65гр',
'full' => 'MX-2 термопаста Аrctic Cooling, 65гр',
),
3 =>
array (
'name' => 'MX-2 термопаста Аrctic Cooling, 8гр',
'short' => 'MX-2 термопаста Аrctic Cooling, 8гр',
'full' => 'MX-2 термопаста Аrctic Cooling, 8гр',
),
4 =>
array (
'name' => 'MX-4 термопаста Аrctic Cooling , 4гр',
'short' => 'MX-4 термопаста Аrctic Cooling , 4гр',
'full' => 'MX-4 термопаста Аrctic Cooling , 4гр',
),

Почему релевантный запрос на 3-м месте и что сделать чтобы он был на логичном 1-м месте?
 
результаты в случае использования логического режима автоматически не сортируются по релевантности.

так сказал валера Для просмотра ссылки Войди или Зарегистрируйся
 
И вот ещё что не понятно. Если искать не в боолеан, то вообще ошибка — шозанах
Код:
SELECT * FROM `items` WHERE MATCH(`name`,`short`,`full`) AGAINST('+Универсальная внешняя батарея 3.7V 10000мАч (37Вт*ч)') LIMIT 0,12;
Код:
Can't find FULLTEXT index matching the column list
 
Видимо, у тебя в индексе нет какого-то их этих трех полей, по которых ты ведешь поиск MATCH(`name`,`short`,`full`). Fulltext-индекс должен содержать теже поля и в том самом порядке.
 
Видимо, у тебя в индексе нет какого-то их этих трех полей, по которых ты ведешь поиск MATCH(`name`,`short`,`full`). Fulltext-индекс должен содержать теже поля и в том самом порядке.
Не, всё там есть, вот результат SHOW CREATE TABLE `items`:
CREATE TABLE `items` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Номер записи',
`catid` int(5) NOT NULL COMMENT 'Номер категории',
`code` varchar(255) NOT NULL COMMENT 'Код товара или штрихкод',
`code_1c` varchar(255) DEFAULT NULL,
`name` varchar(255) NOT NULL COMMENT 'Имя объекта',
`sort` int(5) DEFAULT NULL COMMENT 'Порядок сортировки',
`keywords` varchar(255) NOT NULL COMMENT 'Meta keywords',
`description` varchar(255) NOT NULL COMMENT 'Meta description',
`short` text COMMENT 'Краткое описание объекта',
`full` text NOT NULL COMMENT 'Полное описание объекта',
`mode` varchar(255) DEFAULT NULL COMMENT 'Производитель',
`price` varchar(255) DEFAULT NULL COMMENT 'Цена',
`price1` varchar(255) DEFAULT NULL COMMENT 'Цена 1',
`price2` varchar(255) DEFAULT NULL COMMENT 'Цена 2',
`price3` varchar(255) DEFAULT NULL COMMENT 'Цена 3',
`price4` varchar(255) DEFAULT NULL COMMENT 'Цена 4',
`avail` int(3) NOT NULL COMMENT 'Доступность',
`search` text NOT NULL COMMENT 'Расширенный поиск',
`sorting` text NOT NULL COMMENT 'Сортировка в категории',
`similar` varchar(255) NOT NULL COMMENT 'Массив похожих продуктов',
`quantity` float DEFAULT NULL,
`quantity_min` float DEFAULT NULL,
`quantity_max` float DEFAULT NULL,
`options` text,
`date` datetime NOT NULL COMMENT 'Время изменения',
PRIMARY KEY (`id`),
FULLTEXT KEY `name` (`name`,`short`,`full`)
) ENGINE=MyISAM AUTO_INCREMENT=1198 DEFAULT CHARSET=utf8 COMMENT='Объекты каталога'
Проблема, видимо, в недостаточной поддержке кириллицы при FULLTEXT поиске, точнее практически её отсутствие.
Мне пришлось переделать этот запрос на два. В форме поиска поставить активную по-умолчанию галочку «Точный запрос».
При её снятии ищёт этим кастрированным Фуллтекстом, а по-умолчанию запрос разбивается по словам, формируется запрос из LIKE:
PHP:
        $s_array=explode(' ',$searchquery);
        if (!empty($s_array)) {
            $s='';
            foreach ($s_array as $word) {
                $word=mb_strtoupper(str_replace(array('_',',','!','&','?'),'',trim($word)));
                if (!empty($word)) $s.='%'.$word;
            }
            if (!empty($s)) {
                $searchquery=$s.'%';
            }
            $query="SELECT `id` FROM `items` WHERE (UPPER(`name`) LIKE '".$searchquery."' OR UPPER(`short`) LIKE '".$searchquery."' OR UPPER(`full`) LIKE '".$searchquery."') LIMIT ".($page-1)*$shop_face_count.','.$shop_face_count.';';
 
Проблема, видимо, в недостаточной поддержке кириллицы при FULLTEXT поиске
Может тогда проверь кодировку полей, чтоб была utf8_general_ci и при начале работы с бд, после подключения, делай запрос SET NAMES utf8
 
Назад
Сверху