2013-06-27 56 views
1

我遇到了问题。Mysql带加号的全文搜索

在我的MySql数据库中,我在产品表中有40000行。表格有一列叫做T9Text。 我的一行T9Text区域是这样的:

UNISNLS106B UNI.SNLS 106B SNLS-106B M.OT. 12V 2DELİKMOTOR CRAFT TIPI UNIPOINT 66-205 66205 F02Z-11390-A F02Z11390A E90Z-11390-A E90Z11390A F4DZ-11390-A F4DZ11390A F3VY-11390-A F3VY11390A E90Z-11390-A E90Z11390A FORD ESCORT MERCURY TRACER FORD

对于自动完成过程,我在db中运行存储过程。它是这样的:

SELECT p.Code, 
    p.Name, 
    p.`T9Text`, 
    MATCH (p.T9Text) AGAINST ('+UNI* +SNLS* +106B*' IN BOOLEAN MODE) AS SCORE 
FROM product p 
WHERE MATCH (p.T9Text) AGAINST ('+UNI* +SNLS* +106B*' IN BOOLEAN MODE) >0 
GROUP BY p.Name 
ORDER BY SCORE DESC 

像这样,它工作得很好,只返回一行。

但我需要写我在那里的条件是这样的:

MATCH (p.T9Text) AGAINST ('+*UNI* +*SNLS* +*106B*' IN BOOLEAN MODE) >0 

有了上面的代码返回1877年行。它就像加号不起作用

MATCH (p.T9Text) AGAINST ('+*UNISNLS106B*' IN BOOLEAN MODE) >0 
MATCH (p.T9Text) AGAINST ('+*NISNLS106B*' IN BOOLEAN MODE) >0 

用第一个查询返回1行,但第二个查询返回0行。

所以,有我的问题:在mysql全文搜索,我不能使用+ 测试表达式? 如果没有,有没有办法做到这一点? (除了LIKE)

+0

你试过把它作为'\ +'来转义吗? –

+1

我认为问题出在'*'上 - 这个只能用在单词的最后。 – Barmar

+0

@DannyBeckett MATCH(p.T9Text)反对('\ + * NISNLS106B *'BOOLEAN模式)'没有任何返回 – makcura

回答

1

Boolean Full-Text Search docs;

星号用作截断(或通配符)运算符。 与其他运营商不同,应该将追加给受影响的词。如果它们以*运算符之前的单词开头,则单词匹配。

换句话说,布尔搜索不支持使用*运算符的“contains”。

+0

谢谢Isaksson – makcura