Sphinx 如何将行与查询中的一个或多个单词匹配,但不匹配查询中的任何单词?
我在MySQL数据库中有一个表,其中有一个逗号分隔的标记列表 我希望用户能够输入逗号分隔的标记列表,然后使用或MySQL选择在查询中至少有一个标记,但查询中没有任何标记的行 查询可以有不在行中的其他标记,但如果行中有不在查询中的标记,则不应匹配这些行 我想使用Sphinx或MySQL进行搜索 下面是一个例子:Sphinx 如何将行与查询中的一个或多个单词匹配,但不匹配查询中的任何单词?,sphinx,Sphinx,我在MySQL数据库中有一个表,其中有一个逗号分隔的标记列表 我希望用户能够输入逗号分隔的标记列表,然后使用或MySQL选择在查询中至少有一个标记,但查询中没有任何标记的行 查询可以有不在行中的其他标记,但如果行中有不在查询中的标记,则不应匹配这些行 我想使用Sphinx或MySQL进行搜索 下面是一个例子: creatures: ---------------------------- | name | tags | -------------------------
creatures:
----------------------------
| name | tags |
----------------------------
| cat | wily,hairy |
| dog | cute,hairy |
| fly | ugly |
| bear | grumpy,hungry |
----------------------------
示例搜索:
wily,hairy <-- should match cat
cute,hairy,happy <-- should match dog
happy,cute <-- no match (dog has hairy)
ugly,yuck,gross <-- should match fly
hairy <-- no match (dog has cute cat has wily)
grumpy <-- no match (bear has hungry)
grumpy,hungry <-- should match bear
wily,grumpy,hungry <-- should match bear
狡猾多毛的斯芬克斯表情朗克应该能够做到这一点
sphinxQL> SELECT *, WEIGHT() AS w FROM index
WHERE MATCH('@tags "cute hairy happy"/1') AND w > 0
OPTION ranker=expr('IF(word_count>=tags_len,1,0)');
基本上,您希望匹配标记的数量永远不少于标记的数量
注意,这些只是给所有文档一个权重1,如果想要获得更精细的排名(如匹配其他关键字),它会变得更复杂
您需要在索引上启用index\u field\u length
,以获取标记长度属性
(同样的概念在mysql中显然是可能的。可能使用FIND_in_SET进行匹配。或者使用第二列存储数字,或者使用REPLACE函数计算标记的数量)
编辑以添加,有关多个字段的详细信息
sphinxQL> SELECT *, WEIGHT() AS w FROM index
WHERE MATCH('@tags "cute hairy happy"/1 @tags2 "one two thee"/1') AND w = 2
OPTION ranker=expr('SUM(IF(word_count>=IF(user_weight=2,tags2_len,tags_len),1,0))'),
field_weights=(tags=1,tags2=2);
SUM函数会依次为每个字段运行,因此需要使用用户权重系统来区分当前正在枚举的字段。谢谢!有没有办法获得每列的字数而不是匹配的总字数?如果我添加了一个tags2
列,并希望复制匹配行为(即为每个tags列传递一组标记),那么使用word\u count
将不再有效。在这种情况下,IF语句需要是:IF(tag\u word\u count>=tags\u len和tag2\u word\u count>=tags2\u len,1,0)
实际上word\u count
是特定于字段的。因为只有一个领域是有效的。由于多个领域需要更具创造性,一个主要问题是排名公式不知道当前领域的名称。但确实具有特定于字段的用户权重。将更新答案。