0

データベース内のあいまい検索に 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 を使用する必要がありますか?

4

2 に答える 2

0

何を返すか、LIKEとDM(またはその両方)の使用を検討するかについてのビジネスルールを決定するのはあなた次第です。

DM値の長さですが、考慮していないように思われることがあります。

「WILL」を検索すると、どのような結果が返されますか?WILLIAM、WILL、WILBERT ..しかし、WALKERではありません-私がここに持っているものでは、WILL->FLおよびWALKERは[FLKR]ですが、WILLIAMは[FLM]であるため、WALKERが返されます。DM = DMのみを実行すると、WILLIAMも返されません。そのため、DMの長さが4未満の場合、最初にLIKEを実行します。

したがって、この場合:

WILL->FLおよびWALKERは[FLKR]ですが、WILLIAM> IS [FLM]

一番上に最も一致する複数の一致を返すことに問題がないと仮定すると、保存されている一致するDM値の長さの昇順で結果を並べ替えます。したがって、WALKERはWILLIAMの前に提案されます。

名についても、複数の可能な一致を返すことに問題がないと仮定すると、最初に完全な文字列の一致(非DM)を返し、次に完全なDMの一致を返し、次に部分的なDMとLIKEの一致を、最短のDMの一致の順に最初に返すことができます。次に、LIKEが一致し、残りの長いDMが一致します。多くの場合、これは一連のUNIONクエリを使用して行うのが最も簡単です。

返される文字列の長さが入力された文字列の長さとどの程度異なるかによってLIKE一致をランク付けすることもできます(差が小さいほど一致が良くなります)。

あなたが直面している困難は、略語の検索と音声的に類似した名前を組み合わせていることです。これらの2つの目的は時々互いに対立しています。

于 2012-09-12T19:59:12.087 に答える
0

さらに厄介なことに、;-)、Bill は William の略語でもあります。

この件に関する私の考えでは、略語の可能性がある名前、または略語である名前は、音声マッチングとは別の問題として扱うのがおそらく最善であるということです。略語の解決策を思いついたら、metaphone を介して結果をフィードします。

于 2013-12-26T16:21:03.987 に答える