我有以下情况: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 倍。