Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 加权关键字搜索_Sql_Mysql_Weighted - Fatal编程技术网

Sql 加权关键字搜索

Sql 加权关键字搜索,sql,mysql,weighted,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 Strin

您好:我想对带有关键字标记的产品进行“加权搜索”。 (因此:不是全文搜索,而是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   /
我想要的是为所有至少“包含”一个相关关键字的产品打分。如果我搜索(‘狗’、‘大象’、‘毛斯’),我就要它

狗的分数为1.003, 大象1.002 Maus为1.001

所以最不重要的搜索项从1.001开始,其他的都是0.001++。这样,分数下限3.0将等于“和”查询(必须找到所有三个关键字),分数下限1.0将等于“或”。介于两者之间的任何东西或多或少都是匹配的。特别是根据这个分数进行排序,最相关的搜索结果将排在第一位(不考虑下限)

我想我得做点什么了

  IF( keyword1 == 'dog', 1.001, 0) + IF...
可能在SUM()中,也可能在交叉表的联接末尾有一个GROUP BY,是吗?但我对如何解决这个问题相当无知

可行的方法是事先从关键字中获取关键字id。这是一个廉价的查询。所以关键字表可以被忽略,它是关于交叉表和乘积表的其他部分

我手头有PHP可以自动准备相当长的PHP语句,但我希望避免更多的SQL语句。特别是因为我将限制分页模式结果的查询结果(通常为“限制0,20”),所以通过脚本循环大量中间结果将是不好的


DANKESCHÖN,如果你能在这方面帮助我:-)

我想很多都是在Lucene引擎中(http://lucene.apache.org/java/docs/index.html),可用于Zend框架中的PHP:

编辑:

如果你想做你所说的加权的事情,我想你可以用这样的方法:

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:忘记了
分组依据
条款。)

谢谢。如果它变得比这更大,我必须要一个严肃的框架。目前,我想通过一个(可能是令人讨厌的)问题逃脱惩罚……给你。。。我现在测试了它,它似乎起作用了。不知道这有多快,如果这正是你的意思…太好了,谢谢你!(是的,使用整数而不是浮点数是明智之举。浮点数承担着舍入风险,这可能会让我得不到我想要的……正如在货币计算中所学到的那样……)