狮身人面像和PHP集成.性能低


Sphinx and PHP integration. Low performance

我有以下情况:DB ~ 116G ~800 mln。 具有下一个结构的行:

  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `key` varchar(256) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `key` (`key`(255)) USING BTREE

第二列可以包含俄语/英语字母和单词、数字和特殊字符,如 #、%'' 等。我只想按俄语/英语字符和数字组织搜索。

狮身人面像配置:

source keywords
{
    sql_query_pre       = SET NAMES utf8
    sql_query       = '
        SELECT * '
        FROM keywords
    sql_query_info      = SELECT * FROM keywords WHERE id=$id
}
index keywords
{
    source          = keywords
    docinfo         = extern
    dict            = keywords
    mlock           = 0
    min_stemming_len    = 1
    min_word_len        = 1
    charset_type        = utf-8
    charset_table = U+0030..U+0039, U+0041..U+005A, U+0061..U+007A, U+0410..U+044F
    ignore_chars        = U+0021..U+0029, U+003A..U+0040, U+005B..U+0060, U+007B..U+040F, U+0450..U+2FFFF
    min_prefix_len      = 1
    enable_star = 1
    html_strip      = 0
}
indexer
{
    mem_limit       = 1024M
}
searchd
{
    client_timeout      = 300
    max_children        = 30
    max_matches     = 1000000
    max_packet_size     = 8M
    max_batch_queries   = 32
}

PHP配置:

    $oCl->SetMatchMode(SPH_MATCH_PHRASE);
    $oCl->SetLimits(0, $iLimit);
    $sQueryForSphinx = implode('* ', explode(' ', $oCl->EscapeString($sQuery))) . '*';
    $aResult = $oCl->Query('" ' . $sQueryForSphinx . ' "');

我想提供下一个搜索算法:在$Query我有用户数据。只能有包含俄语/英语字符和空格分隔的数字的单词。单词的最小长度为 1。最小字数为 1,最大值为 3。我想在数据库中查找包含这些单词的所有键,其顺序与用户键入的顺序相同。 此外,每个单词都可以在单词末尾包含其他符号。

例:用户键入: tes 测试 test1:应返回包含以下短语的键:"tes test test1"、"test test1 test12"、"test1 test12 test124"等。

此配置非常适合长度大于 4 个符号的单词。搜索时间小于5秒。

我的问题是,当我输入一个包含一个或多个长度少于 4 个符号的单词的短语时(例如"te t 测试"),狮身人面像的工作非常缓慢,大约 1 分钟或更长时间。

任何建议如何解决此问题?

您可以尝试dict=crc ,对于这些查询,应该会表现得更好。(以较慢的索引和更大的索引为代价)

对于短词搜索,dict=keywords索引可能非常慢。由于"前缀爆炸"问题。

dict=关键字最近才成为默认模式,因此它的性能仍然没有得到很好的理解。请参阅此处的评论:http://sphinxsearch.com/blog/2013/09/11/deprecations-and-changes-in-the-2-2-series/我谈论的索引很小 - 它用于自动完成,但性能差异为 100 倍。