次の状況があります: 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
2 番目の列には、ロシア語/英語の文字と単語、数字、および #、%、\ などの特殊文字を含めることができます。ロシア語/英語の文字と数字だけで検索を整理したい。
スフィンクスの構成:
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 記号未満の単語を 1 つ以上含むフレーズ (たとえば、「te t test」) を入力すると、sphinx の動作が非常に遅く、約 1 分以上かかることです。
この問題を解決する方法はありますか?