在尝试使用布尔模式下的全文搜索设置搜索时,我有点困惑。这是我正在使用的查询:
$query = "SELECT *,
MATCH(title) AGAINST('$q' IN BOOLEAN MODE) AS score
FROM results
WHERE MATCH(title) AGAINST('$q' IN BOOLEAN MODE)
ORDER BY score DESC";
当我搜索+divorce+refinance
时,返回的结果是:
1) Divorce: Paying Off Spouse = Rate/Term Refinance
2) Divorce - What to Look Out For Regarding Divorced Borrowers
我是否正确地认为第二个结果不应该出现,因为它没有两个字?如果没有,我该如何创建该功能?
答案 0 :(得分:9)
也许我弄错了,但是如果你搜索这个字符串+divorce+refinance
,你会得到一个奇怪的结果。如果您要搜索两个字词,则应搜索+divorce +refinance
(中间有空格)。
我测试了它,它只返回一行:
Divorce: Paying Off Spouse = Rate/Term Refinance
答案 1 :(得分:4)
您的问题与创建优先级布尔查询有关,对于这种类型的查询,必须深入布尔搜索以及现在如何执行布尔搜索。简单来说,让我解释一下为什么会显示结果的第二个数字结果。
首先应该先了解布尔在编程中的意义吗? 这意味着条件为真或假i,e 0到1.
现在让我解释一下布尔搜索的执行情况?你给了两个字。让我们在布尔模式下逐行搜索。搜索引擎启动并逐行搜索,其中找到第一个单词,它使记录成立,并将得分为1,找到第一个单词的行,并准备在行中找到的单词数。
现在它移动下一个单词并执行相同的过程,将记录设为True,并在找到单词的位置创建记录列表,并准备在行中找到的单词数。
现在有两行结果可供使用,并且它们是棒状的,并且优先考虑的是具有最大字数和行数的单词,这里的主要问题在于。
实施例
首先>>>总数。 >>第二个>>总数。 >>>最终>>排
Word>>>结果> Word>>>>的话> > >结果>> no>>答案
1>>>>>>>>> 2 - ;>>>>>>&GT 1为卤素;>>>>>>>&GT 1为卤素;>>>>>>&GT ; 1.33>>>> 1>>> 1.33
0>>>>>>>>> 0 GT;>>>>>>&GT 2 - ;>>>>>>>&GT 2 - ;>>>>>>&GT ; 1.25>>>> 2>>> 1.25
0>>>>>>>>> 0 GT;>>>>>>&GT 1为卤素;>>>>>>>大于0>>>>>>>&GT ; 1.25>>>> 3>>> 1
虽然将两个结果列表分组为true时加上false,然后结果为真,就好像你添加1 + 0 = 1并且结果的值应该大于1.因此,在对找到的单词的相关性进行评分时,它是总是发现搜索引擎会在找到任何单词的地方显示结果。
评分相关性查询以两种类型完成,要么忽略等于1的分数,只对分数大于1的记录进行计算。其次是进行这样的查询,即它永远不会显示等于1的记录。就像你的情况一样,你可以通过以下方式获得两个单词的正确结果:
SELECT *, ( (1.3 * (MATCH(title) AGAINST ('+term +term2' IN BOOLEAN MODE))) + (0.6 * (MATCH(text) AGAINST ('+term +term2' IN BOOLEAN MODE))) ) AS score FROM results WHERE ( MATCH(title, text) AGAINST ('+term +term2' IN BOOLEAN MODE) ) HAVING relevance > 0 ORDER BY relevance DESC;
我知道使用“HAVING”这个词会使查询变慢,但没有其他解决方案可用。希望这能解决您的疑问。