2013-04-09 4 views
2

사용자가 문자열을 입력하여 데이터베이스에서 이름을 검색 할 수있는 간단한 응용 프로그램이 있습니다. 서버 측은 ColdFusion 7입니다. 문제는 "obrien"과 같은 쿼리가 "o'brien"이라는 이름의 항목을 반환하지 않는다는 것입니다.아포스트로피가 포함되지 않은 검색 문자열에서 아포스트로피가 포함 된 쿼리 결과를 반환하는 방법

내가 원하는 것은 퍼지 매칭 기능이라고 생각합니다. 몇 가지 연구를 한 후, 필자가 찾고자하는 전체 텍스트 검색을 발견했습니다. 그러나, 나는이 둘의 차이에 대해 확신하지 못합니다. ColdFusion에는 verity라는 서비스가 있지만 처음에는 모든 데이터베이스를 쿼리 한 다음 인덱싱해야하는 것처럼 보입니다. 비용이 많이들 것 같습니다.

처음에는 전체 데이터베이스를 쿼리하지 않고 ColdFusion에서 퍼지 일치 또는 전체 텍스트 검색을 수행 할 수있는 기본 제공 방법이 있습니까? 그렇지 않은 경우 전체 텍스트 검색을 수행 할 때 인덱스를 지정해야합니까? 예를 들어, obrien은 "obrien, o'brien, o'brein"을 색인화해야합니다. 쿼리 아래

+0

어떤 DB 백엔드를 사용하고 있습니까? # – diagonalbatman

+0

@diagonalbatman db2 메인 프레임에서 –

+3

"db2 fuzzy search"에 대한 Google 검색에서이 주제에 대한 IBM 설명서를 읽었습니다. –

답변

3

SOUNDEX founction을 사용하려고하면 어떨까요? 나는 여기에 쉬운 대답이 없다고 생각한다.

+0

Soundex는 그가 처리해야하는 모든 것이 아포스트로피이지만, 많은 소음을 허용합니다. –

+0

나는 soundex를 사용하여 끝냈습니다. 나는 일반적으로 결과를 상당히 좁히기 위해 사용자가 제공 한 충분한 이름을 가지고있다. –

2

검사,

select * 
from tablename 
where Replace(ColumnName,'''','') like 'obrien' 

또는

당신은 여기에 잘못된 트랙을하려고
select * 
from tablename 
where Replace(ColumnName,'''','') like '%obrien%' 
+0

첫 번째 예는'='이어야합니다. – rip747

-2

- 당신이 필요로하는이 아니 퍼지 일치, 자사의 매개 변수화 쿼리를.

"O'Brien"매개 변수의 값을 설정할 수 있으며 매개 변수는 포함 된 아포스트로피의 기능을 이해합니다.

+0

... 적어도 여기에 무슨 일이 일어나고 있는지 의심 스럽습니다 ... –

+1

값 "o'brien"은 데이터베이스에 있지만 사용자는 "obrien"을 검색합니다. 0 "results"O'brien "<>"obrien " – Travis

+4

당신이 맞을지 모르지만 이것은 의심스러운 사람의 이름에 아포스트로피의 두통을 피하려고하는 것처럼 보입니다. 그 남자가 오브라이언이라고 불리면 우리가 검색해야하는 이름이 아닌가? 나는 틀릴 수도 ... –

2

퍼지 검색 기능이있는 fulltextsearch를 찾고 있습니다. 더 중요한 것은 이러한 시스템에서 제공하는 내장 토큰 장치를 찾고 있다는 것입니다. 그러나 Levenshtein 편집 거리 일치 작업을 수행하는 SQL 함수를 사용할 수도 있습니다.

Verity 또는 Lucene과 같은 다른 정보 검색 시스템이 해결책이 될 수 있지만 실시간 검색이 필요한 경우 원시 데이터에서 데이터를 지속적으로 다시 색인해야합니다. Verity를 ​​자주 다시 채울 필요가없는 경우이 방법을 사용하는 것이 좋습니다. Tokenizers는 데이터베이스와 사용자의 데이터 서식을 처리하므로 동일한 문자열로 끝납니다. 또한 Verity는 ColdFusion 7에서 오래되었으므로 Lucene 4에서 찾은 것과 비교하여 퍼지 매칭 옵션이 상당히 제한적이라고 생각합니다.

또 다른 옵션은 levenshtein 편집 거리 알고리즘에 대해 aql 함수를 사용하는 것입니다. 이것은 기본적으로 한 문자열에서 다른 문자열로 이동하는 데 필요한 편집 수를 알려줍니다. 이것은 "퍼지"매칭입니다. 예를 들어 lcase (O'brien)를 lcase (obrien)로 바꾸려면 " ''을 제거해야합니다. 6 개의 길이 문자열 중 하나를 편집하면 좋은 일치입니다. "hugh"를 "jones"로 바꾸려면 5 개의 편집 (모든 문자 변경, 문자 추가)이 필요합니다. 길이 4 문자열의 5 가지 편집은별로 좋은 성냥이 아닙니다. Levenshtein distance in T-SQL

마지막으로 전체 텍스트 검색을 사용하는 모든 데이터베이스의 경우 실제 데이터에 verity와 같은 토큰 화가 생깁니다. 설치가 너무 쉽기 때문에 좋았습니다. DB2가 퍼지 매칭을 지원하는지 확신 할 수 없다. SQL Server는 그렇지 않습니다.

+0

정말 좋은 설명. 나는 왜 그가 왜 아포스트로피를 찾고 있지 않은지 이해한다. 관심 없음 - "아포스트로피가 포함되지 않은 검색 문자열에서 아포스트로피가 포함 된 쿼리 결과를 반환하는 방법"에서 "DB2에서 퍼지 일치를 달성하는 방법"으로 이동하는 데 필요한 편집 횟수 –

+0

한 번만 편집하십시오! 어떤 이유로 나는 Hugh Jones가 OP라고 생각했습니다. 하하. –

+0

Lol - 'Hugh Jones'에서 'Pariah'까지 얼마나 많은 수정 사항이 있습니까? –