加权关键字搜索

时间:2011-01-18 12:06:21

标签: sql mysql weighted

您好:我想对使用关键字标记的产品进行“加权搜索”。 (所以:不是全文搜索,而是n-to-m-relation)。所以这就是:

Table 'product':
sku  - the primary key
name

Table 'keywords':
kid   - keyword idea
keyword_de  - German language String   (e.g. 'Hund','Katze','Maus')
keyword_en  - English language String  (e.g. 'Dog','Cat','Mouse')

Table 'product_keyword' (the cross-table)
sku   \__ combined primary key
kid   /

我想要的是获得至少“包含”一个相关关键字的所有产品的分数。如果我搜索('狗','大象','Maus')我想要那个

狗得分为1.003, 1.002的大象 Maus of 1.001

所以最不重要的搜索词从1.001开始,其他一切都是0.001 ++。这样,3.0的较低分数限制将等于“AND”查询(必须找到所有三个关键字),1.0的较低分数限制将等于“OR”。在或多或少匹配的东西之间的任何东西。特别是通过根据该分数进行排序,最相关的搜索结果将是第一个(无论下限)......

我想我必须用

做点什么
  IF( keyword1 == 'dog', 1.001, 0) + IF...

也许在一个SUM()中,并且可能在交叉表的JOIN结尾处有一个GROUP BY,是吗?但我对如何解决这个问题毫无头绪。

什么是可行的,是事先从关键字中获取关键字ID。这是一个便宜的查询。所以关键字表可以被忽略,而且它们都是关于交叉和产品表的另一个...

我手边有PHP自动编写一个相当冗长的PHP语句,但我想避免进一步多个SQL语句。特别是因为我将限制查询结果(最常见的是“LIMIT 0,20”)用于分页模式结果,因此通过脚本在结果之间循环大量数据并不好......

DANKESCHÖN,如果你可以帮助我: - )

1 个答案:

答案 0 :(得分:2)

我认为很多都是在Lucene引擎(http://lucene.apache.org/java/docs/index.html)中,它可以在Zend Framework中用于PHP:http://framework.zend.com/manual/en/zend.search.lucene.html

编辑:

如果你想做你正在讨论的加权事物,我想你可以使用这样的东西:

select p.sku, sum(case k.keyword_en when 'Dog' then 1001 when 'Cat' then 1002 when 'Mouse' then 1003 else 0 end) as totalscore
from products p
left join product_keyword pk on p.sku = pk.sku
inner join keywords k on k.kid = pk.kid
where k.keyword_en in ('Dog', 'Cat', 'Mouse')
group by p.sku

(编辑2:忘记了group by条款。)