전체 텍스트 검색을 구현하려면 A를 만들 수있는 기능이 있어야합니다tsvector
토토 핫 및 Atsquery
사용자 쿼리에서. 또한 결과를 유용한 순서로 반환해야하므로 토토 핫와 관련된 쿼리와 관련된 기능이 필요합니다. 결과를 멋지게 표시하는 것도 중요합니다.postgresql이러한 모든 기능에 대한 지원을 제공합니다.
postgresql함수 제공to_tsvector
토토 핫를로 변환하려면tsvector
데이터 유형.
to_tsvector ([config
RegConfig
, ]Document
텍스트
) 반환tsvector
to_tsvector
텍스트 토토 핫를 토큰으로 구문 분석하고, 토큰을 렉시 메스로 줄이고, a를 반환합니다TSVECTOR
토토 핫의 위치와 함께 Lexemes를 나열합니다. 토토 핫는 지정된 또는 기본 텍스트 검색 구성에 따라 처리됩니다. 간단한 예는 다음과 같습니다.
select to_tsvector ( '영어', '뚱뚱한 고양이는 매트에 앉았습니다 - 뚱뚱한 쥐를 먹었습니다.); to_tsvector ---------------------------------------------------------------------- 'Ate': 9 'cat': 3 'fat': 2,11 'mat': 7 '쥐': 12 'sat': 4
위의 예에서 우리는 결과tsvector
단어가 포함되어 있지 않습니다a
, on
또는it
, 단어쥐
rat
및 문장 부호 표시-
무시되었습니다.
theto_tsvector
함수는 내부적으로 토토 핫 텍스트를 토큰으로 나누고 각 토큰에 유형을 할당하는 파서를 내부적으로 호출합니다. 각 토큰에 대해 사전 목록 (PostgreSQL : 문서 : 16 : 12.6. 배트맨 토토)는 토큰 유형에 따라 목록이 다를 수있는 곳에서 상담됩니다. 첫 번째 사전인식토큰은 하나 이상의 정규화를 방출합니다lexemes토큰을 나타냅니다. 예를 들어,쥐
rat
사전 중 하나가 단어를 인식했기 때문에쥐
복수 형태의rat
. 일부 단어는로 인식됩니다.단어 중지(섹션 12.6.1)는 검색에 너무 자주 발생하기 때문에 무시됩니다. 이 예에서는 이것들이a
, on
및it
. 목록의 사전이 토큰을 인식하지 않으면 무시됩니다. 구두점 부호에 발생한이 예에서-
실제로 토큰 유형에 할당 된 사전이 없기 때문에 (공간 기호
), 공간 토큰은 결코 색인되지 않습니다. 파서, 사전 및 색인 유형 유형의 선택은 선택한 텍스트 검색 구성 (에 의해 결정됩니다.PostgreSQL : 문서 : 16 : 12.7. 토토 커뮤니티 예). 동일한 데이터베이스에 다양한 구성을 가질 수 있으며 다양한 언어에 대해 사전 정의 된 구성을 사용할 수 있습니다. 이 예에서는 기본 구성을 사용했습니다영어
영어의 경우.
함수setweight
a의 항목에 레이블을 지정하는 데 사용할 수 있습니다.tsvector
웨이트, 무게가 편지 중 하나 인 곳a
, B
, C
또는d
. 이것은 일반적으로 제목 대 신체와 같은 토토 핫의 다른 부분에서 나오는 항목을 표시하는 데 사용됩니다. 나중에이 정보는 검색 결과 순위에 사용될 수 있습니다.
때문에to_tsvector
(NULL
) 복귀null
, 사용하는 것이 좋습니다Coalesce
필드가 널이 될 때마다. 다음은 a를 만드는 권장 방법입니다.tsvector
구조화 된 토토 핫에서 :
업데이트 tt set ti = setweight (to_tsvector (Coalesce (title, '')), 'a') || setweight (to_tsvector (Coalesce (키워드, ''), 'b') || setweight (to_tsvector (Coalesce (Abstract, '')), 'c') || setweight (to_tsvector (Coalesce (body, '')), 'd');
여기서 우리가 사용한setweight
완성 된 각 lexeme의 소스에 레이블을 지정하려면TSVECTOR
TSVECTOR
TSVECTOR
연결 연산자||
. (섹션 12.4.1이 작업에 대한 세부 정보를 제공합니다.)
PostgreSQL함수 제공to_tsquery
, plainto_tsquery
, 16713_16731
andWebSearch_to_tsquery
쿼리를 |tsquery
데이터 유형.TO_TSQUERY
어느 것보다 더 많은 기능에 대한 액세스를 제공합니다Plainto_tsquery
또는Phraseto_tsquery
그러나 입력에 대해 덜 용서합니다.websearch_to_tsquery
단순화 된 버전의to_tsquery
웹 검색 엔진에서 사용하는 것과 유사한 대체 구문이 포함되어 있습니다.
to_tsquery ([config
RegConfig
, ]QueryText
텍스트
) 반환tsquery
to_tsquery
a 생성tsquery
값QueryText
, |tsquery
운영자&
(및),|
(또는),!
(아님) 및<--
(뒤에), 괄호를 사용하여 그룹화 될 수 있습니다. 다시 말해,에 대한 입력to_tsquery
이미 일반 규칙을 따라야합니다tsquery
입력, 설명대로섹션 8.11.2. 차이점은 기본적으로tsquery
입력 토큰을 액면가로 가져옵니다.to_tsquery
지정된 또는 기본 구성을 사용하여 각 토큰을 Lexeme으로 정규화하고 구성에 따라 중지 단어 인 토큰을 버립니다. 예를 들어:
select to_tsquery ( '영어', '& fat & rats'); to_tsquery ----------------- '지방'& '쥐'
BASIC에서와 같이TSQUERY
입력, 무게 (들)를 각 lexeme에 부착하여 일치하도록 제한 할 수 있습니다TSVECTOR
그 체중의 렉시 메스. 예를 들어:
select to_tsquery ( '영어', 'fat | rats : ab'); to_tsquery ----------------- '지방'| '랫트': ab
또한*
접두사 매칭을 지정하기 위해 Lexeme에 부착 할 수 있습니다 :
select to_tsquery ( 'supern :*a & star : a*b'); to_tsquery ----------------------------- 'supern':*a & 'star':*ab
그러한 lexeme은 a의 모든 단어와 일치합니다.tsvector
주어진 문자열로 시작합니다.
to_tsquery
단일 인용구를 허용 할 수도 있습니다. 이것은 구성에 이러한 문구에서 트리거 될 수있는 동의어 사전 사전이 포함 된 경우 주로 유용합니다. 아래의 예에서, 동의어 사전에는 규칙이 포함되어 있습니다Supernovae Stars : SN
:
select to_tsquery ( '' 'Supernovae Stars' '&! crab'); to_tsquery ----------------- 'sn'&! 'crab'
따옴표없이to_tsquery
aN 및 OR 또는 Operator에 의해 분리되지 않은 토큰에 대한 구문 오류가 생성됩니다.
Plainto_tsquery ([config
RegConfig
, ]QueryText
텍스트
) 반환TSQUERY
Plainto_tsquery
형식화되지 않은 텍스트 변환QueryText
atsquery
값. 텍스트는 구문 분석되고 정규화됩니다.to_tsvector
, 그런 다음&
(및)TSQUERY
연산자가 살아남은 단어 사이에 삽입됩니다.
예 :
plainto_tsquery ( '영어', '뚱뚱한 쥐')를 선택하십시오. Plainto_tsquery ------------------ '지방'& '쥐'
참고plainto_tsquery
인식하지 못할 것입니다tsquery
입력의 연산자, 무게 라벨 또는 접두사 매치 레이블 :
Plainto_tsquery ( '영어', '지방 및 쥐 : C'); Plainto_tsquery -------------------- '지방'& '쥐'& 'c'
여기, 모든 입력 구두점이 폐기되었습니다.
Phraseto_tsquery ([config
RegConfig
, ]QueryText
텍스트
) 반환TSQUERY
Phraseto_tsquery
매우 동작Plainto_tsquery
, 삽입을 제외하고<--
(그 뒤에) 연산자는 대신 생존하는 단어 사이의 연산자&
(및) 연산자. 또한 중지 단어는 단순히 버려지는 것이 아니라 삽입하여 설명합니다<
n
<--
운영자. 이 기능은 정확한 Lexeme 시퀀스를 검색 할 때 유용합니다. 연산자가 렉서드 순서를 확인하기 때문에 모든 lexemes의 존재가 아니라 Lexeme 순서를 확인하기 때문입니다.
예 :
Select Phraseto_tsquery ( '영어', '뚱뚱한 쥐'); Phraseto_tsquery ----------------- 'fat'<- '쥐'
좋아요Plainto_tsquery
, ThePhraseto_tsquery
함수는 인식되지 않습니다TSQUERY
입력의 연산자, 무게 라벨 또는 접두사 매치 레이블 :
Select Phraseto_tsquery ( '영어', '지방 및 쥐 : C'); Phraseto_tsquery --------------------------------- 'fat'<- '쥐'<-- 'c'
WebSearch_to_tsquery ([config
RegConfig
, ]QueryText
텍스트
) 반환TSQUERY
WebSearch_to_tsquery
a 생성TSQUERY
값QueryText
간단한 형식화되지 않은 텍스트가 유효한 쿼리 인 대체 구문을 사용합니다. 같지 않은Plainto_tsquery
andPhraseto_tsquery
, 특정 연산자도 인식합니다. 또한이 기능은 구문 오류가 발생하지 않으므로 검색에 원시 사용자가 제공하는 입력을 사용할 수 있습니다. 다음 구문이 지원됩니다.
인용되지 않은 텍스트
: 텍스트 내부에없는 텍스트 인용 표시 마크는 분리 된 용어로 변환됩니다&
연산자, 마치 처리 된 것처럼Plainto_tsquery
.
"인용문"
: 텍스트 내부의 텍스트 내부 인용 표시는 분리 된 용어로 변환됩니다<--
연산자, 마치 처리 된 것처럼Phraseto_tsquery
.
또는
: 단어“또는”||
운영자.
-
: 대시가로 변환됩니다!
운영자.
다른 구두점은 무시됩니다. 그래서 좋아요Plainto_tsquery
및Phraseto_tsquery
, TheWebSearch_to_tsquery
함수는 인식되지 않습니다TSQUERY
입력의 연산자, 웨이트 레이블 또는 접두사 매치 레이블.
예 :
Websearch_to_tsquery ( '영어', '뚱뚱한 쥐'); websearch_to_tsquery ------------------------ '지방'& '쥐' (1 줄) select websearch_to_tsquery ( '영어', ' "Supernovae Stars"-crab'); websearch_to_tsquery ------------------------------------ 'Supernova'<- 'star'&! 'Crab' (1 줄) select websearch_to_tsquery ( '영어', '슬픈 고양이 "또는"Fat Rat "'); websearch_to_tsquery -------------------------------------- 'SAD'<- '고양이'| '지방'<- '쥐' (1 줄) select websearch_to_tsquery ( 'English', 'Signal- "Segmentation Fault"'); websearch_to_tsquery ---------------------------------------------- '신호'&! ( '세그먼트'<- '결함') (1 줄) select websearch_to_tsquery ( '영어', ' "") (더미 \\ query <-'); websearch_to_tsquery ------------------------ 'dummi'& 'queri' (1 행)
순위 순위는 특정 토토 핫가 특정 쿼리와 관련된 방법을 측정하려고 시도하여, 많은 일치가있을 때 가장 관련성이 가장 좋은 내용을 먼저 표시 할 수 있습니다..PostgreSQL어휘, 근접성 및 구조 정보를 고려한 두 가지 사전 정의 된 순위 함수를 제공합니다. 즉, 토토 핫에 쿼리 용어가 얼마나 자주 나타나는지, 토토 핫에 용어가 얼마나 가까이 있는지, 그리고 토토 핫가 발생하는 곳의 일부가 얼마나 중요한지 고려합니다. 그러나 관련성의 개념은 모호하고 응용 분야에 따라 다릅니다. 다른 응용 프로그램에는 순위에 대한 추가 정보 (예 : 토토 핫 수정 시간)가 필요할 수 있습니다. 내장 순위 기능은 예제 일뿐입니다. 자신의 순위 기능을 작성하거나 특정 요구에 맞는 추가 요인과 결과를 결합 할 수 있습니다.
현재 사용 가능한 두 순위 기능은 다음과 같습니다.
TS_RANK ([웨이트
float4 []
,]Vector
TSVECTOR
, 쿼리
tsquery
[, 정규화
Integer
]) 반환float4
일치하는 Lexemes의 빈도에 따라 벡터를 순위에 올랐습니다.
TS_RANK_CD ([웨이트
float4 []
,]Vector
TSVECTOR
, 쿼리
tsquery
[, 정규화
Integer
]) 반환float4
이 함수는를 계산합니다.커버 밀도Clarke, Cormack 및 Tudhope의 "Information Processing and Management", 1999 저널의 "1 ~ 3 개의 용어 쿼리에 대한 관련성 순위"에 설명 된 바와 같이 주어진 토토 핫 벡터 및 쿼리에 대한 순위는와 유사합니다.TS_RANK
lexemes와 일치하는 근접성이 서로 고려된다는 점을 제외하고 순위.
이 기능은 계산을 수행하기 위해 Lexeme 위치 정보가 필요합니다. 그러므로 그것은 어떤 것을 무시합니다“스트리핑”lexemes in theTSVECTOR
. 입력에 쇄골이없는 Lexemes가 없으면 결과는 0이됩니다. (보다섹션 12.4.1에 대한 자세한 내용은Strip
함수 및 위치 정보TSVECTOR
s.)
이 기능 모두 선택 사항웨이트
인수는 레이블이 지정되는 방식에 따라 단어 인스턴스를 다소 크게 측정 할 수있는 능력을 제공합니다. 웨이트 어레이는 순서대로 각 단어 범주의 무게를 크게 측정하는 방법을 지정합니다.
D- 웨이트, C- 가이트, B- 가이트, A- 가이트
if no웨이트
제공되면 이러한 기본값이 사용됩니다.
0.1, 0.2, 0.4, 1.0
일반적으로 가중치는 제목이나 초기 초록과 같은 토토 핫의 특수 영역에서 단어를 표시하는 데 사용되므로 토토 핫 본문의 단어보다 다소 중요하게 취급 될 수 있습니다.
더 긴 토토 핫는 쿼리 용어를 포함 할 가능성이 높기 때문에 토토 핫 크기를 고려하는 것이 합리적입니다. 예를 들어 검색어의 5 가지 인스턴스가있는 백 단어 토토 핫는 5 개의 인스턴스가있는 천 단어 토토 핫보다 더 관련이있을 것입니다. 두 순위 기능 모두 정수를 취합니다정규화
토토 핫의 길이가 순위에 미치는 영향을 지정하는 옵션. 정수 옵션은 몇 가지 동작을 제어하므로 약간의 마스크입니다.를 사용하여 하나 이상의 동작을 지정할 수 있습니다|
(예 :2|4
).
0 (기본값)은 토토 핫 길이를 무시합니다
1은 순위를 1 + 토토 핫 길이의 로그로 나눕니다
2 토토 핫 길이로 순위를 나눕니다
4 순위를 범위 사이의 평균 고조파 거리로 나눕니다 (이것은에 의해서만 구현됩니다TS_RANK_CD
)
8 토토 핫의 고유 한 단어 수로 순위를 나눕니다
16은 순위를 1 + 토토 핫의 고유 단어 수의 로그를 1 +로 나눕니다
32 순위를 자체적으로 나눕니다 + 1
두 개 이상의 플래그 비트가 지정되면 나열된 순서에 변환이 적용됩니다.
순위 함수는 글로벌 정보를 사용하지 않으므로 때때로 원하는대로 1% 또는 100%로 공정한 정규화를 생성하는 것은 불가능합니다. 정규화 옵션 32 (RANK/(RANK+1)
)는 모든 순위를 범위 0에서 1로 확장하기 위해 적용될 수 있지만 물론 이것은 단지 미용적 변화 일뿐입니다. 검색 결과의 순서에는 영향을 미치지 않습니다.
여기 10 개의 가장 높은 순위 일치 만 선택하는 예는 다음과 같습니다.
제목을 선택하여 TS_RANK_CD (TEXTSEARCH, QUERY)를 순위로 선택합니다 Apod에서 To_tsquery ( 'Neutrino | (Dark & Matter)') 쿼리 query @@ textsearch RANK DESC의 주문 제한 10; 제목 | 계급 ------------------------------------------------------------------- 태양의 중성미자 | 3.1 Sudbury Neutrino Detector | 2.4 은하의 암흑 물질의 사나이보기 | 2.01317 뜨거운 가스와 암흑 물질 | 1.91171 처녀 자리 클러스터 : 뜨거운 혈장과 암흑 물질 | 1.90953 태양 중성미자 래프팅 | 1.9 NGC 4650A : 이상한 은하와 암흑 물질 | 1.85774 뜨거운 가스와 암흑 물질 | 1.6123 우주 중성미자를위한 얼음 낚시 | 1.6 약한 렌즈는 우주를 왜곡합니다 | 0.818218
이것은 정규화 된 순위를 사용하는 것과 동일한 예입니다 :
제목 선택, TS_RANK_CD (TEXTSEARCH, QUERY, 32/ * RANK/(RANK+1) */) Apod에서 To_tsquery ( 'Neutrino | (Dark & Matter)') 쿼리 query @@ textsearch RANK DESC의 주문 제한 10; 제목 | 계급 ----------------------------------------------------------------------------- 태양의 중성미자 | 0.756097569485493 Sudbury Neutrino Detector | 0.705882361190954 은하의 암흑 물질의 사나이보기 | 0.668123210574724 뜨거운 가스와 암흑 물질 | 0.65655958650282 처녀 자리 클러스터 : 뜨거운 혈장과 암흑 물질 | 0.656301290640973 태양 중성미자 래프팅 | 0.65172410958162 NGC 4650A : 이상한 은하와 암흑 물질 | 0.650072921219637 뜨거운 가스와 암흑 물질 | 0.617195790024749 우주 중성미자를위한 얼음 낚시 | 0.615384618911517 약한 렌즈는 우주를 왜곡합니다 | 0.450010798361481
순위는 컨설팅이 필요하기 때문에 비용이 많이들 수 있습니다TSVECTOR
각각의 일치하는 토토 핫의 I/O 바운드 및 속도가 느릴 수 있습니다. 불행히도, 실제 쿼리는 종종 많은 일치를 초래하기 때문에 피하는 것은 거의 불가능합니다.
검색 결과를 제시하려면 각 토토 핫의 일부를 표시하는 것이 이상적이며 쿼리와 관련된 방법. 일반적으로 검색 엔진은 검색어가 표시된 토토 핫 조각을 표시합니다.PostgreSQL함수 제공TS_HEADLINE
이 기능을 구현합니다.
ts_headline ([config
RegConfig
, ]토토 핫
텍스트
,쿼리
tsquery
[,옵션
텍스트
]) 반환텍스트
TS_HEADLINE
쿼리와 함께 토토 핫를 수락하고 쿼리의 용어가 강조 표시되는 토토 핫에서 발췌문을 반환합니다. 구체적으로, 함수는 쿼리를 사용하여 관련 텍스트 조각을 선택한 다음 해당 단어 위치가 쿼리의 제한과 일치하지 않더라도 쿼리에 나타나는 모든 단어를 강조합니다. 토토 핫를 구문 분석하는 데 사용되는 구성은에 의해 지정할 수 있습니다.config
; 만약에config
생략,default_text_search_config
구성이 사용됩니다.
IF an옵션
Stri토토 핫이 지정되어 있습니다. 하나 이상의 쉼표로 구분 된 목록으로 구성되어야합니다옵션
=
value
쌍. 사용 가능한 옵션은 다음과 같습니다.
maxwords
, minwords
(정수) :이 숫자는 출력에 가장 길고 짧은 헤드 라인을 결정합니다. 기본값은 35와 15입니다.
Shortword
(정수) :이 길이 이하의 단어는 쿼리 용어가 아닌 한 헤드 라인의 시작과 끝에서 삭제됩니다. 3의 기본값은 일반적인 영어 기사를 제거합니다.
하이라이트
(부울) : iftrue
전체 토토 핫는 앞의 세 매개 변수를 무시하고 헤드 라인으로 사용됩니다. 기본값은거짓
.
maxfragments
(정수) : 표시 할 최대 텍스트 조각 수. 0의 기본값은 비 배제 기반 헤드 라인 생성 방법을 선택합니다. 0보다 큰 값은 조각 기반 헤드 라인 생성을 선택합니다 (아래 참조).
Startsel
, Stopsel
(문자열) : 토토 핫에 표시되는 쿼리 단어를 구분하는 문자열은 다른 발췌 단어와 구별됩니다. 기본값은입니다.“<b
”and“</b
”, HTML 출력에 적합 할 수 있습니다 (그러나 아래 경고 참조).
FragmentDelimiter
(문자열) : 둘 이상의 조각이 표시되면 조각 이이 문자열로 분리됩니다. 기본값은“...
”.
출력TS_HEADLINE
웹 페이지에 직접 포함하기에 안전하지는 않습니다. 언제하이라이트
is거짓
(기본값), 일부 간단한 XML 태그가 토토 핫에서 제거되지만 모든 HTML 마크 업을 제거하는 것이 보장되지는 않습니다. 따라서 이것은 신뢰할 수없는 입력으로 작업 할 때 크로스 사이트 스크립팅 (XSS) 공격과 같은 공격에 대한 효과적인 방어를 제공하지 않습니다. 이러한 공격을 방지하려면 모든 HTML 마크 업을 입력 토토 핫에서 제거하거나 출력에 HTML 소독제를 사용해야합니다..
이 옵션 이름은 사례에서 인식됩니다. 공백이나 쉼표가 포함 된 경우 문자열 값을 두 배로 인용해야합니다.
비 배수 기반 헤드 라인 생성에서TS_HEADLINE
주어진 일치를 찾습니다쿼리
허용 헤드 라인 길이 내에 더 많은 쿼리 단어가있는 일치를 선호하는 단일 하나를 선택합니다. 조각 기반 헤드 라인 생성에서ts_headline
쿼리 일치를 찾아 각 일치를 분할“파편”Maxwords
각각의 단어, 더 많은 쿼리 단어가있는 조각을 선호하고 가능하면“스트레칭”주변 단어를 포함하는 조각. 따라서 쿼리 일치가 토토 핫의 큰 섹션에 걸쳐 있거나 여러 일치를 표시하는 것이 바람직한 경우 조각 기반 모드는 더 유용합니다. 어느 모드에서든 쿼리 일치를 식별 할 수 없으면 첫 번째 단편의 단일 조각minwords
토토 핫의 단어가 표시됩니다.
예 :
ts_headline ( '영어', '가장 일반적인 유형의 검색 주어진 쿼리 용어가 포함 된 모든 토토 핫를 찾는 것입니다 그리고 그들과 유사하게 반환하십시오. 질문.', to_tsquery ( '영어', '쿼리 및 유사성'); ts_headline ------------------------------------------------------------------- 주어진 <b 쿼리 </b 용어 +를 포함합니다 <b 유사성 </b의 순서대로+를 반환합니다. <b 쿼리 </b. 선택 ts_headline ( '영어', '검색어가 발생할 수 있습니다 토토 핫에서 여러 번 검색 순위가 필요한지 결정하려면 일치해야합니다 결과에 표시 할 발생. ', to_tsquery ( '영어', '검색 및 용어'), 'maxfragments = 10, maxwords = 7, minwords = 3, startsel = <<, stopsel = '); ts_headline ------------------------------------------------------------------- << 검색 << 이용 약관 +가 발생할 수 있습니다 여러 번 ... << search 결정에 맞는 순위
TS_HEADLINE
a가 아닌 원본 토토 핫를 사용합니다TSVECTOR
요약, 따라서 느리게 할 수 있고주의해서 사용해야합니다.
토토 핫에 올바른 것이 없다면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식토토 핫 문제를보고하려면