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

Тема в разделе "Базы данных", создана пользователем Denixxx, 12 мар 2015.

Модераторы: latteo
  1. Denixxx

    Denixxx

    Регистр.:
    7 фев 2014
    Сообщения:
    247
    Симпатии:
    191
    Здравствуйте.
    Пишу запрос:
    Код:
    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-м месте?
     
  2. ArtyGrand

    ArtyGrand Постоялец

    Регистр.:
    6 июн 2009
    Сообщения:
    80
    Симпатии:
    37
    результаты в случае использования логического режима автоматически не сортируются по релевантности.

    так сказал валера http://valera.ws/2008.04.15~fulltext-in-mysql/
     
    pozhisni нравится это.
  3. Denixxx

    Denixxx

    Регистр.:
    7 фев 2014
    Сообщения:
    247
    Симпатии:
    191
    И вот ещё что не понятно. Если искать не в боолеан, то вообще ошибка — шозанах
    Код:
    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
     
  4. Hello.World

    Hello.World Создатель

    Регистр.:
    26 апр 2014
    Сообщения:
    16
    Симпатии:
    5
    Видимо, у тебя в индексе нет какого-то их этих трех полей, по которых ты ведешь поиск MATCH(`name`,`short`,`full`). Fulltext-индекс должен содержать теже поля и в том самом порядке.
     
  5. Denixxx

    Denixxx

    Регистр.:
    7 фев 2014
    Сообщения:
    247
    Симпатии:
    191
    Не, всё там есть, вот результат SHOW CREATE TABLE `items`:
    Проблема, видимо, в недостаточной поддержке кириллицы при 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.';';
     
  6. Hello.World

    Hello.World Создатель

    Регистр.:
    26 апр 2014
    Сообщения:
    16
    Симпатии:
    5
    Может тогда проверь кодировку полей, чтоб была utf8_general_ci и при начале работы с бд, после подключения, делай запрос SET NAMES utf8