전체 텍스트 검색을 구현하려면 다음을 생성하는 기능이 있어야 합니다.ts벡터윈 토토 및 a에서tsquery사용자 쿼리에서. 또한 유용한 순서로 결과를 반환해야 하므로 쿼리와의 관련성을 기준으로 윈 토토를 비교하는 기능이 필요합니다. 결과를 멋지게 표시할 수 있는 것도 중요합니다.PostgreSQL이 모든 기능을 지원합니다.
PostgreSQL기능 제공to_ts벡터윈 토토를 다음으로 변환하기 위해ts벡터데이터 유형.
to_ts벡터([구성regconfig, ]윈 토토텍스트) 반환ts벡터
to_tsVector텍스트 윈 토토를 토큰으로 구문 분석하고 토큰을 어휘소로 줄이고 다음을 반환합니다.ts벡터윈 토토에서의 위치와 함께 어휘를 나열합니다. 윈 토토는 지정된 또는 기본 텍스트 검색 구성에 따라 처리됩니다. 다음은 간단한 예입니다.
SELECT to_tsVector('english', '뚱뚱한 고양이가 매트 위에 앉았습니다. 살찐 쥐를 잡아먹었습니다.');
to_ts벡터
----------------------------------------
'ate':9 'cat':3 'fat':2,11 'mat':7 'rat':12 'sat':4
위의 예에서 우리는 결과를 볼 수 있습니다ts벡터단어를 포함하지 않습니다.a, 켜짐또는그것, 단어쥐되었다쥐및 구두점-무시되었습니다.
그to_tsVector함수는 윈 토토 텍스트를 토큰으로 나누고 각 토큰에 유형을 할당하는 파서를 내부적으로 호출합니다. 각 토큰에 대해 사전 목록(PostgreSQL : 문서 : 17 : 12.6. 토토 캔)이 참조되며, 여기서 목록은 토큰 유형에 따라 달라질 수 있습니다. 최초의 사전인식토큰은 정규화된 하나 이상을 방출합니다.어휘토큰을 나타냅니다. 예를 들어,쥐되었다쥐사전 중 하나가 다음 단어를 인식했기 때문입니다.쥐은(는)의 복수형입니다.쥐. 일부 단어는 다음과 같이 인식됩니다.단어 중지 (섹션 12.6.1), 검색에 유용하기에는 너무 자주 발생하므로 무시됩니다. 우리의 예에서는 다음과 같습니다.a, 켜짐및그것. 목록에 토큰을 인식하는 사전이 없으면 토큰도 무시됩니다. 이 예에서는 구두점 기호에 발생했습니다.-사실 토큰 유형에 할당된 사전이 없기 때문입니다(공간 기호), 이는 공간 토큰이 색인화되지 않음을 의미합니다. 파서, 사전의 선택 및 색인화할 토큰 유형은 선택한 텍스트 검색 구성에 따라 결정됩니다(PostgreSQL : 문서 : 17 : 12.7. 배트맨 토토 예). 동일한 데이터베이스에 다양한 구성을 가질 수 있으며 사전 정의된 구성을 다양한 언어로 사용할 수 있습니다. 이 예에서는 기본 구성을 사용했습니다.영어영어의 경우.
함수설정중량a의 항목에 라벨을 지정하는 데 사용할 수 있습니다.ts벡터주어진 내용으로무게, 여기서 가중치는 문자 중 하나입니다.A, B, C또는D. 이는 일반적으로 제목이나 본문 등 윈 토토의 여러 부분에서 나오는 항목을 표시하는 데 사용됩니다. 나중에 이 정보는 검색 결과 순위에 사용될 수 있습니다.
왜냐하면to_tsVector(NULL)이 반환됩니다.NULL사용을 권장합니다합체필드가 null일 수 있는 경우. 다음은를 만드는 데 권장되는 방법입니다.ts벡터구조화된 윈 토토에서:
업데이트 tt SET ti =
setweight(to_tsVector(coalesce(title,'')), 'A') ||
setweight(to_tsVector(coalesce(keyword,'')), 'B') ||
setweight(to_tsVector(coalesce(abstract,'')), 'C') ||
setweight(to_tsVector(coalesce(body,'')), 'D');
여기서 우리는 사용했습니다설정중량완성된 각 어휘의 출처 라벨 지정ts벡터, 그런 다음 라벨이 붙은를 병합했습니다.ts벡터값을 사용하는 값ts벡터연결 연산자||. (섹션 12.4.1이 작업에 대한 세부정보를 제공합니다.)
PostgreSQL기능을 제공합니다to_tsquery, plainto_tsquery, phraseto_tsquery그리고websearch_to_tsquery쿼리를 다음으로 변환하기 위해tsquery데이터 유형.to_tsquery둘 중 하나보다 더 많은 기능에 대한 액세스를 제공plainto_tsquery또는phraseto_tsquery, 하지만 입력에 대해서는 덜 관대합니다.websearch_to_tsquery는의 단순화된 버전입니다.to_tsquery웹 검색 엔진에서 사용하는 것과 유사한 대체 구문을 사용합니다.
to_tsquery([구성regconfig, ]쿼리텍스트텍스트) 반환tsquery
to_tsquery생성tsquery값:쿼리텍스트, 이는로 구분된 단일 토큰으로 구성되어야 합니다.tsquery연산자&(그리고),|(또는),!(아님) 그리고<-(FOLLOWED BY), 아마도 괄호를 사용하여 그룹화되었을 수 있습니다. 즉,에 대한 입력은to_tsquery이미 다음에 대한 일반 규칙을 따라야 합니다.tsquery설명된 대로 입력섹션 8.11.2. 차이점은 기본이지만tsquery입력은 토큰을 액면 그대로 받아들입니다.to_tsquery지정된 구성이나 기본 구성을 사용하여 각 토큰을 어휘소로 정규화하고 구성에 따라 불용어인 모든 토큰을 삭제합니다. 예를 들면:
SELECT to_tsquery('english', 'The & Fat & Rats');
to_tsquery
---------------
'뚱뚱하다' & '쥐'
기본과 동일tsquery입력, 가중치를 각 어휘소에 첨부하여 일치만 제한할 수 있습니다.ts벡터해당 가중치의 어휘소입니다. 예를 들면:
SELECT to_tsquery('english', '뚱뚱한 | 쥐:AB');
to_tsquery
------------------
'지방' | '쥐':AB
또한,*접두어 일치를 지정하기 위해 어휘소에 첨부할 수 있습니다.
SELECT to_tsquery('supern:*A & star:A*B');
to_tsquery
-------------
'supern':*A & 'star':*AB
이러한 어휘는 a의 모든 단어와 일치합니다.ts벡터주어진 문자열로 시작합니다.
to_tsquery또한 작은따옴표 구문을 사용할 수 있습니다. 이는 구성에 해당 문구에 대해 트리거될 수 있는 동의어 사전이 포함된 경우 주로 유용합니다. 아래 예에서 동의어 사전에는 규칙이 포함되어 있습니다.초신성 별: sn:
SELECT to_tsquery('''초신성별'' & !게');
to_tsquery
---------------
'sn' & !'게'
따옴표 없이,to_tsqueryAND, OR 또는 FOLLOWED BY 연산자로 구분되지 않은 토큰에 대해 구문 오류를 생성합니다.
plainto_tsquery([구성regconfig, ]쿼리텍스트텍스트) 반환tsquery
plainto_tsquery서식화되지 않은 텍스트를 변환합니다쿼리텍스트에tsquery값. 텍스트는 다음과 같이 구문 분석되고 정규화됩니다.to_ts벡터, 그러면&(그리고)tsquery연산자는 살아남은 단어 사이에 삽입됩니다.
예:
SELECT plainto_tsquery('english', 'The Fat Rats');
plainto_tsquery
-----------------
'뚱뚱하다' & '쥐'
참고하세요plainto_tsquery인식하지 못함tsquery입력의 연산자, 중량 라벨 또는 접두어 일치 라벨:
SELECT plainto_tsquery('english', 'The Fat & Rats:C');
plainto_tsquery
--------
'지방' & '쥐' & 'c'
여기서 입력된 구두점은 모두 폐기되었습니다.
phraseto_tsquery([구성regconfig, ]쿼리텍스트텍스트) 반환tsquery
phraseto_tsquery다음과 같이 행동합니다plainto_tsquery, 단,<-(FOLLOWED BY) 연산자 대신 살아남은 단어 사이에&(AND) 연산자입니다. 또한 불용어는 단순히 버리는 것이 아니라 삽입하여 처리한다<연산자보다는N<-연산자. FOLLOWED BY 연산자는 모든 어휘의 존재뿐만 아니라 어휘 순서도 확인하므로 이 함수는 정확한 어휘 순서를 검색할 때 유용합니다.
예:
SELECTphraseto_tsquery('english', 'The Fat Rats');
Phraseto_tsquery
------------------
'뚱뚱하다' <- '쥐'
좋아요plainto_tsquery, 그phraseto_tsquery함수는 인식하지 못합니다tsquery입력의 연산자, 중량 라벨 또는 접두사 일치 라벨:
SELECT Phraseto_tsquery('english', 'The Fat & Rats:C');
Phraseto_tsquery
----------------
'뚱뚱하다' <- '쥐' <- 'c'
websearch_to_tsquery([구성regconfig, ]쿼리텍스트텍스트) 반환tsquery
websearch_to_tsquery생성tsquery값:쿼리텍스트형식이 지정되지 않은 간단한 텍스트가 유효한 쿼리인 대체 구문을 사용합니다. 달리plainto_tsquery그리고phraseto_tsquery, 특정 연산자도 인식합니다. 또한 이 함수는 구문 오류를 발생시키지 않으므로 검색에 원시 사용자 제공 입력을 사용할 수 있습니다. 다음 구문이 지원됩니다:
인용되지 않은 텍스트: 따옴표 안에 없는 텍스트는 다음으로 구분된 용어로 변환됩니다.&연산자, 마치 처리된 것처럼plainto_tsquery.
"인용된 텍스트": 따옴표 안의 텍스트는 다음으로 구분된 용어로 변환됩니다.<-연산자, 마치 처리된 것처럼phraseto_tsquery.
또는: 단어“또는”다음으로 변환됩니다|연산자.
-: 대시는로 변환됩니다.!연산자.
다른 구두점은 무시됩니다. 그러니까plainto_tsquery그리고phraseto_tsquery, 그websearch_to_tsquery함수는 인식하지 못합니다tsquery입력의 연산자, 중량 라벨 또는 접두어 일치 라벨.
예:
SELECT websearch_to_tsquery('english', '살찐 쥐');
websearch_to_tsquery
---------
'뚱뚱하다'와 '쥐'
(1줄)
SELECT websearch_to_tsquery('english', '"초신성 별" -crab');
websearch_to_tsquery
----------------------------------
'초신성' <- '별' & !'게'
(1줄)
SELECT websearch_to_tsquery('english', '"슬픈 고양이" 또는 "뚱뚱한 쥐"');
websearch_to_tsquery
----------------------
'슬픈' <- '고양이' | '뚱뚱하다' <- '쥐'
(1줄)
SELECT websearch_to_tsquery('english', 'signal -"세그먼트 오류"');
websearch_to_tsquery
--------------------------
'신호' & !( '세그먼트' <- '오류' )
(1줄)
SELECT websearch_to_tsquery('english', '""" )( 더미 \\ 쿼리 <-');
websearch_to_tsquery
---------
'두미' & '퀘리'
(1행)
순위는 윈 토토가 특정 검색어와 얼마나 관련성이 있는지 측정하려고 시도하므로 일치하는 항목이 많을 때 가장 관련성이 높은 항목이 먼저 표시될 수 있습니다.포스트그레SQL어휘, 근접성 및 구조적 정보를 고려하는 사전 정의된 두 가지 순위 함수를 제공합니다. 즉, 쿼리 용어가 윈 토토에 얼마나 자주 나타나는지, 용어가 윈 토토에서 얼마나 가까이 있는지, 윈 토토에서 쿼리 용어가 나타나는 부분이 얼마나 중요한지를 고려합니다. 그러나 관련성의 개념은 모호하고 매우 애플리케이션별로 다릅니다. 다양한 애플리케이션에는 순위 지정을 위한 추가 정보(예: 윈 토토 수정 시간)가 필요할 수 있습니다. 내장된 순위 기능은 단지 예시일 뿐입니다. 자신만의 순위 함수를 작성하거나 해당 결과를 특정 요구 사항에 맞게 추가 요소와 결합할 수 있습니다.
현재 사용 가능한 두 가지 순위 기능은 다음과 같습니다:
ts_rank([가중치 float4[], ] 벡터 ts벡터, 질의 tsquery [, 정규화 정수]) 반환플로트4일치하는 어휘의 빈도에 따라 벡터의 순위를 매깁니다.
ts_rank_cd([가중치 float4[], ] 벡터 ts벡터, 질의 tsquery [, 정규화 정수]) 반환float4이 함수는 다음을 계산합니다.피복 밀도주어진 윈 토토 벡터 및 쿼리에 대한 순위. Clarke, Cormack 및 Tudhope의 "Information Process and Management" 저널(1999)에 있는 "Relevance Ranking for One to Three Term Queries"에 설명되어 있습니다. 표지 밀도는 다음과 유사합니다.ts_rank어휘의 서로 일치하는 근접성을 고려한다는 점을 제외하고 순위를 매깁니다.
이 함수는 계산을 수행하기 위해 어휘 위치 정보가 필요합니다. 따라서 모든 것을 무시합니다.“벗겨짐”어휘ts벡터. 입력에 제거되지 않은 어휘소가 없으면 결과는 0이 됩니다. (참조섹션 12.4.1에 대한 추가 정보는스트립함수 및 위치 정보ts벡터s.)
이 두 기능 모두에 대해 선택사항가중치인수는 레이블이 지정되는 방식에 따라 단어 인스턴스의 가중치를 다소 높게 지정하는 기능을 제공합니다. 가중치 배열은 각 단어 범주의 가중치를 다음 순서대로 지정합니다.
D-가중치, C-가중치, B-가중치, A-가중치
아니면가중치제공되면 다음 기본값이 사용됩니다.
{0.1, 0.2, 0.4, 1.0}
일반적으로 가중치는 제목이나 초기 초록과 같은 윈 토토의 특정 영역에 있는 단어를 표시하는 데 사용되므로 이러한 단어는 윈 토토 본문의 단어보다 다소 중요하게 처리될 수 있습니다.
더 긴 윈 토토는 검색어를 포함할 가능성이 높기 때문에 윈 토토 크기를 고려하는 것이 합리적입니다. 예를 들어, 검색 단어의 5개 인스턴스가 있는 100단어 윈 토토는 5개 인스턴스가 있는 1000단어 윈 토토보다 관련성이 더 높습니다. 두 순위 함수 모두 정수를 사용합니다.정규화31229_31426|(예를 들어,2|4).
0(기본값)은 윈 토토 길이를 무시합니다.
1 순위를 1 + 윈 토토 길이의 로그로 나눕니다.
2 순위를 윈 토토 길이로 나눕니다.
4 순위를 범위 사이의 평균 고조파 거리로 나눕니다(이는 다음으로만 구현됩니다.ts_rank_cd)
8 순위를 윈 토토의 고유 단어 수로 나눕니다.
16은 순위를 1 + 윈 토토의 고유 단어 수의 로그로 나눕니다.
32는 순위 자체를 + 1로 나눕니다.
두 개 이상의 플래그 비트가 지정되면 변환은 나열된 순서대로 적용됩니다.
순위 함수는 글로벌 정보를 사용하지 않으므로 때때로 원하는 대로 1% 또는 100%로 공정한 정규화를 생성하는 것이 불가능하다는 점에 유의하는 것이 중요합니다. 정규화 옵션 32 (순위/(순위+1))을 적용하여 모든 순위를 0에서 1 사이의 범위로 조정할 수 있지만 물론 이는 단지 외관상 변경일 뿐입니다. 검색 결과의 순서에는 영향을 미치지 않습니다.
다음은 가장 높은 순위의 일치 항목 10개만 선택하는 예입니다:
제목 선택, ts_rank_cd(텍스트 검색, 쿼리) AS 순위
FROM apod, to_tsquery('neutrino|(dark & Matter)') 쿼리
WHERE 쿼리 @@ 텍스트 검색
순위 DESC로 주문
제한 10;
제목 | 순위
-------------------+----------
태양 속의 중성미자 | 3.1
Sudbury 중성미자 검출기 | 2.4
은하계 암흑물질에 대한 마초적인 견해 | 2.01317
뜨거운 가스와 암흑물질 | 1.91171
처녀자리 클러스터: 고온 플라즈마 및 암흑 물질 | 1.90953
태양 중성미자 래프팅 | 1.9
NGC 4650A: 이상한 은하와 암흑 물질 | 1.85774
뜨거운 가스와 암흑물질 | 1.6123
우주 중성미자 얼음낚시 | 1.6
약한 렌즈 효과는 우주를 왜곡합니다 | 0.818218
이것은 정규화된 순위를 사용한 동일한 예입니다:
SELECT 제목, ts_rank_cd(textsearch, query, 32 /* 순위/(순위+1) */ ) AS 순위
FROM apod, to_tsquery('neutrino|(dark & Matter)') 쿼리
WHERE 쿼리 @@ 텍스트 검색
순위 DESC로 주문
제한 10;
제목 | 순위
---------------------+-------------------
태양 속의 중성미자 | 0.756097569485493
Sudbury 중성미자 검출기 | 0.705882361190954
은하계 암흑물질에 대한 마초적인 관점 | 0.668123210574724
뜨거운 가스와 암흑물질 | 0.65655958650282
처녀자리 클러스터: 고온 플라즈마 및 암흑 물질 | 0.656301290640973
태양 중성미자 래프팅 | 0.655172410958162
NGC 4650A: 이상한 은하와 암흑 물질 | 0.650072921219637
뜨거운 가스와 암흑물질 | 0.617195790024749
우주 중성미자 얼음낚시 | 0.615384618911517
약한 렌즈 효과는 우주를 왜곡합니다 | 0.450010798361481
순위는 컨설팅이 필요하기 때문에 비용이 많이 들 수 있습니다.ts벡터각 일치 윈 토토의 I/O 바인딩으로 인해 속도가 느려질 수 있습니다. 안타깝게도 실제 쿼리로 인해 많은 수의 일치 항목이 나오는 경우가 많기 때문에 이를 피하는 것은 거의 불가능합니다.
검색 결과를 표시하려면 각 윈 토토의 일부와 그것이 쿼리와 어떻게 관련되어 있는지 표시하는 것이 이상적입니다. 일반적으로 검색 엔진은 표시된 검색어와 함께 윈 토토의 일부를 표시합니다.포스트그레SQL기능 제공ts_headline이 기능을 구현하는 것입니다.
ts_headline([구성regconfig, ]윈 토토텍스트,질의tsquery[,옵션텍스트]) 반환텍스트
ts_headline쿼리와 함께 윈 토토를 수락하고 쿼리의 용어가 강조 표시된 윈 토토에서 발췌한 내용을 반환합니다. 특히 이 함수는 쿼리를 사용하여 관련 텍스트 조각을 선택한 다음 해당 단어 위치가 쿼리 제한 사항과 일치하지 않더라도 쿼리에 나타나는 모든 단어를 강조 표시합니다. 윈 토토를 구문 분석하는 데 사용되는 구성은 다음으로 지정할 수 있습니다.구성; 만일구성생략되었습니다.default_text_search_config구성이 사용되었습니다.
만일옵션문자열이 지정되었습니다. 하나 이상의 쉼표로 구분된 목록으로 구성되어야 합니다.옵션=값쌍. 사용 가능한 옵션은 다음과 같습니다.
MaxWords, 최소단어(정수): 이 숫자는 출력할 가장 긴 헤드라인과 가장 짧은 헤드라인을 결정합니다. 기본값은 35와 15입니다.
단어(정수): 이 길이 이하의 단어는 검색어가 아닌 한 헤드라인의 시작과 끝에서 삭제됩니다. 기본값 3은 일반적인 영어 관사를 제거합니다.
하이라이트모두(부울): if참앞의 세 매개변수를 무시하고 전체 윈 토토가 헤드라인으로 사용됩니다. 기본값은거짓.
MaxFragments(정수): 표시할 최대 텍스트 조각 수. 기본값 0은 비조각 기반 헤드라인 생성 방법을 선택합니다. 0보다 큰 값은 조각 기반 헤드라인 생성을 선택합니다(아래 참조).
StartSel, StopSel(문자열): 윈 토토에 나타나는 쿼리 단어를 구분하여 다른 발췌 단어와 구별하는 문자열입니다. 기본값은 다음과 같습니다.“<b”그리고“</b”, HTML 출력에 적합할 수 있습니다(그러나 아래 경고 참조).
FragmentDelimiter(문자열): 둘 이상의 조각이 표시되면 조각은 이 문자열로 구분됩니다. 기본값은“ ... ”.
다음의 출력ts_headline웹페이지에 직접 포함해도 안전하다고 보장되지 않습니다. 언제하이라이트올is거짓(기본값), 일부 간단한 XML 태그가 윈 토토에서 제거되지만 모든 HTML 마크업이 제거된다는 보장은 없습니다. 따라서 이는 신뢰할 수 없는 입력으로 작업할 때 XSS(교차 사이트 스크립팅) 공격과 같은 공격에 대한 효과적인 방어를 제공하지 않습니다. 이러한 공격을 방지하려면 입력 윈 토토에서 모든 HTML 마크업을 제거하거나 출력에서 HTML 새니타이저를 사용해야 합니다.
이 옵션 이름은 대소문자를 구분하지 않고 인식됩니다. 공백이나 쉼표가 포함된 문자열 값은 큰따옴표로 묶어야 합니다.
비조각 기반 헤드라인 생성에서,ts_headline주어진 항목과 일치하는 항목을 찾습니다질의그리고 표시할 단일 항목을 선택하여 허용된 헤드라인 길이 내에 더 많은 검색어가 있는 일치 항목을 선호합니다. 조각 기반 헤드라인 생성에서,ts_headline쿼리 일치 항목을 찾아 각 일치 항목을 다음으로 분할합니다.“조각”최대MaxWords단어 각각, 더 많은 검색어가 있는 조각을 선호하며 가능하다면“스트레칭”주변 단어를 포함하는 조각입니다. 따라서 조각 기반 모드는 쿼리 일치 항목이 윈 토토의 큰 섹션에 걸쳐 있거나 여러 일치 항목을 표시해야 하는 경우에 더 유용합니다. 두 모드 모두에서 일치하는 쿼리가 식별되지 않으면 첫 번째의 단일 조각이 생성됩니다.최소 단어윈 토토의 단어가 표시됩니다.
예:
SELECT ts_headline('영어',
'가장 일반적인 검색 유형
주어진 검색어가 포함된 모든 윈 토토를 찾는 것입니다.
그리고 유사한 순서대로 반환합니다.
쿼리.',
to_tsquery('english', '쿼리 및 유사성'));
ts_headline
----------------------------------
특정 <b검색어</b 용어 포함 +
+와 <b유사성</b 순서대로 반환합니다.
<b쿼리</b.
SELECT ts_headline('한국어',
'검색어가 나올 수 있습니다.
윈 토토에서 여러 번
어떤 항목을 결정하기 위해 검색 일치 항목의 순위를 요구합니다.
결과에 표시할 항목입니다.',
to_tsquery('english', '검색 및 용어'),
'MaxFragments=10, MaxWords=7, MinWords=3, StartSel=<<, StopSel=');
ts_headline
----------------------------------
<<검색 <<용어가 발생할 수 있음 +
여러 번 ... <<검색 경기 순위를 결정합니다.
ts_headline다음이 아닌 원본 윈 토토를 사용합니다ts벡터요약이므로 속도가 느릴 수 있으므로 주의해서 사용해야 합니다.
윈 토토에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식윈 토토 문제를 보고합니다.