2

私のmysqlデータベースには2,000,000の文字列があります。さて、新しい文字列が入力されると、その文字列が既にデータベースにあるかどうかを調べようとします。そうでない場合は、文字列を挿入します。

文字列一致の定義

私の場合、テキスト内の単語の位置は問題ではありません。すべての単語のみが文字列に含まれ、どちらの文字列にも余分な単語が含まれないようにする必要があります。

例 - Ram is a boy AND boy is a Ramが一致すると言われます。ラムは似合わないいい子です。

PS - 意味を無視してください

さて、私の質問は、一致する必要がある文字列の数(2,000,000)を考慮して、これらの一致を行う最良の方法は何ですか.

私が考えることができる解決策:

  1. SOLR/Sphinx のすべての文字列にインデックスを付ける
  2. 新しい検索では、検索サーバーにヒットするだけで、最大で上位 10 個の文字列を考慮する必要があります

利点:-

  1. mysql 全文検索よりも高速

短所: -

  1. mysql データベースの新しいクエリで検索サーバーを最新の状態に保ちます。

私が行くことができる他のより良い解決策はありますか? これに取り組むための提案とアプローチは大歓迎です:)

ありがとう !

4

3 に答える 3

2

並べ替えられた順序で単語を含む 2 番目の列を計算できます。次に、その列の一意のインデックスのみ:)

ALTER TABLE table ADD sorted varchar(255) not null, unique index(sorted);

次に...(便宜上PHPですが、他の言語も同様です)

$words = explode(' ',trim($string));
sort($words);
$sorted = mysql_real_escape_string(implode(' ',$words));
$string = mysql_real_escape_string($string);

$sql = "INSERT IGNORE INTO table SET `string`='$string',`sorted`='$sorted'";
于 2013-10-08T05:23:41.423 に答える
1

既存のデータに関する情報を格納するテーブルをさらに作成することをお勧めします。テーブルのデータ量に関係なく、クエリの「一致/チェックおよび挿入」ロジック中にパフォーマンスの問題に対処する必要がないようにします。

SOに関する別の投稿で、同様の要件に対して私が行ったスキーマの提案を確認してください。

あいまい一致に対応

上記の投稿では、ニーズを達成するために、データが 90% の精度で一致すると述べた追加のテーブルが 1 つだけ必要です。その答えが明確でない場合、または疑問がある場合はお知らせください。

編集-1

あなたの場合、3つのテーブルがあります。2,000,000 個の文字列メッセージが保存されている場所です。今、私が話していた別の 2 つのテーブルは次のとおりです。すべての一意の Expression (すべてのメッセージで一意の単語) を格納する 2 番目のテーブル 各 Expression(単語) と単語が表示されるメッセージとの間のリンクを格納する 3 番目のテーブル。以下のクエリ結果を参照してください。

ここに画像の説明を入力

ここに画像の説明を入力

次に、入力に「Is Boy Ram」という文字列があるとします。最初に、この文字列に 3 ある文字列から各式を抽出します。「イズ」と「ラム」と「ボーイ」。単一の StringID の最後のテーブル「MyData_ExpressionString」にこれらすべての式が存在するかどうかを確認するには、Select クエリを完了するだけです。これで、より良いイメージが得られ、次に何をすべきかがわかったと思います。はい、私はインデックスを作成していませんが、必要なインデックスはすでにわかっていると思います。

于 2013-10-08T04:26:54.497 に答える
0

指定された文字列のフィルターにすべての単語を追加して、各文字列のブルーム フィルターを計算します。新しい文字列検索では、ブルーム フィルターを計算し、DB で一致する文字列を検索します。

おそらく、かなり短いブルーム フィルターで十分です。文字列をテストすると、必要な長さがわかる場合があります。

于 2013-10-08T04:00:37.580 に答える