0

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

  `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 test test1:应返回包含以下短语的键:“tes test test1”、“test test1 test12”、“test1 test12 test124”等。

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

我的问题是,当我输入一个包含一个或多个长度小于 4 个符号的单词(例如“te t test”)的短语时,sphinx 的工作速度非常慢,大约需要 1 分钟或更长时间。

有什么建议可以解决这个问题吗?

4

1 回答 1

0

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

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

dict=keywords 最近才被设为默认模式,所以它的性能还不是很清楚。请参阅此处的评论: http ://sphinxsearch.com/blog/2013/09/11/deprecations-and-changes-in-the-2-2-series/ 我所说的索引很小 - 它用于自动完成,但是是 100 倍的性能差异。

于 2013-10-29T20:24:29.290 回答