如何解决仅当至少X个单词匹配时才选择“全文”
SELECT source,id
FROM memory_row
WHERE memory_id =10
AND MATCH(source)
AGAINST ('girl*,appears*,cool*,pragmatic*,things*,first*,glance*,actually*,warm*,trusting*,created*,Design*,Children*,Togetsu*,existed*,solely*,activate*,Strings*,experienced*,emotional*,damage*,young*,from*,experiments*,conducted*,her*,cruel*,researchers*,sent*,Randall*,family*,treatment*,after*,sealing*,memories*,small*,world*,older*,adoptive*,sister*,Naomi*')
上面的查询返回的结果中只有几个单词匹配。我只想返回至少包含X个匹配项的结果。在上面的示例中,该数字可以为10。这意味着该列必须至少包含10个全文匹配项才能返回。
我该怎么做?
编辑 一个答案建议如下。我收到错误消息“ AGAINST的参数不正确”。
select m.*
from memory_row m
where
memory_id = 10
and (
select count(*)
from (
select 'girl*' word
union all select 'appears*'
union all select 'actually*'
union all select 'girl*'
union all select 'cool*'
union all select 'pragmatic*'
union all select 'things*'
union all select 'first*'
union all select 'glance*'
union all select 'actually*'
) w
where match(m.source) against(w.word)
) >= 5
解决方法
我不确定是否有一种简单的方法可以执行您想要的操作。您可能需要将这些值枚举为行,然后使用相关的子查询来计算匹配数:
select m.*
from memory_row m
where
memory_id = 10
and (
select count(*)
from (
select 'girl*' word
union all select 'appears*'
...
) w
where match(m.source) against(w.word)
) >= ?
问号代表应匹配的最小行数。
或者,在最新的MySQL版本中:
select m.*
from memory_row m
where
memory_id = 10
and (
select count(*)
from (values row('girl*'),row('appears*'),...) w(word)
where match(m.source) against(w.word)
) >= ?
,
一种方法是使用match
获取一组初始文档。然后是其他逻辑:
SELECT mr.*
FROM (SELECT source,id
FROM memory_row
WHERE memory_id = 10 AND
MATCH(source) AGAINST ('girl*,appears*,cool*,pragmatic*,things*,first*,glance*,actually*,warm*,trusting*,created*,Design*,Children*,Togetsu*,existed*,solely*,activate*,Strings*,experienced*,emotional*,damage*,young*,from*,experiments*,conducted*,her*,cruel*,researchers*,sent*,Randall*,family*,treatment*,after*,sealing*,memories*,small*,world*,older*,adoptive*,sister*,Naomi*')
) mr
WHERE ( (source like '%girl%') +
(source like '%actually%') +
. . .
) >= 10;
注意:这与完全逻辑不同,因为它只是在寻找字符串。如果需要更精确的逻辑,可以使用正则表达式,但这可能不是必需的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。