Sphinx 如何将行与查询中的一个或多个单词匹配,但不匹配查询中的任何单词?

Sphinx 如何将行与查询中的一个或多个单词匹配,但不匹配查询中的任何单词?,sphinx,Sphinx,我在MySQL数据库中有一个表,其中有一个逗号分隔的标记列表 我希望用户能够输入逗号分隔的标记列表,然后使用或MySQL选择在查询中至少有一个标记,但查询中没有任何标记的行 查询可以有不在行中的其他标记,但如果行中有不在查询中的标记,则不应匹配这些行 我想使用Sphinx或MySQL进行搜索 下面是一个例子: creatures: ---------------------------- | name | tags | -------------------------

我在MySQL数据库中有一个表,其中有一个逗号分隔的标记列表

我希望用户能够输入逗号分隔的标记列表,然后使用或MySQL选择在查询中至少有一个标记,但查询中没有任何标记的行

查询可以有不在行中的其他标记,但如果行中有不在查询中的标记,则不应匹配这些行

我想使用Sphinx或MySQL进行搜索

下面是一个例子:

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
是特定于字段的。因为只有一个领域是有效的。由于多个领域需要更具创造性,一个主要问题是排名公式不知道当前领域的名称。但确实具有特定于字段的用户权重。将更新答案。