데이터베이스 퍼지 검색 개념


13

나는 이것에 대해 생각하고 예를 들어 사용자가 철자 실수를 입력하는 경우 데이터베이스를 퍼지 검색하는 방법에 대한 솔루션을 생각해 내려고 노력했습니다. 이것 뒤에 논리에 눈부신 문제가 있습니까? 작동하고 이전에 수행 되었습니까?

우리가 검색하고자하는 테이블 :

**tblArticles**
Body - Soundex_Body - CharacterCoded_Body

따라서 실제 표시를 위해 원본 텍스트를 저장합니다. 다른 두 열은 다음과 같은 방식으로 사전 계산 된 검색에 사용됩니다.

Soundex

몸은 단어로 나뉘어지고 soundex 버전으로 번역됩니다. IE, 결과 본문은 다음과 같습니다.

H252 B54 C23 E33... etc

따라서 누군가는 'dinosore'에 들어갈 수 있으며 기사 본문에는 'dinosaur'가 있으며 둘 다 B26으로 평가됩니다. 그런 다음 검색어의 soundex 값에 대해 LIKE를 실행합니다.

문자 코드

문자를 소수로 매핑하는 문자 매핑이 주어지면 IE는 다음과 같습니다.

h = 2
e = 3
l = 5
o = 7
p = 11
c = 13

help = 2*3*5*11     =   330
hello = 2*3*5*5*7   =   1050
hell = 2*3*5*5      =   150
hlep = 2*5*3*11     =   330
cello = 13*3*5*5*7  =   6825

사용자가 'hello'를 입력하려고했지만 'hlelo'와 같이 둘 이상의 문자를 전환 한 경우 동일한 숫자로 평가됩니다. 원시를 단어로 분할하고 모든 단어를 프라임 인코딩하고 데이터베이스에 저장하여 다음과 같은 필드를 제공합니다.

330 6825 330 1050... etc

그런 다음이 값을 검색하여 잘못된 유형과 일치시킬 수 있습니다.

혜택

  • 오타 방지
  • 발음이 잘못된 철자법
  • 영어 이외의 비영어권
  • soundex가 작동하는 모든 언어로 작동합니다

의견과 생각? 일종의 다층 검색. 물론 가중치 반환 값을 더 좋게 만들 수 있습니다 (즉, 문자 본문 일치가 더 가치가 있음). 이것은 철자 오류 및 영어를 모국어가 아닌 사람들이 검색을 수행하는 데 적합한 솔루션입니까?


이것이 Trigram Search와 어떻게 비교되는지 흥미로울 것입니다.
Rich

워드 프레스를 위해 이와 같은 것을 갖고 싶습니다.
Kit Menke

해시 함수에 소수를 사용하면 동일한 방법을 포함하지 않는 단어 충돌이 불가능합니까? 가치가 낮은 문자가 많은 짧은 단어와 동일한 값으로 해시 된 값이 낮은 문자가 많은 긴 단어를 가질 수는 있지만 숫자 이론을 잘 모릅니다. 그것은 아마도 어떤 식 으로든 잘 입증되었을 것입니다.
glenatron

1
@Glen Afaik 곱하기 소수는 항상 고유 한 숫자를 생성합니다. 그러나 아나그램은 충돌하지만 얼마나 많은 문제가 있는지, 즉 기본적으로 아나그램을 빨리 찾는 지점입니다.
Tom

@Glen : 고유성에 대한 고유 인수 분해 정리를 참조하십시오.
Steven Evers

답변:


2

다른 검색 알고리즘이 많이 있습니다. Smith-Waterman 은 인간 텍스트에 가장 적합한 방법 중 하나이며 BLAST 는 DNA 서열 검색에 가장 적합합니다. hlep대신에 다양한 철자 오류가있는 텍스트가 표시되면 최소 편집 거리를help 찾고있는 것입니다 .

라이브러리가 SQL Server 2005 이상에서 CLR로 이러한 여러 기능을 구현하려면 소스 위조 프로젝트 SimMetrics를 참조하십시오 . SimMetrics 에 대한 블로그 게시물 . http://staffwww.dcs.shef.ac.uk/people/S.Chapman/simmetrics.html

Soundex는 지역 언어 변형 간의 주요 차이점이 모음에 거의 배타적이기 때문에 개발되었으므로 모음을 던지기 때문입니다. 전치 된 편지에 잘 대처하지 못합니다.


2

Apache Solr은 동의어 및 맞춤법 교정을 지원하지만 여전히 가장자리에서 약간 거칠습니다.

퍼지 검색은 Ngram을 사용하여 구현할 수 있습니다.

포터 Stemmer : http://tartarus.org/~martin/PorterStemmer/

http://wordnet.princeton.edu/ 와 같은 언어 데이터베이스

...하지만 Xapian 및 Solr과 같은 프로젝트는이 부분을 대부분 처리합니다.

자체 단어 검색 구문 분석 / 검색 엔진을 구축하려면 언어 검색을 수행하도록 설계된 기존 데이터베이스에 생성 한 토큰 또는 용어를 넣는 것이 좋습니다.


1

한 문자열을 다른 문자열로 변환하는 데 얼마나 많은 변경 사항이 있는지 확인하고 두 문자열이 얼마나 밀접하게 일치하는지에 대해 0과 1 사이의 숫자 값을 반환하는 주소에 대해 잠시 전에 같은 작업을 수행했습니다.

N / North, St / Street, EastMain / MainEast 등과 같은 항목에 대해 높은 값을 반환하기 때문에 훌륭하게 작동했습니다. 아이디어는 이 CodeProject 링크 에서 나왔습니다.


주소 일치를 위해 작성한 코드가 오픈 소스입니까?
Thismatters

@Thismatters 코드에 액세스 할 수는 없지만 답변의 링크는 논리를 제공해야합니다. 기본적으로 하나의 문자열을 다른 문자열로 만드는 데 얼마나 많은 변경이
Rachel

0

이름이나 사람 또는 장소와 일치하는 경우 동의어 목록이 훨씬 잘 작동 할 수 있습니다.

Soundex가 "Dick == Richard" "Kit == Christopher"또는 "Ms. == Mrs"와 일치하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.