1

빠른 방법이 아닌 문자 비교를 기반으로 검색 할 수 있습니다. 비교가 리터럴이 아니어도 테이블 필드 간의 관계는 충분히 간단합니다. 즉, "filippo", "philippo", "filipo"등을 상관시킬 수 있어야합니다.빠른 방법은 비 문자 비교 내가 오히려 큰 데이터 세트 위에 작은 검색을 개발하고</p> <p>, 기본적으로 모든 문자열을 기반으로 검색 할

나는 내가 내 특정한 경우에 실용적입니다 확실하지 오전하지만 매우 자주, Levinstein 거리 (this, herehere)에 비틀 할 수있는 몇 가지 방법을 발견했다.

간단히 말해서 나는 "검색 키"가있는 작은 테이블과 검색이 수행되어야하는 더 큰 테이블이 있습니다. 두 테이블 모두 동일한 필드를 가지며 둘 다 동일한 "의미"를가집니다. 예 :

KEYS_TABLE 
# | NAME | MIDNAME | SURNAME | ADDRESS   | PHONE 
1 | John | Fake | Doe  | Sesame St.  | 333-12-32 
2 | Ralph | Stue | Michel | Bart. Ghost St. | 778-13000 
... 

SEARCH_TABLE 
# | NAME  | MIDNAME | SURNAME | ADDRESS   | PHONE 
... 
532 | Jhon  | F.  | Doe  | Sesame Street | 3331232 
... 
999 | Richard | Dalas | Doe  | Sesame St.  | 333-12-32 

내가 운영 체제가 KEYS_TABLE에 각각의 주어진 레코드에 대한 몇 가지 통계의 종류, 또는 순위를 얻을 수있다 싶은 것은, 보고서는 특정 관련성 위 SEARCH_TABLE의 모든 기록은 (기준 중 하나를 정의 메트릭 또는 단순히 "KNN"과 같은 메소드).

나는 모든 행의 모든 ​​필드에 대해 KEYS_TABLE x SEARCH_TABLE으로 계산해야하기 때문에 Levinstein 거리가 실용적이지 않을 수도 있습니다. SEARCH_TABLE에 약 4 억 개의 레코드가 있고 KEYS_TABLE이 100k에서 1mil까지 다양하다는 점을 감안하면 결과 값은 너무 큽니다.

나는 이전에 두 테이블을 풍부하게 만들 수있는 방법이 있거나, 검색을 수행하는 좀 더 단순한 (저렴한) 방법이 있기를 바랬습니다.

데이터를 자유롭게 변형 할 수 있음을 언급 할만한 가치가 있습니다. 예 : St. ~ st, Street ~ st을 정규화하고 특수 문자를 제거하는 식으로 진행합니다.

내 옵션은 무엇입니까? 내가 생각할 수

답변

0

한 가지 방법 (! 휴리스틱)입니다 :

테이블의 원래 필드에 추가

, 각 필드에 대해 일부 stemming 알고리즘에 의해 얻은 그 표준화 형식를 저장합니다. Java를 사용하는 경우 lucene의 EnglishAnalyzer이이 단계를 도와 줄 수 있습니다.

정확한 비교을 수행하십시오. table1의 각 항목을 찾기 위해 표준 방법을 사용하십시오. table2의 항목 e2은 정규화 된 양식이 정규 양식과 일치하는 공통 필드가있는 경우 e1table1의 후보가됩니다. 빠른 문자열 검색을 허용하는 일부 데이터 구조를 사용하면 효율적으로 수행 할 수 있습니다.당신이 선택한 정확한 통계를 사용하여 목록에 대해 "최고"후보/S를 찾을 수 있습니다 (예를 들어 당신의 제안 leneshtein 거리) 당신은 몇 가지 사후 작업을 수행 할 수 있습니다

-e1의 각 항목에 대해

table2의 동일한 요소에 매핑 된 table1에 두 개의 요소가 없는지 확인하는 것이 좋습니다.

0

맞춤법 오류가있는 경우 Soundex 또는 Metaphone을 검색에 사용할 수 있습니다.