mysql全文搜索未返回预期结果

时间:2012-11-02 13:33:55

标签: mysql full-text-search

所以我想使用全文搜索来实现更好的搜索功能,但是它没有按预期运行。它不会返回任何结果,也不会返回我认为不相关的结果。

首先我查了一下:

  

显示' ft_min%'

等变量

...返回4

所以我有一个充满游戏标题的数据库。搜索的一个很好的例子是"刺客信条"。在数据库中,它们实际上存储为"刺客的信条" (注意撇号)。因此,如果我执行以下查询:

  

SELECT g_name,MATCH(g_name)AGAINST('刺客信条')AS得分FROM   tgmp_games WHERE MATCH(g_name)反对('刺客信条')LIMIT 15

返回结果很好(下面有些)

...但是使用搜索脚本,它使用JqueryUI自动完成下拉列表,并且当为任何字符数少于整个单词的内容提交查询时,它会返回空白

  

SELECT g_name,MATCH(g_name)AGAINST(' assass')AS得分FROM   tgmp_games WHERE MATCH(g_name)反对('刺客')限制15

我还读过,如果数据库中的行数太低,那么数据库中的行数会产生影响,但是那里的行数是25k,所以应该没问题。我做错了什么?

我可以得到的结果输出,但更感兴趣的是如何让部分搜索词返回一些结果。

Array
(
    [g_name] => Assassins Creed III
    [score] => 15.406005859375
)

Array
(
    [g_name] => The Witcher 2: Assassins of Kings
    [score] => 8.46316719055176
)

Array
(
    [g_name] => Tenchu: Shadow Assassins
    [score] => 8.46316719055176
)

Array
(
    [g_name] => The Witcher 2: Assassins of Kings - Enhanced Edition
    [score] => 8.27909851074219
)

Array
(
    [g_name] => Assassin\'s Creed
    [score] => 6.84770059585571
)

Array
(
    [g_name] => Assassin\'s Creed III
    [score] => 6.84770059585571
)

Array
(
    [g_name] => Assassin's Creed II
    [score] => 6.84770059585571
)

Array
(
    [g_name] => Assassin's Creed: Revelations ...
    [score] => 6.77157783508301
)

Array
(
    [g_name] => Assassin\'s Creed: Revelations
    [score] => 6.77157783508301
)

Array
(
    [g_name] => Assassin's Creed: Brotherhood
    [score] => 6.77157783508301
)

Array
(
    [g_name] => Assassin's Creed: Bloodlines
    [score] => 6.77157783508301
)

Array
(
    [g_name] => Assassin's Creed II: Discovery
    [score] => 6.77157783508301
)

Array
(
    [g_name] => Assassin\'s Creed III: Liberation
    [score] => 6.77157783508301
)

Array
(
    [g_name] => Assassin's Creed: Altair's Chronicles
    [score] => 6.69712924957275
)

Array
(
    [g_name] => Assassin's Creed II:  Bonfire of the Vanities
    [score] => 6.69712924957275
)

此顺序也很奇怪,因为"巫师2"超越其他"刺客的信条"游戏。不确定我是否可以使用某种模式来避免卡在标点符号上?

1 个答案:

答案 0 :(得分:6)

查看MySQL文档以了解布尔搜索。 http://dev.mysql.com/doc/refman/5.5/en//fulltext-boolean.html。您可能想要使用的是*运算符(类似于%通配符)。

MATCH(g_name)AGAINST('assass *'IN BOOLEAN MODE)

由于MySQL应用于全文索引的50%规则,表中的行数会生效。如果一个单词出现在表中超过50%的行中,那么MySQL认为它太常见了,无法提供缩小结果的任何值,而忽略它。这通常用于消除像“the”这样的单词。