MySQL полнотекстовый поиск не возвращается, как ожидалось - PullRequest
0 голосов
/ 08 июня 2018

У меня большие проблемы с поиском решения для поиска по таблице.

Таблица:

ID | NAME | DESCRIPTION | APPLICATION | BRAND | SUPPLIER_PRODUCT_ID | SUPPLIER_ID

Определение:

int,text,text,text,text,varchar(55),int

Эта таблицазаполнены данными о продуктах, собранными из баз данных разных поставщиков.

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

 'BUJE BARRA CHEVROLET CORSA' (1 & 2 NAME OR DESCRIPTION, 3 & 4 APPLICATION)

или

 'PASTILLA FRENO CORSA FRASLE' (1 & 2 NAME OR DESCRIPTION, 3 APPLICATION, 4 BRAND)

или

 'FR44451MX' (= SUPPLIER_PRODUCT_ID)

или

'PARRILLA CORSA' (1 NAME OR DESCRIPTION, 2 APPLICATION)

Я создал хранимую процедуру для разделения каждого слова и возврата затем во временную таблицу, но я не могу найти правильное решение.Я думаю, что проблема с данными, но я не могу их изменить.Например, одни и те же продукты от разных поставщиков имеют разные ИМЯ или ОПИСАНИЕ:

    'AMORTIGUADOR DELANTERO' NAME
    'DELANTERO DERECHO' DESCRIPTION
    'CHEVROLET CORSA' BRAND
    'FR44451MX' SUPPLIER_PRODUCT_ID
    '1' SUPPLIER_ID

и другого поставщика:

    'AMORTIGUADOR' NAME
    'DELANTERO CHEVROLET CORSA' DESCRIPTION
    'NULL' BRAND
    'FR-44451' SUPPLIER_PRODUCT_ID
    '2' SUPPLIER_ID

Мне нужен поиск, который возвращает каждый продукт от каждого поставщика, соответствующий поисковому запросу.слова.

ОБНОВЛЕНИЕ 1

Я создал найденную здесь функцию для разбиения строки:

DELIMITER $

CREATE FUNCTION 
   FN_SPLIT_STRING ( pSTRING TEXT , pDELIMITER CHAR(1) , pPOSITION INT)
   RETURNS TEXT
   DETERMINISTIC -- always returns same results for same input parameters
    BEGIN

        DECLARE N INT ;

        -- get max number of items
        SET N = LENGTH(pSTRING) - LENGTH(REPLACE(pSTRING, pDELIMITER, '')) + 1;

        IF pPOSITION > N THEN
            RETURN NULL ;
        ELSE
            RETURN SUBSTRING_INDEX(SUBSTRING_INDEX(pSTRING, pDELIMITER, pPOSITION) , pDELIMITER , -1 ) ;        
        END IF;
    END$

DELIMITER ;

И в моем предложении WHERE я использую следующее:

WHERE P.NAME LIKE CONCAT(FN_SPLIT_STRING(pFILTER, '|', 1),' %', FN_SPLIT_STRING(pFILTER, '|', 2), '%') 
    AND (P.APPLICATION LIKE CONCAT('%', FN_SPLIT_STRING(pFILTER, '|', 3), '%') OR (P.NAME LIKE CONCAT('%', FN_SPLIT_STRING(pFILTER, '|', 3), '%'))) 
    AND P.BRAND LIKE CONCAT('%', FN_SPLIT_STRING(pFILTER, '|', 4), '%')
    AND S.BUSINESS_NAME LIKE 
        CASE 
            WHEN FN_SPLIT_STRING(pFILTER, '|', 5) != '' 
            THEN  CONCAT(FN_SPLIT_STRING(pFILTER, '|', 5),'%')
            ELSE '%%'
        END

Результаты превосходны, но производительность не очень хорошая.Могу ли я сделать то же самое с индексами FULL-TEXT?

Буду признателен за любую помощь.

...