我在寻找桌面搜索解决方案方面遇到了很大麻烦。
表:
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索引做同样的事吗?
任何帮助都会非常感激。