У меня большие проблемы с поиском решения для поиска по таблице.
Таблица:
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?
Буду признателен за любую помощь.