source

Oracle에서 퍼지 텍스트 검색

ittop 2023. 7. 31. 21:55
반응형

Oracle에서 퍼지 텍스트 검색

저는 600000개 이상의 행이 있는 국가 전체의 거리 이름이 포함된 큰 Oracle DB 테이블을 가지고 있습니다.응용 프로그램에서 주소 문자열을 입력하고 이 주소 문자열의 특정 하위 문자열이 테이블의 하나 이상의 거리 이름과 일치하는지 확인하여 해당 주소 하위 문자열을 거리 이름으로 레이블을 지정할 수 있습니다.

분명히, 이것은 퍼지 텍스트 일치 문제여야 합니다. 제가 쿼리하는 하위 문자열이 DB 테이블의 거리 이름과 정확하게 일치할 가능성은 거의 없습니다.그래서 일종의 모호한 텍스트 매칭 접근법이 있어야 합니다.CONTENS 및 CATSEARCH 검색 연산자가 설명된 오라클 문서(http://docs.oracle.com/cd/B28359_01/text.111/b28303/query.htm )를 읽으려고 합니다.그러나 이것들은 문서에서 지정된 문자열에 대한 일치 검색과 같은 더 복잡한 작업에 사용되는 것 같습니다.저는 단지 테이블의 한 칸에 대해 그것을 하고 싶습니다.

이 경우, Oracle은 그러한 종류의 퍼지 텍스트 매칭 쿼리를 지원합니까?

UTL_MATCH에는 문자열을 일치시키고 유사성을 비교하는 메서드가 포함되어 있습니다.Levenshtein Distance라고도 하는 편집 거리가 시작하기에 적합할 수 있습니다.하나의 문자열은 부분 문자열이므로 문자열 크기와 관련된 편집 거리를 비교하는 데 도움이 될 수 있습니다.

--Addresses that are most similar to each substring.
select substring, address, edit_ratio
from
(
    --Rank edit ratios.
    select substring, address, edit_ratio
        ,dense_rank() over (partition by substring order by edit_ratio desc) edit_ratio_rank
    from
    (
        --Calculate edit ratio - edit distance relative to string sizes.
        select
            substring,
            address,
            (length(address) - UTL_MATCH.EDIT_DISTANCE(substring, address))/length(substring) edit_ratio
        from
        (
            --Fake addreses (from http://names.igopaygo.com/street/north_american_address)
            select '526 Burning Hill Big Beaver District of Columbia 20041'   address from dual union all
            select '5206 Hidden Rise Whitebead Michigan 48426'                address from dual union all
            select '2714 Noble Drive Milk River Michigan 48770'               address from dual union all
            select '8325 Grand Wagon Private Sleeping Buffalo Arkansas 72265' address from dual union all
            select '968 Iron Corner Wacker Arkansas 72793'                    address from dual
        ) addresses
        cross join
        (
            --Address substrings.
            select 'Michigan'           substring from dual union all
            select 'Not-So-Hidden Rise' substring from dual union all
            select '123 Fake Street'    substring from dual
        )
        order by substring, edit_ratio desc
    )
)
where edit_ratio_rank = 1
order by substring, address;

이러한 결과는 좋지 않지만 적어도 좋은 출발점이 되기를 바랍니다.어떤 언어든 사용할 수 있어야 합니다.그러나 언어 또는 로케일별 비교 규칙과 이를 결합하고 싶을 것입니다.

SUBSTRING          ADDRESS                                                  EDIT_RATIO
---------          -------                                                  ----------
123 Fake Street    526 Burning Hill Big Beaver District of Columbia 20041   0.5333
Michigan           2714 Noble Drive Milk River Michigan 48770               1
Michigan           5206 Hidden Rise Whitebead Michigan 48426                1
Not-So-Hidden Rise 5206 Hidden Rise Whitebead Michigan 48426                0.5

오라클 데이터베이스에서 사용할 수 있는 SOUNDEX 기능을 사용할 수 있습니다.SOUNDEX텍스트 문자열의 숫자 서명을 계산합니다.이를 사용하여 비슷한 소리를 내는 문자열을 찾을 수 있으므로 문자열 비교 횟수를 줄일 수 있습니다.

편집됨: 만약SOUNDEX해당 지역 언어에 적합하지 않습니다. Google에 음성 서명 또는 음성 일치 기능을 요청하여 성능을 개선할 수 있습니다.이 함수는 새 테이블 항목당 한 번, 쿼리당 한 번씩 평가해야 합니다.따라서 Oracle에 상주할 필요가 없습니다.

예: 터키식 SOUNDEX가 이곳에서 프로모션됩니다.

일치하는 품질을 높이기 위해, 거리 이름 철자는 첫 번째 단계에서 통일되어야 합니다.이 작업은 일련의 규칙을 적용하여 수행할 수 있습니다.

단순화된 예제 규칙:

  1. 모든 문자를 소문자로 변환
  2. 이름 끝에 있는 "str" 제거
  3. 이름 끝에 있는 "drv" 제거
  4. 이름 끝에 있는 "장소" 제거
  5. 이름 끝에 있는 "ave"를 제거합니다.
  6. 여러 단어로 이름을 알파벳 순으로 정렬
  7. "of", "and", "the", ...와 같은 보조 단어를 삭제합니다.

언급URL : https://stackoverflow.com/questions/25258954/fuzzy-text-searching-in-oracle

반응형