6

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

$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

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

4

2 回答 2

9

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

我测试了它,它只返回一行:

Divorce: Paying Off Spouse = Rate/Term Refinance
于 2012-04-16T19:12:36.463 回答
4

您的问题与创建优先布尔查询有关,对于这种类型的查询,必须深入布尔搜索以及现在如何执行布尔搜索。简单来说,让我解释一下为什么显示结果的第二个数字结果。

曾经应该首先了解布尔在编程中是什么意思?这意味着条件为真或假,即 0 到 1。

现在让我解释一下布尔搜索是如何执行的?你给了两个字。让我们以布尔模式逐行搜索。搜索引擎现在开始并在找到第一个单词的地方逐行搜索,它使记录为真并对找到第一个单词的行给予 1 分,并准备在该行中找到的单词数。

现在它移动下一个单词并执行相同的过程,使记录为 True,并在找到该单词的任何位置创建一个记录列表,并准备在该行中找到的单词数。

现在有两行结果可用,它们被合并,优先考虑单词数最多的单词,这里的行是主要问题所在。

例子

第一个>>>总数。>> 第二 >> 总数 >>> 最终 >> 行
单词 >>> 结果 >> 单词 >>>> 单词 >>> 结果 >>no >>Answer


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

当将两个结果列表合并为 true 时添加 false 则结果为 true,就好像您添加 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 这个词会使查询变得有点慢,但没有其他可用的解决方案。希望这能解决您的疑问。

于 2012-04-21T19:03:11.757 回答