您好:我想对标有关键字的产品进行“加权搜索”。 (所以:不是全文搜索,而是 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 /
我想要的是对至少“包含”一个相关关键词的所有产品进行评分。如果我搜索 ('Dog','Elephant','Maus') 我想要那个
狗得分为 1.003, 1.002的大象 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,如果你能帮我解决这个问题 :-)
最佳答案
我认为其中很多都在 Lucene 引擎 (http://lucene.apache.org/java/docs/index.html) 中,它在 Zend 框架中可用于 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
子句。)
关于sql - 加权关键字搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4723839/