我有一个名为indx_0的表格,其中我选择所有“pid”(产品ID)与“wid”(字ID)的组合,按照与大多数单词匹配的产品对它们进行分组。现在,由于实际单词存储在名为“windex”的不同表中,因此表indx_0仅包含与单词ID匹配的产品ID。
以下是我用来获取结果的当前查询。
SELECT pid, count(*) WordMatchCount
FROM indx_0
WHERE wid in ( 294, 20591, 330 )
group by pid
order by WordMatchCount desc
limit 1000
说我搜索“ddr存储卡”我不会得到包含“ddr3”优先于任何其他关键字的结果,因为它搜索完全匹配。所以“ddr存储卡”和“手机存储卡”将被视为相同,因为“ddr3”和“phone”都不等于ddr。
我想使用join和LIKE(或任何其他更好的方式)来允许“ddr”与“ddr3”或“ddr2”非常接近地匹配,以便在没有紧密匹配的其他结果上优先于它。
以下是表结构:
CREATE TABLE IF NOT EXISTS `windex` (
`word` varchar(64) NOT NULL,
`wid` int(10) NOT NULL AUTO_INCREMENT
PRIMARY KEY (`wid`),
UNIQUE KEY `word` (`word`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=834922 ;
CREATE TABLE IF NOT EXISTS `indx_0` (
`wid` int(7) NOT NULL,
`pid` int(7) NOT NULL,
UNIQUE KEY `wid` (`wid`,`pid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
这可能吗?
谢谢你!答案 0 :(得分:0)
如果你按字ID过滤,你显然没有得到近距离匹配。每个ID都有一个特定的单词。您想要的是直接从windex
查询ID并在indx_0
中查找匹配项。
SELECT i0.pid, count(*) WordMatchCount
FROM indx_0 AS i0
LEFT JOIN windex AS wi ON (wi.wid = i0.wid)
WHERE wi.word REGEXP '(.*)ddr(.*)|(.*)memory(.*)|(.*)card(.*)'
group by i0.pid
order by WordMatchCount desc
我确保运行EXPLAIN
并索引相应的列。