1

私は、制御できないプロセスによって入力されている 4,000 万のレコードを含む mysql テーブルを持っています。データは毎月 1 回だけ追加されます。このテーブルは、名前列で検索できる必要があります。ただし、名前の列には、「Last First Middle」という形式で完全な名前が含まれています。

sphinx.conf には、

sql_query = SELECT Id, OwnersName,
substring_index(substring_index(OwnersName,' ',2),' ',-1) as firstname, 
substring_index(OwnersName,' ',2) as lastname
FROM table1

スフィンクス検索を使用して姓名で検索するにはどうすればよいですか? 「Smith」を名だけで検索できるようにしたいのですが?

4

4 に答える 4

4

SQL クエリの行ごとの関数は、大きくなる可能性のあるテーブルでは常に悪い考えです。列の一部を検索する場合は、それを独自の列に抽出してインデックスを作成する必要があります。

(入力プロセスではなく) スキーマを制御できる場合は、OwnersName から関連情報を抽出して新しい列に適切に入力する update/insert トリガーと共に、OwnersFirstName および OwnersLastName という名前の新しい列を挿入することをお勧めします。

これは、クエリを実行するたびにではなく、行が変更されたときにのみ名を理解する費用がかかることを意味します。それはそれをするのに適切な時期です。

その後、クエリは驚くほど高速になります。そして、はい、これは 3NF を破りますが、ほとんどの人は、結果を理解していれば、パフォーマンス上の理由からそうしても問題ないことに気づいていません。また、新しい列はトリガーによって制御されるため、懸念されるデータの重複は「クリーン」です。

データベースに関して人々が抱える問題のほとんどは、クエリの速度です。パフォーマンスを大幅に向上させるためにディスク容量を少し無駄にしても、通常は問題ありません。

スキーマでさえまったく権限がない場合は、「正しい」スキーマを使用して独自のデータベースを作成し、実際のデータベースから定期的に入力することもできます。次に、あなたに問い合わせます。ただし、これには毎月かなりの量のデータ転送が含まれる可能性があるため、許可されている場合は最初のオプションが適しています。

于 2009-08-08T11:51:29.327 に答える
1

他の回答から判断すると、私は何かを見逃している可能性があります...しかし、Sphinxでの検索を特定のフィールドに制限するには、拡張(またはextended2)一致モードを使用していることを確認してから、次のクエリ文字列を使用します@firstname Smith

于 2009-08-10T21:47:03.700 に答える
0

部分文字列を使用して、検索するフィールドの部分を取得できますが、プロセスが遅くなります。クエリは、比較を行うためにどのような種類のインデックスも使用できないため、テーブル内の各レコードにアクセスする必要があります。

複数の値を同じフィールドに格納するのではなく、名前コンポーネントを 3 つの別々のフィールドに格納するのが最善です。フィールドに複数の値を保存する場合、ほとんどの場合、データへのアクセスに問題があります。私はこれをさまざまなフォーラムで何度も見ています...

于 2009-08-08T11:52:12.413 に答える
0

完全な名前には接頭辞、接尾辞、ミドル ネームが含まれるがミドル ネームが含まれない、ハイフンを含むまたは含まない姓名の合成などが含まれる可能性があるため、これは扱いにくい問題です。100% の信頼性でこれを行うための合理的な方法はありません。

于 2009-08-08T11:55:28.023 に答える