MySQL全文搜索布尔模式混淆

时间:2012-04-06 18:24:07

标签: php mysql search full-text-search boolean

在尝试使用布尔模式下的全文搜索设置搜索时,我有点困惑。这是我正在使用的查询:

$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

我是否正确地认为第二个结果不应该出现,因为它没有两个字?如果没有,我该如何创建该功能?

2 个答案:

答案 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”这个词会使查询变慢,但没有其他解决方案可用。希望这能解决您的疑问。