我有一个mysql数据库,其中包含一个名为item的简单表。项目包含以下字段,并有55,000条记录:
ID(PK) 说明(INNODB FULL TEXT) DATE
按照设计,我被迫一直索引到1个字符的单词,因为有些描述包含名称,例如项目1 a 2 42,其中的空格必须保持不变。我正在对此表运行全文搜索,以下是我对以下代码的结果:
Select ID, Description, Date
From Item
WHERE date > DATE_SUB(NOW(), INTERVAL 15 MONTH)
AND description LIKE CONCAT('%item 1 2 a 4%')
AND MATCH (description) AGAINST ('+item +1 +2 +a +4' in boolean mode);
此查询在1.2秒后返回。但是,一旦我将以下邻近搜索添加到查询中,我的返回时间就会出现:
Select ID, Description, Date
From Item
WHERE date > DATE_SUB(NOW(), INTERVAL 15 MONTH)
AND description LIKE ('%item%')
AND MATCH (description) AGAINST ('+item +1 +2 +a +4' in boolean mode)
AND MATCH (description) AGAINST ('"1 2 a 4" @30' in boolean mode);
此查询以 54秒返回!近距离搜索是我查询的必需品,因为我需要确保找到“item 1 2 a”而不是“item 1 2 48884848 222 a”这将是完全不同的。当单词超过1个字符时,邻近搜索运行得更好,但是在某些情况下会要求用户输入1个字符的单词。除了全文innodb的邻近搜索,还有其他任何我可以做的事情,但有更好的表现吗?如果MYSQL中没有其他内容,我可以使用某些东西进行集成,以便为我提供更好的邻近搜索(我现在在Windows上)。
谢谢!
答案 0 :(得分:2)
LIKE
条件会破坏您的全文索引。替换条件
description LIKE CONCAT('%item 1 2 a 4%') -- and why CONCAT() anyways?
...与
MATCH (description) AGAINST ('"item 1 2 a 4"' IN BOOLEAN MODE)
你的第二个条件是没用的,因为它与第一个条件重叠(你已经用精确的字符串“item 1 2 a 4”过滤,这些行总是匹配'+ item +1 +2 + a +4')。
答案 1 :(得分:0)
我们可以使用以下重写查询吗?
SELECT ID, Description, Date
FROM Item
WHERE date > DATE_SUB(NOW(), INTERVAL 15 MONTH)
AND MATCH (description) AGAINST ('"1 2 a 4" @30 +item' in boolean mode);
接近度很慢,因为它很复杂。建议您使用不超过两个单词进行邻近搜索。随着单词数量的增加,查询时间会增加更多。