如何将行与查询中的一个或多个词匹配,但没有查询中没有的词? [英] How to match rows with one or more words in query, but without any words not in query?

查看:0
本文介绍了如何将行与查询中的一个或多个词匹配,但没有查询中没有的词?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆