2012-09-12 4 views
0

데이터베이스에서 퍼지 검색을 위해 이중 메타 폰을 사용 중입니다. 나는 이름의 테이블을 가지고 있으며 성 및 이름 모두 이미 이중 메타 폰 항목이 생성되어 있습니다 (그리고 트리거를 통해 업데이트됩니다). 내 응용 프로그램에서는 사용자가 성 및/또는 이름으로 검색 할 수 있도록 허용하고 있습니다.성/이름 조합을위한 이중 메타 폰으로 MSSQL을 조회하기위한 SQL

마지막 및 이름을 모두 처리 할 때 Double-Metaphone 인덱스에서 최상의 결과를 얻으려면 데이터베이스를 쿼리하는 가장 좋은 방법은 무엇입니까? 성을 기반으로하는 쿼리는 쉽습니다. DM 태그를 생성하고 데이터베이스를 쿼리하십시오. 그것은 처음부터 끝까지 질의하는 것이고 나는 미세 조정을하고 싶습니다.

사용자 입력이 [성] FIRSTNAME] 한글 이름 또는 LASTNAME + [이니셜, 이름의 조합 :

tblName 
    FirstName 
    LastName 
    MetaPhoneFN1 
    MetaPhoneFN2 
    MetaPhoneLN1 
    MetaPhoneLN2 

출원 :

데이터베이스 레이아웃은 다음과 유사 , 이름의 일부].

Lastname: SMITH 
FirstName: J or Jo or John or Johnathan 

"J"를 첫 번째 이름으로 전달하면 "J %"와 (과) 일치하는 모든 이름 항목을 원합니다.

"JO"를 첫 번째 이름으로 전달하면 "JO %"와 (과) 일치하는 모든 이름 항목을 원합니다. 나는 DM에게 어쩌면 또한

또는 "존 %"를 사용하고 싶습니다 - 나는 FIRSTNAME으로 "JOHN"또는 "조나단"에 전달하면

?

저는 여기에 대한 첫 번째 제안에 대해 정말로 열려 있습니다. 결과가 가능한 한 좋고 사용자가 원하는 것을 반환하고 싶습니다.

데이터베이스에 마지막 + 이름 조합을 쿼리하는 가장 좋은 방법은 무엇입니까? 여기에 지금까지 왔 무엇의 샘플입니다 .. 나는 결과와 완전히 흥분하지 않다 : 내가 할 시도한 무엇

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의 다른 유사에 대한 계정입니다. 그러나 내 결과는 내가 원하는 것만은 아니다.

더블 메타 폰 값을 생성/생성하기 위해 SQL/C# 등의 이중 메타 폰 구현을 많이 찾을 수 있었지만 그 값을 얻으면 실제로 데이터베이스를 실제로 쿼리하는 방법은 없습니다.

요약 :

내가 모두 LASTNAME 및 FIRSTNAME로 검색 - 나는 단지 성에서 더블 메타 폰의 경기를 위해 데이터베이스를 조회하고 싶습니다,하지만 난 많은 유연성을하고자 할 때 firstname도 전달 .. 첫 번째 이니셜? 처럼 들리다 ? 등등. 나는 제안과 SQL 예제에 열려있다.

UPDATE 1 : 나는 결과에 흥분 아니에요 말할 때 .. 무슨 말인지 나는 결과를 극대화하기 위해, 쿼리의 FIRSTNAME 부분을 공식화하는 방법을 잘 모르겠어요 것입니다. "WILL"을 검색하면 어떤 결과가 반환되어야합니까? WILLIAM, WILL, WILBERT ..하지만 워커는 아니지만 - 내가 여기있는 것과 함께, WILL -> FL과 WALKER IS [FLKR]하지만 윌리엄은 [FLM]이기 때문에 워커가 반환 될 것입니다.DM = DM이라면 WILLIAM도 반환하지 않을 것입니다. DM 길이가 <이면 LIKE를 수행하는 이유입니다.

기본적으로 다른 사람이이 문제에 부딪혔다는 것을 알고 다른 사람들이 생각해 낸 해결책을 확인하십시오.

먼저 초기 만 - 내가 불확실 해요 어디 여기 - 그 초기 로 시작하는 모든 firstnames 표시해야합니다 : 부분 이름 - 모든 firstnames이 부분부터 시작해야한다을? [부분 이름인지 어떻게 알 수 있습니까?] 전체 이름 - DM을 사용해야합니까?

+0

* 그러나 내 결과는 내가 원하는 것이 아닙니다. * 샘플 데이터와 원하는 출력을 제공하면 도움이됩니다. – RedFilter

+0

감사합니다. 조금 더 추가했습니다. 기본적으로 다른 사람이이 문제를 해결했는지, 사람들이 어떤 해결책을 제시했는지 알고 싶습니다.나는 거의 모든 검색의 약/생성/더블 메타 폰 값이기 때문에, 검색에 많은 행운을 가지고, 어디 DBDM = PASSEDINDM를 조회하지 않았습니다. 그 부분은 간단합니다. 이름과 성을 모두 볼 때 (2 가지 값), 좀 더 필요합니다! –

답변

0

무엇을 반환할지에 대한 비즈니스 규칙을 결정하고 LIKE 대 DM (또는 둘 다)을 사용할 때 고려해야 할 사항은 무엇입니까?

DM 값의 길이가 고려 되더라도 한 번 고려하지 않는 것.

"유언장"을 검색하면 결과가 반환 되나요? WILLIAM, WILL, WILBERT ..하지만 워커가 아닙니다. 비록 내가 여기에 있지만 WILLER> FL과 WALKER IS [FLKR]하지만 WILLIAM IS [FLM]이기 때문에 WALKER 이 반환 될 것입니다. 난 단지 DM = DM을 할 경우 나는 WILLIAM도 는 DM 길이가 그래서 < 4.

경우 I가, 처음에 LIKE를하고 있어요 이유입니다 반환하지 것입니다 이 경우 :

의지가 -> FL와 워커가 [FLKR]하지만 윌리엄은> [FLM]

당신이 상단에 가장 일치하는 여러 요소를 돌려주는으로 OK입니다 가정입니다, 당신은 주문 것 저장된 일치하는 DM 값의 길이에 따른 결과는 오름차순 ing. WALIAM 이전에 WALKER가 제안되었습니다.

첫 번째 이름의 경우 여러 가능한 일치 항목을 반환해도 문제가 없다고 다시 가정하면 정확한 문자열 일치 (DM 제외)와 정확한 DM 일치, 부분 일치 DM 및 유사 검색어 일치가 가장 짧은 순서로 표시 될 수 있습니다 DM이 먼저 일치하고 LIKE가 일치 한 다음 나머지 DM 일치의 나머지가 일치합니다. 이것은 대개 UNIONed 쿼리를 사용하면 가장 쉽게 완료 할 수 있습니다.

반환되는 문자열 길이가 입력 문자열 길이와 얼마나 다른지 (더 작은 차이 = 더 일치하는 값)만큼 LIKE 일치를 순위 지정할 수도 있습니다.

당신이 직면하고있는 어려움은 약자로 된 이름을 음성 학적으로 유사한 이름과 결합하는 것입니다. 그 두 가지 목적은 때로는 서로 대립하는 것입니다.

0

Bill은 또 다른 복잡한 문제를 던집니다. ;-) Bill은 William의 약어입니다.

이 주제에 대한 제 생각은 약어 일 수도 있고 약어 일 수도 있고 발음 구분과는 별개의 문제로 취급하는 것이 가장 좋습니다. 약어에 대한 해결책을 찾았 으면 메타 폰을 통해 결과를 제공하십시오.