您好:我想对用关键字标记的产品进行“加权搜索”。 (因此:不是完整的搜索,而是n-to-m ryation)。所以这里是:

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为1.001

因此,最不重要的搜索词从1.001开始,其他所有0.001 ++。这样,较低的分数限制为3.0将等于”和“查询(必须找到所有三个关键字),较低的分数限制为1.0将等于“或”。在某些或多或少匹配之间的任何内容。特别是通过按此分数进行排序,最相关的搜索结果将首先是(无论下限如何)...

我想我将不得不做些事情

  IF( keyword1 == 'dog', 1.001, 0) + IF...

也许在一个总和()内,可能是在横桌上的联接结束时与一个组在一起,是吗?但是我毫无头绪地解决这个问题。

可行的是事先从关键字中获取关键字ID。那是一个便宜的查询。因此,关键字表可以忽略,这全都与十字架和产品表的另一个有关...

我手头有PHP可以自动准备相当长的PHP语句,但我想避免进一步的多个SQL语句。特别是因为我将限制查询结果(最常见于“限制0,20”),因此要进行分页模式,因此通过脚本循环大量的结果介于两者之间是不好的...

Dankeschön,如果您可以帮助我:-)

有帮助吗?

解决方案

我认为其中很多是在Lucene Engine(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 条款。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top