【发布时间】:2015-05-07 04:36:36
【问题描述】:
假设我有一个表格,其中列出了一些带有 title 列的项目
现在给定一个标题为“AAA BBB CCC DDD”的项目,我想检索至少有 n-1 匹配词的所有项目。
目前我正在生成n-1 单词的所有组合(php 端),然后使用 LIKE 进行匹配,所以是这样的:
SELECT
`e`.`title`
FROM `items` AS `e`
WHERE ((
(e.title LIKE '%AAA%' AND e.title LIKE '%BBB%' AND e.title LIKE '%CCC%') OR
(e.title LIKE '%AAA%' AND e.title LIKE '%BBB%' AND e.title LIKE '%DDD%') OR
(e.title LIKE '%AAA%' AND e.title LIKE '%CCC%' AND e.title LIKE '%DDD%') OR
(e.title LIKE '%BBB%' AND e.title LIKE '%CCC%' AND e.title LIKE '%DDD%')))
问题
我远不是一个 SQL 大师 :) 有没有比上面的例子更好的方法?
一个额外的要求是搜索带有
n-2字词的项目,以防找不到带有n-1的项目。 我的想法是找到所有与n-1、n-2匹配的项目,直到 2 并且在结果集中有一个包含匹配单词数的动态列,因此根据这个分数对结果进行排序,这可能吗?
额外信息:
我无法更改表结构/属性。 (我会打破系统“一致性”,因为我在 Magento 上,所以“项目”是指产品)
标题实际上位于单独的表中,因此在实际场景中它位于连接表中
【问题讨论】:
-
似乎是全文索引的任务
-
考虑在实际场景中简化了示例查询我在第二个表上有标题所以我必须做一个连接...说我不确定它是什么全文索引但是我确定我不能更改表索引
-
检查MATCH函数。它有一个适合你的“评分”功能
-
不幸的是fullindex不可用,所以匹配功能