2012-04-06 59 views
6

当我尝试在布尔模式下利用全文搜索设置搜索时,我感到有点困惑。下面是我使用的查询:MySQL全文搜索布尔模式混淆

$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 

难道我就在想,第二个结果不应该出现的,因为它没有两个词?如果不是,我该如何创建该功能?

回答

9

也许我错了,但如果你搜索这个字符串+divorce+refinance你会得到一个奇怪的结果。如果你想搜索这两个单词,你应该搜索+divorce +refinance(之间有一个空格)。

我测试,它仅返回一行:

Divorce: Paying Off Spouse = Rate/Term Refinance 
4

你的问题涉及到创建一个优先布尔查询,并为这种类型的查询一个有去的布尔搜索的深度和现在怎么样执行布尔搜索。简而言之,让我解释为什么显示结果的第二个数字结果。

一旦首先应该理解布尔在编程中意味着什么? 这意味着要么条件是真或假i,e 0到1.

现在让我解释为布尔搜索执行?你已经给了两个字。让我们在布尔模式下逐行搜索。搜索引擎现在开始并逐行搜索发现第一个单词的地方,这会使记录为真,并将找到的第一个单词的行的分数设为1,并准备在该行中找到的单词数。

现在移动下一个单词,做同样的过程给记录真何字被发现,也准备在该行中找到的单词的数量,使记录列表。

现在有结果的两排都可以和他们在一起,随该优先考虑的话与话的最大数量和行这里是主要问题所在。

首先>>>总NOS。 >>第二>>总数。 >>>最终>>行
字>>>结果>>字>>>>字>>>结果>> >>没有回答


1 >>>>>>>> 2 >>>>>>>> 1 >>>>>>>>> 1 >>>>>>>> 1.33 >>>> 1 >>> 1.33
0 >>>>>>>> 0> >>>>>>> 2 >>>>>>>>> 2 >>>>>>>> 1.25 >>>> 2 >>> 1.25
0 >>>>>>>> 0 >> >>>>>> 1 >>>>>>>>> 0 >>>>>>>> 1.25 >>>> 3 >>> 1

虽然泡吧两个结果列表真正添加如果你输入1 + 0 = 1,那么结果是真的d与值大于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使查询有点慢,但有没有其他可用的解决方案。希望这可以解决您的问题。