弦の長さはどれくらいですか?
それらが比較的短く(例:英語の単語; avg_len =5)、データベースストレージに余裕がある場合は、次のアプローチを試してください。
- テーブルに保存する単語ごとに、代わりにその単語の可能なすべての接尾辞を取ります。つまり、何も残らなくなるまで最初の文字を削除し続けます。たとえば、
value
という単語 与える:value
-
alue
-
lue
-
ue
-
e
- 各を保存 データベース内のこれらのサフィックスのうち。
-
LIKE 'alu%'
を使用して部分文字列を検索できるようになりました (「値」の一部として「alu」が見つかります)。
すべてのサフィックスを保存することで、ストレージスペースを犠牲にして、先頭のワイルドカード(インデックスを高速ルックアップに使用できるようにする)の必要性を排除しました。
ストレージコスト
単語を格納するために必要な文字数は、word_len*word_len / 2
になります。 、つまり、単語ごとに、単語の長さが2次式になります。さまざまな単語サイズの増加の要因は次のとおりです。
- 3文字の単語:
(3*3/2) / 3 = 1.5
- 5文字の単語:
(5*5/2) / 5 = 2.5
- 7文字の単語:
(7*7/2) / 7 = 3.5
- 12文字の単語:
(12*12/2) / 12 = 6
単語を格納するために必要な行数が1からword_len
に増加します 。このオーバーヘッドに注意してください。大量の冗長データを保存しないように、追加の列は最小限に抑える必要があります。たとえば、単語が最初に見つかったページ番号は問題ないはずですが(unsigned smallintと考えてください)、単語の広範なメタデータは、接尾辞ごとではなく、単語ごとに別々のテーブルに保存する必要があります。
考慮事項
「単語」(またはフラグメント)を分割する場所にはトレードオフがあります。実際の例として:ハイフンで何をしますか?形容詞five-letter
を保存しますか 一言か二言で?
トレードオフは次のとおりです。
- 分割されたものはすべて、単一の要素として見つけることはできません。
five
を保存する場合 およびletter
別途、five-letter
を検索します またはfiveletter
失敗します。 - ではないもの 分割すると、より多くのストレージスペースが必要になります。ストレージ要件は、単語の長さが2乗で増加することを忘れないでください。
便宜上、ハイフンを削除してfiveletter
を保存することをお勧めします。 。 five
を検索すると、単語が見つかります。 、letter
、およびfiveletter
。 (検索クエリからもハイフンを削除しても、ユーザーはfive-letter
を正常に見つけることができます。 。)
最後に、オーバーヘッドをあまり発生させない接尾辞配列を格納する方法がありますが、それらがデータベースに適切に変換されるかどうかはまだわかりません。