Spellfix1 가상 테이블
Spellfix1 가상 테이블 (The Spellfix1 Virtual Table)
개요 (Overview)
이 spellfix1 가상 테이블은 큰 어휘에서 가까운 일치 항목을 검색하는 데 사용할 수 있어요. 예를 들어 spellfix1은 철자가 틀린 단어에 대한 수정 제안에 사용할 수 있어요. 또는 FTS4와 함께 사용해 잠재적으로 철자가 틀린 단어로 전문 검색(full-text search)을 할 수 있어요.
spellfix1 가상 테이블의 구현은 SQLite 소스 트리의 기타 확장(miscellaneous extensions) 폴더에, 특히 ext/misc/spellfix1.c 파일에 있어요. spellfix1 가상 테이블은 SQLite amalgamation에 포함되지 않으며 어떤 표준 SQLite 빌드의 일부도 아니에요. 그것은 로더블 확장(loadable extension)이에요.
spellfix1 확장이 로드되면 다음과 같이 spellfix1 가상 테이블 인스턴스를 만들어요.
CREATE VIRTUAL TABLE demo USING spellfix1;
"spellfix1"이라는 용어는 spellfix 모듈의 이름이며 표시된 대로 입력해야 해요. "demo"라는 용어는 만들고 있는 가상 테이블의 이름이며 애플리케이션의 필요에 맞게 바꿀 수 있어요. 가상 테이블은 처음에 비어 있어요. 가상 테이블이 유용하려면 어휘로 채워야 해요. "big_vocabulary"라는 테이블에 단어 목록이 있다고 가정해 보세요. 그런 다음 이렇게 해요.
INSERT INTO demo(word) SELECT word FROM big_vocabulary;
이 가상 테이블을 FTS4 테이블(검색어의 철자 교정용)과 함께 사용하려면 fts4aux 테이블을 사용해 어휘를 추출할 수 있어요.
INSERT INTO demo(word) SELECT term FROM search_aux WHERE col='*';
또한 각 단어에 "rank"(순위)를 제공할 수 있어요. "rank"는 단어가 얼마나 흔한지에 대한 추정치예요. 숫자가 클수록 단어가 더 흔하다는 뜻이에요. 테이블을 채울 때 rank를 생략하면 rank 1이 가정돼요. 하지만 rank 정보가 있다면 제공할 수 있고, 가상 테이블은 더 흔히 사용되는 용어를 선택하는 데 약간 선호를 보여줘요. fts4aux 테이블 "search_aux"에서 rank를 채우려면 이렇게 해요.
INSERT INTO demo(word,rank)
SELECT term, documents FROM search_aux WHERE col='*';
가상 테이블을 질의하려면 WHERE 절에 MATCH 연산자를 포함해요. 예를 들어:
SELECT word FROM demo WHERE word MATCH 'kennasaw';
미국 지명 데이터 집합(http://geonames.usgs.gov/domestic/download_data.htm에서 파생)을 사용하면 위 질의는 다음으로 시작하는 20개의 결과를 반환해요.
kennesaw
kenosha
kenesaw
kenaga
keanak
패턴 끝에 '*' 문자를 붙이면 접두사 검색(prefix search)이 수행돼요. 예를 들어:
SELECT word FROM demo WHERE word MATCH 'kennes*';
다음으로 시작하는 20개의 결과를 내놓아요.
kennesaw
kennestone
kenneson
kenneys
keanes
keenes
출처: 문서
본문
검색 정제 (Search Refinements)
기본적으로 spellfix1 테이블은 20개를 넘지 않는 결과를 반환해요. (좋은 일치 항목이 더 적으면 20개보다 적게 반환할 수 있어요.) 쿼리의 WHERE 절에 "top=N" 항을 추가해 반환되는 행 수의 상한을 변경할 수 있어요. 여기서 N은 새 최댓값이에요. 예를 들어 최고의 5개 일치 항목을 보려면:
SELECT word FROM demo WHERE word MATCH 'kennes*' AND top=5;
spellfix1 가상 테이블의 각 항목은 특정 언어와 연관되며, 정수 "langid" 열로 식별돼요. 기본 langid는 0이고, 다른 조치를 취하지 않으면 전체 어휘가 0 언어의 일부가 돼요. 하지만 애플리케이션이 여러 언어로 동작해야 한다면 테이블을 채울 때 langid 필드를 지정해 각 언어에 대해 다른 어휘 항목을 지정할 수 있어요. 예를 들어:
INSERT INTO demo(word,langid) SELECT word, 0 FROM en_vocabulary;
INSERT INTO demo(word,langid) SELECT word, 1 FROM de_vocabulary;
INSERT INTO demo(word,langid) SELECT word, 2 FROM fr_vocabulary;
INSERT INTO demo(word,langid) SELECT word, 3 FROM ru_vocabulary;
INSERT INTO demo(word,langid) SELECT word, 4 FROM cn_vocabulary;
가상 테이블이 여러 언어의 항목으로 채워진 후, 쿼리의 WHERE 절에 "langid=N" 항을 사용해 관심 있는 언어를 지정해요.
SELECT word FROM demo WHERE word MATCH 'hildes*' AND langid=1;
WHERE 절에 "langid=N" 항을 포함하지 않으면 검색은 언어 0(위 예에서 영어)에 대해 수행된다는 점에 주의하세요. 모든 spellfix1 검색은 단일 언어 id에 대해 수행돼요. 한 번에 모든 언어를 검색할 방법은 없어요.
가상 테이블 상세 (Virtual Table Details)
spellfix1 가상 테이블의 각 행은 7개의 열과 5개의 추가 숨겨진 열을 가진 고유한 rowid를 가져요. 열은 다음과 같아요.
rowid
테이블의 각 어휘 항목과 연관된 고유한 정수예요. 데이터베이스의 다른 테이블에 대한 외래 키로 사용할 수 있어요.
word
패턴과 일치하는 단어의 텍스트예요. word와 pattern 모두 유니코드 문자를 포함할 수 있고 대소문자가 혼합될 수 있어요.
rank
원래 INSERT 문에서 지정된 단어의 순위예요.
distance
패턴에서 단어로 가는 편집 거리(edit distance) 또는 Levenshtein 거리예요.
langid
단어의 언어 id예요. 모든 질의는 단일 언어 id에 대해 수행되며 기본값은 0이에요. 주어진 질의에 대해 이 값은 모든 행에서 같아요.
score
점수는 rank와 distance의 조합이에요. 낮은 점수가 더 좋다는 것이 아이디어예요. 가상 테이블은 가장 낮은 점수의 단어를 찾으려고 시도하고 기본적으로(ORDER BY로 덮어쓰지 않는 한) 점수가 증가하는 순서로 결과를 반환해요.
matchlen
접두사 검색에서 matchlen은 문자열에서 접두사와 일치하는 문자의 수예요. 접두사가 아닌 검색에서는 이 값은 length(word)와 같아요.
phonehash
이 열은 검색을 제한하는 데 사용된 음운 해시 접두사(phonetic hash prefix)를 보여줘요. 주어진 질의에 대해 이 열은 모든 행에서 같아야 해요. 이 정보는 진단 목적으로 사용할 수 있으며 실제 애플리케이션에서 보통 유용하다고 간주되지는 않아요.
top
(HIDDEN) 모든 질의에 대해 이 값은 모든 행에서 같아요. 출력될 최대 행 수인 정수예요. 실제 출력 행 수는 이 수보다 적을 수 있지만 결코 크지 않아요. top의 기본값은 20이지만, 쿼리의 WHERE 절에 "top=N" 형식의 항을 포함해 각 질의마다 변경할 수 있어요.
scope
(HIDDEN) 모든 질의에 대해 이 값은 모든 행에서 같아요. scope는 가상 테이블이 일치하는 단어를 얼마나 넓게 찾는지에 대한 척도예요. scope 값이 작을수록 더 넓은 검색을 일으켜요. scope는 보통 자동으로 선택되며 4로 제한돼요. 애플리케이션은 쿼리의 WHERE 절에 "scope=N" 형식의 항을 포함해 scope를 변경할 수 있어요. scope를 늘리면 질의가 더 빨리 실행되지만 가능한 수정 항목이 줄어들어요.
srchcnt
(HIDDEN) 모든 질의에 대해 이 값은 모든 행에서 같아요. 이 값은 궁극적으로 표시되는 최고 일치 항목을 찾기 위해 편집 거리 알고리즘으로 조사된 단어의 수인 정수예요. 이 값은 진단 전용이에요.
soundslike
(HIDDEN) 어휘 항목을 삽입할 때 이 필드는 단어가 들리는 것과 일치하는 철자로 설정할 수 있어요. 자세한 내용은 아래 "특이하고 어려운 철자 다루기" 절을 참조하세요.
command
(HIDDEN) "command" 열의 값은 항상 NULL이에요. 하지만 애플리케이션은 spellfix1 가상 테이블에서 특정 동작을 유발하기 위해 "command" 열에 특수 문자열을 삽입할 수 있어요. 예를 들어 "command" 열에 'reset' 문자열을 삽입하면 가상 테이블이 편집 거리 가중치(있다면)를 다시 읽게 돼요.
알고리즘 (Algorithm)
spellfix1 가상 테이블은 "%_vocab"이라는 단일 섀도우 테이블을 만들어요. (%는 가상 테이블 이름으로 대체돼요. 예: "demo" 가상 테이블의 경우 "demo_vocab".) 섀도우 테이블은 다음 열을 포함해요.
id
고유 id (INTEGER PRIMARY KEY)
rank
단어의 순위.
langid
이 항목의 언어 id.
word
어휘 단어의 원래 UTF8 텍스트.
k1
단어를 소문자 ASCII로 음역(transliterate)한 결과예요. 비-ASCII 문자를 ASCII로 매핑하는 표준 표가 있어요. 예: "æ" -> "ae", "þ" -> "th", "ß" -> "ss", "á" -> "a", ... 보조 함수 spellfix1_translit(X)가 비-ASCII에서 ASCII 매핑을 해요. 내장 lower(X) 함수는 소문자로 변환해요. 따라서: k1 = lower(spellfix1_translit(word)).
단어가 이미 모두 소문자 ASCII라면 k1 열은 NULL을 포함해요. 이는 %_vocab 테이블의 저장 요구를 줄이고 spellfix가 조금 더 빨리 실행되도록 도와줘요. 따라서 가능한 한 많은 spellfix 테이블을 소문자 ASCII 어휘로 채우는 것이 유리해요.
k2
이 필드는 coalesce(k1,word)에서 파생된 음운 코드(phonetic code)를 담아요. 비슷한 소리를 가진 글자는 같은 기호로 매핑돼요. 예를 들어 모든 모음과 모음 클러스터는 단일 기호 "A"가 돼요. 그리고 "p", "b", "f", "v" 글자는 모두 "B"가 돼요. 모든 비음(nasal) 소리는 "N"으로 표현돼요. 기타 등등. 매핑은 Soundex, Metaphone 및 기타 오래된 음운 일치 시스템에서 찾은 아이디어를 기반으로 해요. 이 키는 spellfix1_phonehash(X) 함수로 생성할 수 있어요. 따라서: k2 = spellfix1_phonehash(coalesce(k1,word)).
패턴과 단어 사이의 Wagner 편집 거리 또는 Levenshtein 거리를 계산하는 함수도 있어요. 이 함수는 spellfix1_editdist(X,Y)로 노출돼요. 편집 거리 함수는 X를 Y로 변환하는 "비용"을 반환해요. 일부 변환은 다른 것보다 비용이 더 들어요. 예를 들어 한 모음을 다른 모음으로 바꾸는 것은 비교적 저렴하고, 자음을 두 배로 하는 것, 또는 이중 자음의 두 번째 문자를 생략하는 것도 저렴해요. 다른 변환은 더 비싸요. 아이디어는 편집 거리 함수가 비슷한 단어에는 낮은 비용을, 더 멀리 떨어진 단어에는 더 높은 비용을 반환한다는 것이에요. 이 구현에서 단일 문자 편집(삭제, 삽입, 대체)의 최대 비용은 100이며, 일부 편집(예: 모음 변환)은 더 낮은 비용을 가져요.
비교의 "score"는 패턴과 단어 사이의 편집 거리를 단어 순위의 밑이 2인 로그로 조정한 값이에요. 예를 들어 거리 100이지만 rank가 1000인 일치 항목은 score 122(= 100 - log2(1000) + 32)를 가지는 반면, 거리 100에 rank가 1인 일치 항목은 score 131(100 - log2(1) + 32)을 가져요. (참고: 편집 거리가 0인 경우 음수가 되지 않도록 각 score에 상수 32가 더해져요.) 이렇게 해서 자주 사용되는 단어는 약간 더 낮은 비용을 받아 대체 철자 목록의 상단으로 이동하는 경향이 있어요.
철자 교정기의 단순한 구현은 검색어를 어휘의 모든 단어와 비교하고 가장 낮은 score 20개를 선택하는 것이에요. 하지만 어휘에는 보통 수십만 또는 수백만 개의 단어가 있으므로 이 접근 방식은 충분히 빠르지 않아요.
철자 교정되는 용어가 X라고 가정해 보세요. 검색 공간을 제한하기 위해 X는 다음에 해당하는 것을 사용해 k2와 같은 키로 변환돼요.
key = spellfix1_phonehash(lower(spellfix1_translit(X)))
그런 다음 이 키는 "scope" 문자로 제한돼요. 기본 scope 값은 4이지만 WHERE 절의 "scope=N" 항을 사용해 대체 scope를 지정할 수 있어요. 키가 잘린 후 편집 거리는 축약된 키로 시작하는 k2 값을 가진 어휘의 모든 용어에 대해 실행돼요.
예를 들어 입력 단어가 "Paskagula"라고 가정해 보세요. 음운 키는 "BACACALA"이며 4자 "BACA"로 잘려요. 그런 다음 k2 값이 BACA로 시작하는 어휘의 4980개 항목(총 272,597개 항목 중)에 대해 편집 거리가 실행되어 "Pascagoula"가 최고 일치 항목으로 나와요.
일치하는 langid를 가진 어휘의 용어만 검색돼요. 따라서 같은 테이블이 여러 언어의 항목을 담을 수 있고 요청된 언어만 사용돼요. 기본 langid는 0이에요.
구성 가능한 편집 거리 (Configurable Edit Distance)
고정 가중치를 가진 내장 Wagner 편집 거리 함수는 가상 테이블을 만들 때 spellfix1 모듈에 "edit_cost_table=TABLENAME" 매개변수를 지정해 애플리케이션 정의 가중치와 유니코드 지원을 가진 editdist3() 편집 거리 함수로 대체할 수 있어요. 예를 들어:
CREATE VIRTUAL TABLE demo2 USING spellfix1(edit_cost_table=APPCOST);
editdist3() 편집 거리 함수는 가상 테이블의 "command" 열에 적절한 문자열을 삽입해 런타임에도 선택하거나 선택 해제할 수 있어요.
INSERT INTO demo2(command) VALUES('edit_cost_table=APPCOST');
위 예에서 APPCOST 테이블은 편집 거리 계수를 찾기 위해 조사될 거예요. spellfix1 모듈 이름에 "edit_cost_table=" 매개변수가 있는 것이 내장 편집 거리 함수 대신 editdist3()를 사용하게 하는 원인이에요. APPCOST가 빈 문자열이면 내장 Wagner 편집 거리 함수가 사용돼요.
편집 거리 계수는 보통 APPCOST 테이블에서 한 번 읽힌 후 메모리에 저장돼요. 따라서 APPCOST 테이블에 대한 런타임 변경은 보통 편집 거리 결과에 영향을 주지 않아요. 하지만 가상 테이블의 "command" 열에 특수 문자열 'reset'을 삽입하면 편집 거리 계수가 APPCOST 테이블을 다시 읽게 돼요. 따라서 애플리케이션은 APPCOST 테이블에 변경이 생길 때 다음과 유사한 SQL 문을 실행해야 해요.
INSERT INTO demo2(command) VALUES("reset");
특이하고 어려운 철자 다루기 (Dealing With Unusual And Difficult Spellings)
위 알고리즘은 대부분의 경우 꽤 잘 동작하지만 예외가 있어요. 이런 예외는 "soundslike" 열을 사용해 가상 테이블에 추가 항목을 만들어 처리할 수 있어요.
예를 들어 그리스어 기원의 많은 단어는 "p"가 묵음인 "ps" 글자로 시작해요. 예: psalm, pseudonym, psoriasis, psyche. 또 다른 예로 많은 스코틀랜드 성은 "Mac" 또는 "Mc"로 시작해 철자될 수 있어요. 따라서 "MacKay"와 "McKay"는 모두 같은 발음이에요.
소리 나는 대로 철자되지 않은 단어에 대한 수용은 같은 단어에 대해 가상 테이블에 추가 항목을 만들되 "soundslike" 열에 대체 철자를 추가함으로써 이루어질 수 있어요. 예를 들어 "psalm"의 정식 항목은 이렇게 될 거예요.
INSERT INTO demo(word) VALUES('psalm');
"salm"의 철자를 "psalm"으로 교정하는 능력을 강화하려면 다음과 같은 추가 항목을 만들어요.
INSERT INTO demo(word,soundslike) VALUES('psalm','salm');
각 항목이 다른 soundslike 값을 가지는 한 같은 단어에 대해 여러 항목을 만드는 것은 괜찮아요. soundslike 값을 지정하지 않으면 soundslike는 기본적으로 단어 자체가 된다는 점에 주의하세요.
아래는 추가 soundslike 항목을 추가하는 것이 의미 있을 수 있는 몇 가지 경우예요. 구체적인 항목은 애플리케이션과 대상 언어에 따라 달라져요.
- "ps"로 시작하는 단어의 묵음 "p": psalm, psyche
- "pn"으로 시작하는 단어의 묵음 "p": pneumonia, pneumatic
- "pt"로 시작하는 단어의 묵음 "p": pterodactyl, ptolemaic
- "dj"로 시작하는 단어의 묵음 "d": djinn, Djikarta
- "kn"으로 시작하는 단어의 묵음 "k": knight, Knuthson
- "gn"으로 시작하는 단어의 묵음 "g": gnarly, gnome, gnat
- "Mac" 대 "Mc"로 시작하는 스코틀랜드 성
- 슬라브어 단어의 "Tch" 소리: Tchaikovsky vs. Chaykovsky
- 스페인어에서 "h"처럼 발음되는 "j" 글자: LaJolla
- "wr" 대 "r"로 시작하는 단어: write vs. rite
- "debt", "tsetse", "Nguyen", "Van Nuyes" 같은 기타 문제 단어
보조 함수 (Auxiliary Functions)
spellfix1 가상 테이블을 구현하는 소스 코드 모듈은 spellfix1을 사용하는 애플리케이션이나 spellfix1을 사용하는 애플리케이션을 개발하는 동안의 테스트 또는 진단 작업에 유용할 수 있는 몇 가지 SQL 함수도 구현해요. 다음 보조 함수를 사용할 수 있어요.
editdist3(P,W) editdist3(P,W,L) editdist3(T)
이 루틴들은 편집 연산에 애플리케이션 정의 가중치를 허용하는 Wagner 편집 거리 함수 버전에 직접 접근을 제공해요. 이 함수의 처음 두 형태는 패턴 P를 단어 W와 비교하고 편집 거리를 반환해요. 첫 번째 함수에서 langid는 0으로 가정되고, 두 번째에서 langid는 L 매개변수로 주어져요. 이 함수의 세 번째 형태는 T가 지정하는 테이블에서 편집 거리 계수를 다시 로드해요.
spellfix1_editdist(P,W)
이 루틴은 기본 고정 비용을 사용하는 내장 Wagner 편집 거리 함수에 접근을 제공해요. 반환되는 값은 W를 P로 변환하는 데 필요한 편집 거리예요.
spellfix1_phonehash(X)
이 루틴은 순수 ascii 입력 단어 X의 음운 해시를 구성하고 그 해시를 반환해요. 이 루틴은 섀도우 테이블의 K1 열을 K2 열로 변환하기 위해 spellfix1이 내부적으로 사용해요.
spellfix1_scriptcode(X)
입력 문자열 X가 주어지면 이 루틴은 그 입력의 지배적인 스크립트를 결정하려고 시도하고 그 스크립트의 ISO-15924 숫자 코드를 반환해요. 현재 구현은 다음 스크립트를 이해해요.
- 215 - Latin
- 220 - Cyrillic
- 200 - Greek
추가 언어 코드는 향후 릴리스에서 추가될 수 있어요.
spellfix1_translit(X)
이 루틴은 유니코드 텍스트를 순수 ascii로 음역하고 입력 텍스트 X의 순수 ascii 표현을 반환해요. 이것은 어휘 단어를 섀도우 테이블의 K1 열로 변환하는 데 내부적으로 사용되는 함수예요.
editdist3 함수 (The editdist3 function)
editdist3 알고리즘은 두 입력 문자열 사이의 최소 편집 거리(일명 Levenshtein 거리)를 계산하는 함수예요. editdist3 알고리즘은 spellfix1의 기본 편집 거리 함수에 대한 구성 가능한 대안이에요. editdist3의 특징은 다음과 같아요.
- 유니코드(UTF8) 텍스트와 함께 동작해요.
- 삽입, 삭제, 대체 비용 테이블을 애플리케이션이 제공할 수 있어요.
- 비용 테이블에 여러 문자 삽입, 삭제, 대체를 열거할 수 있어요.
editdist3 비용 테이블 (The editdist3 COST table)
editdist3의 비용을 프로그래밍하려면 다음과 같은 테이블을 만들어요.
CREATE TABLE editcost(
iLang INT, -- The language ID
cFrom TEXT, -- Convert text from this
cTo TEXT, -- Convert text into this
iCost INT -- The cost of doing the conversion
);
비용 테이블은 원하는 대로 이름을 붙일 수 있어요. "editcost"라고 부를 필요는 없어요. 그리고 테이블은 추가 열을 포함할 수 있어요. 유일한 요구 사항은 테이블이 위에 보여진 4개의 열을 정확히 보여진 이름으로 포함해야 한다는 것이에요.
iLang 열은 특정 언어에 적합한 비용 집합을 식별하는 음이 아닌 정수예요. editdist3 함수는 어떤 주어진 편집 거리 계산에도 단일 iLang 값만 사용해요. 기본값은 0이에요. 단일 언어만 사용하면 되는 애플리케이션은 모든 항목에 대해 항상 iLang==0을 사용하는 것이 권장돼요.
iCost 열은 cFrom을 cTo로 변환하는 숫자 비용이에요. 이 값은 음이 아닌 정수여야 하며 아마 100보다 작아야 해요. 기본 단일 문자 삽입 및 삭제 비용은 100이고 기본 단일 문자에서 단일 문자로의 대체 비용은 150이에요. 10000 이상의 비용은 "무한"으로 간주되어 그 규칙이 무시되게 해요.
cFrom과 cTo 열은 편집 변환 문자열을 보여줘요. 두 열 중 하나 또는 둘 다 하나 이상의 문자를 포함할 수 있어요. 또는 한 열(둘 다는 안 됨)이 빈 문자열을 담을 수 있어요. cFrom이 비어 있으면 그것이 cTo를 삽입하는 비용이에요. cTo가 비어 있으면 그것이 cFrom을 삭제하는 비용이에요.
spellfix1 알고리즘에서 cFrom은 사용자가 입력한 텍스트이고 cTo는 데이터베이스에 존재하는 올바르게 철자된 텍스트예요. editdist3 알고리즘의 목표는 사용자가 입력한 텍스트가 사전 텍스트에 얼마나 가까운지 결정하는 것이에요.
비용 테이블에는 세 가지 특수 사례 항목이 있어요.
| cFrom | cTo | 의미 | | '' | '?' | 기본 삽입 비용 | | '?' | '' | 기본 삭제 비용 | | '?' | '?' | 기본 대체 비용 |
위에 보여진 특수 사례 항목 중 하나라도 생략되면 삽입과 삭제에는 100, 대체에는 150의 값이 사용돼요. 기본 삽입, 삭제, 및/또는 대체를 비활성화하려면 각각의 비용을 10000 이상으로 설정해요.
비용 테이블의 다른 항목은 특정 문자에 대한 특정 변환을 보여줘요. 특정 변환의 비용은 기본 비용보다 작아야 해요. 그렇지 않으면 기본 비용이 우선하고 특정 변환은 결코 사용되지 않을 거예요.
비용 테이블 항목의 몇 가지 예시:
INSERT INTO editcost(iLang, cFrom, cTo, iCost)
VALUES(0, 'a', 'ä', 5);
위 규칙은 사용자 입력의 "a" 글자가 벌점 5로 사전의 "ä" 글자와 일치될 수 있다고 말해요.
INSERT INTO editcost(iLang, cFrom, cTo, iCost)
VALUES(0, 'ss', 'ß', 8);
cFrom과 cTo의 문자 수는 같을 필요가 없어요. 위 규칙은 사용자 입력의 "ss"가 벌점 8로 "ß"와 일치한다고 말해요.
editcost3() 함수로 실험하기 (Experimenting with the editcost3() function)
spellfix1 가상 테이블은 spellfix1 가상 테이블을 만들 때 "edit_cost_table=TABLE" 옵션이 인수로 지정되면 editdist3을 사용해요. 하지만 editdist3은 내장 "editdist3()" SQL 함수를 사용해 직접 테스트할 수도 있어요. editdist3() SQL 함수는 3가지 형태가 있어요.
- editdist3('TABLENAME');
- editdist3('string1', 'string2');
- editdist3('string1', 'string2', langid);
첫 번째 형태는 'TABLENAME'이라는 테이블에서 편집 거리 계수를 로드해요. 이전 계수는 모두 버려져요. 따라서 가중치로 실험하고 가중치 테이블이 바뀌면, 개정된 계수를 다시 로드하기 위해 editdist3()의 단일 인수 형태를 다시 실행하면 돼요. editdist3() SQL 함수가 사용하는 편집 거리 가중치는 spellfix1 가상 테이블이 사용하는 가중치와 독립적이라는 점에 주의하세요.
두 번째와 세 번째 형태는 'string1'와 "string2'" 문자열 사이의 계산된 편집 거리를 반환해요. 두 번째 형태에서는 언어 id 0이 사용돼요. 언어 id는 세 번째 형태에서 지정돼요.