データベース内のあいまい検索に Double-Metaphone を使用しています。名前のテーブルがあり、名字と姓の両方に既に作成されている (およびトリガーを介して更新されている) 2 つの metaphone エントリがあります。私のアプリケーションでは、ユーザーが姓や名で検索できるようにしています。
姓と名の両方を処理するときに Double-Metaphone インデックスから最良の結果を得るために、データベースにクエリを実行する最良の方法は何ですか? 姓だけに基づいてクエリを実行するのは簡単です。DM タグを生成し、データベースにクエリを実行します。微調整が必要なのは、first と last の両方でクエリを実行するときです。
データベースのレイアウトは次のようになります。
tblName
FirstName
LastName
MetaPhoneFN1
MetaPhoneFN2
MetaPhoneLN1
MetaPhoneLN2
アプリケーション: [姓] [名]
ユーザーは姓のみ、または姓 + [名のイニシャル、名、名の一部] の組み合わせを入力します。
Lastname: SMITH
FirstName: J or Jo or John or Johnathan
名として「J」を渡すと、「J%」に一致するすべての名前エントリが必要になります。
名として「JO」を渡すと、すべての名前エントリが「JO%」に一致するようになります。
名として「JOHN」または「JOHNATHAN」を渡す場合 - DM を使用したい
それとも「JOHN%」ですか?
ファーストネームについては、ここで提案をお待ちしております。結果をできるだけ良くして、ユーザーが望むものを返したいと思っています。
last + first name のこれらの組み合わせのいずれかをデータベースに照会する最良の方法は何ですか? ここに私がこれまでに得たもののサンプルがあります..そして私は結果に完全に興奮していません:
SELECT *
FROM tblName
WHERE
--There will always be a last name
(MetaPhoneLN1 = @paramMetaPhoneLN1
OR (CASE WHEN @paramMetaPhoneLN2 IS NOT NULL AND MetaPhoneLN2 = @paramMetaPhoneLN2 THEN 1
WHEN @paramMetaPhoneLN2 IS NULL THEN 0
END) = 1)
-- Match Firstname 1
AND (CASE WHEN @paramMetaPhoneFN1 IS NULL THEN 1
WHEN @paramMetaPhoneFN1 IS NOT NULL AND MetaPhoneFN1 = @paramMetaPhoneFN1 THEN 1
WHEN LEN(@paramMetaPhoneFN1) > 1 AND LEN(@paramMetaPhoneFN1) < 4 AND MetaPhoneFN1 LIKE @paramMetaPhoneFN1 + '%' THEN 1
WHEN LEN(@paramMetaPhoneFN1) = 1 THEN 1
END) = 1
-- Match Firstname 2
AND (CASE WHEN @paramMetaPhoneFN2 IS NULL THEN 1
WHEN @paramMetaPhoneFN2 IS NOT NULL AND MetaPhoneFN2 = @paramMetaPhoneFN2 THEN 1
WHEN LEN(@paramMetaPhoneFN2) > 1 AND LEN(@paramMetaPhoneFN2) < 4 AND MetaPhoneFN2 LIKE @paramMetaPhoneFN2 + '%' THEN 1
WHEN LEN(@paramMetaPhoneFN2) = 1 THEN 1
--ELSE 0
END) = 1
AND (CASE WHEN @paramFirstName IS NULL THEN 1
WHEN FirstName LIKE @paramFirstName + '%' THEN 1
--WHEN LEN(@paramMetaPhoneFN1) = 1 AND @paramFirstName IS NOT NULL AND LEN(@paramFirstName) > 1 AND FirstName LIKE @paramFirstName + '%' THEN 1
--ELSE 1
END) = 1
私が試みたのは、firstname のさまざまなバリエーションを説明することです。しかし、私の結果は、まさに私が望むものではありません。
Double-Metaphone の値を /generating/ するために、SQL/C# などで Double Metaphone の実装をたくさん見つけることができましたが、これらの値を取得したら、実際にデータベースを効果的にクエリする方法については何も見つかりませんでした。
まとめ:
姓と名の両方で検索する場合 - 姓のみで一致する Double Metaphone をデータベースに照会したいのですが、名も渡されたときに多くの柔軟性が必要です..最初のイニシャル ? のように聞こえる ?提案や SQL の例を歓迎します!
更新 1: 私が結果に興奮していないと言うとき.. 私が言っているのは、結果を最大化するために、クエリの Firstname 部分をどのように定式化するかわからないということです。「WILL」を検索すると、どのような結果が返されますか? WILLIAM、WILL、WILBERT .. しかし WALKER ではありません - ただし、私がここに持っているものでは、WILL -> FL および WALKER は [FLKR] であり、WILLIAM は [FLM] であるため、WALKER が返されます。DM = DM のみを実行すると、WILLIAM が返されることさえありません。そのため、DM の長さが 4 未満の場合、そもそも LIKE を実行しています。
基本的に、他の誰かがこの問題に遭遇したかどうかを知り、他の人がどのような解決策を考え出したかを知りたい.
最初のイニシャルのみ - そのイニシャルで始まるすべてのファーストネームを表示する必要があります - ここで私は確信が持てません: [名前の一部かどうかはどうやってわかりますか?!] フルネーム - DM を使用する必要がありますか?