如何将行与查询中的一个或多个词匹配,但没有查询中没有的词? [英] How to match rows with one or more words in query, but without any words not in query?
本文介绍了如何将行与查询中的一个或多个词匹配,但没有查询中没有的词?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我在MySQL数据库中有一个表,其中有一个逗号分隔的标记列表。
我希望用户能够输入逗号分隔的标记列表,然后使用Sphinx或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
是否可以使用Sphinx或MySQL执行此操作?
重申,查询将是一个逗号分隔的标记列表,其中至少有一个输入的标记但不应选择查询没有的标记的行。
推荐答案
Sphinx表达式排名程序应该能够做到这一点。
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_field_lengths
才能获得tag_len属性。
(同样的概念在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函数,因此需要使用USER_WEIGHTY系统来区分当前枚举的是哪个字段。
这篇关于如何将行与查询中的一个或多个词匹配,但没有查询中没有的词?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文