我有以下情况: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 分钟或更长时间。
有什么建议可以解决这个问题吗?