젠 토토 : 문서 : 9.6 : 젠 토토 9.6 | |||
---|---|---|---|
PostgreSQL : 문서 : 9.6 : 테이블 및 범퍼카 토토 | 사설 토토 사이트 : 문서 : 9.6 : 전문 검색 | 12 장. 전문 검색 | 롤 토토 : 문서 : 9.6 : 추가 롤 토토 |
전체 텍스트 검색을 구현하려면 A를 만들 수있는 기능이 있어야합니다TSVECTOR토토 꽁 머니 및 Atsquery사용자 쿼리에서. 또한 결과를 유용한 순서로 반환해야하므로 토토 꽁 머니와 관련된 쿼리와 관련된 기능이 필요합니다. 결과를 멋지게 표시하는 것도 중요합니다.postgresql이러한 모든 기능에 대한 지원을 제공합니다.
PostgreSQL함수 제공to_tsvector
토토 꽁 머니를로 변환하려면tsvector데이터 유형.
to_tsvector ([ config RegConfig, ]토토 꽁 머니 텍스트) 반환tsvector
to_tsvector
텍스트 토토 꽁 머니를 토큰으로 구문 분석하고, 토큰을 Lexemes로 줄이고, 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및 문장 부호-무시되었습니다.
to_tsvector
함수는 내부적으로 토토 꽁 머니 텍스트를 토큰으로 나누고 각 토큰에 유형을 할당하는 파서를 내부적으로 호출합니다. 각 토큰에 대해 사전 목록 (PostgreSQL : 문서 : 9.6 : 토토)는 토큰 유형에 따라 목록이 다를 수있는 곳에서 상담됩니다. 첫 번째 사전인식토큰은 하나 이상의 정규화 된를 방출합니다.lexemes토큰을 나타냅니다. 예를 들어,쥐rat사전 중 하나가 단어를 인식했기 때문에쥐복수 형태의rat. 일부 단어는로 인식됩니다.단어 중지(섹션 12.6.1)는 검색에 너무 자주 발생하기 때문에 무시됩니다. 이 예에서는 이것들이a, on및it. 목록의 사전이 토큰을 인식하지 않으면 무시됩니다. 구두점 부호에 발생한이 예에서-실제로 토큰 유형에 할당 된 사전이 없기 때문에 (공간 기호), 공간 토큰은 결코 색인되지 않습니다. 파서, 사전 및 색인 유형 유형의 선택은 선택한 텍스트 검색 구성 (에 의해 결정됩니다.PostgreSQL : 문서 : 9.6 : 토토 사이트 추천 예). 동일한 데이터베이스에 다양한 구성을 가질 수 있으며 다양한 언어에 대해 사전 정의 된 구성을 사용할 수 있습니다. 이 예에서는 기본 구성을 사용했습니다영어영어의 경우.
함수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의 소스에 레이블을 지정하려면tsvectorTSVECTORtsvector연결 연산자||. (섹션 12.4.1이 작업에 대한 세부 정보 제공.)
postgresql함수 제공to_tsquery
, plainto_tsquery
및Phraseto_tsquery
쿼리를로 변환하려면tsquery데이터 유형.to_tsquery
어느 것보다 더 많은 기능에 대한 액세스를 제공plainto_tsquery
또는Phraseto_tsquery
, 그러나 입력에 대해 덜 용서합니다.
to_tsquery ([ config RegConfig, ]QueryText 텍스트) 반환TSQUERY
to_tsquery
a 생성TSQUERY값에서QueryText.tsquery운영자&(및),|(또는),!(아님) 및<--(뒤에), 괄호를 사용하여 그룹화 될 수 있습니다. 다시 말해,에 대한 입력to_tsquery
이미 일반 규칙을 따라야합니다tsquery입력, 설명대로섹션 8.11.2. 차이점은 기본적으로tsquery입력 토큰을 액면가로 가져옵니다.to_tsquery
지정된 또는 기본 구성을 사용하여 각 토큰을 Lexeme으로 정규화하고 구성에 따라 중지 단어 인 토큰을 버립니다. 예를 들어:
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 and, or, 또는 연산자에 의해 분리되지 않은 토큰에 대한 구문 오류가 생성됩니다.
Plainto_tsquery ([ config RegConfig, ]QueryText 텍스트) 반환tsquery
Plainto_tsquery
형식화되지 않은 텍스트 변환QueryTextatsquery값. 텍스트는 구문 분석되고 정규화됩니다.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'
순위 순위는 특정 토토 꽁 머니가 특정 쿼리와 관련된 방법을 측정하려고 시도하여, 많은 일치가있을 때 가장 관련성이 가장 좋은 내용을 먼저 표시 할 수 있습니다..postgresql어휘, 근접성 및 구조 정보를 고려한 두 가지 사전 정의 된 순위 함수를 제공합니다. 즉, 토토 꽁 머니에 쿼리 용어가 얼마나 자주 나타나는지, 토토 꽁 머니에 용어가 얼마나 가까이 있는지, 그리고 토토 꽁 머니가 발생하는 곳의 일부가 얼마나 중요한지 고려합니다. 그러나 관련성의 개념은 모호하고 응용 분야에 따라 다릅니다. 다른 응용 프로그램에는 순위에 대한 추가 정보 (예 : 토토 꽁 머니 수정 시간)가 필요할 수 있습니다. 내장 순위 기능은 예제 일뿐입니다. 자신의 순위 기능을 작성하거나 특정 요구에 맞는 추가 요인과 결과를 결합 할 수 있습니다.
현재 사용 가능한 두 순위 기능은 다음과 같습니다.
일치하는 Lexemes의 빈도에 따라 벡터를 순위에 올랐습니다.
이 함수는를 계산합니다.커버 밀도Clarke, Cormack 및 Tudhope의 "Information Processing and Management", 1999 저널의 "1 ~ 3 개의 쿼리에 대한 관련성 순위"에 설명 된 바와 같이 주어진 토토 꽁 머니 벡터 및 쿼리에 대한 순위TS_RANK
서로 일치하는 Lexemes의 근접성이 서로 고려된다는 점을 제외하고 순위.
이 기능은 계산을 수행하기 위해 Lexeme 위치 정보가 필요합니다. 그러므로 그것은 어떤 것을 무시합니다"스트리핑"lexemes in theTSVECTOR. 입력에 쇄골이없는 Lexemes가 없으면 결과는 0이됩니다. (보다섹션 12.4.1에 대한 자세한 내용은Strip
함수 및 위치 정보의TSVECTORs.)
이 기능 모두 선택 사항웨이트인수는 라벨이 붙은 방식에 따라 단어 인스턴스를 다소 크게 측정 할 수있는 능력을 제공합니다. 웨이트 어레이는 순서대로 각 단어 범주의 무게를 크게 측정하는 방법을 지정합니다.
D- 웨이트, C- 가이트, B- 가이트, A- 가이트
그렇지 않은 경우웨이트제공되면 이러한 기본값이 사용됩니다.
0.1, 0.2, 0.4, 1.0
일반적으로 가중치는 제목이나 초기 초록과 같은 토토 꽁 머니의 특수 영역에서 단어를 표시하는 데 사용되므로 토토 꽁 머니 본문의 단어보다 더 중요하거나 덜 중요하게 취급 할 수 있습니다..
더 긴 토토 꽁 머니는 쿼리 용어를 포함 할 가능성이 더 높기 때문에 토토 꽁 머니 크기를 고려하는 것이 합리적입니다. 예를 들어 검색어의 5 가지 인스턴스가있는 백 단어 토토 꽁 머니는 아마도 5 개의 인스턴스가있는 천 단어 토토 꽁 머니보다 더 관련이있을 것입니다. 두 순위 기능 모두 정수를 취합니다정규화토토 꽁 머니의 길이가 순위에 미치는 지 여부와 방법을 지정하는 옵션. 정수 옵션은 몇 가지 동작을 제어하므로 약간의 마스크입니다.를 사용하여 하나 이상의 동작을 지정할 수 있습니다|(예 :2|4).
0 (기본값)은 토토 꽁 머니 길이를 무시합니다
1은 순위를 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옵션문자열이 지정되어 있습니다. 하나 이상의 쉼표로 구분 된 목록으로 구성되어야합니다옵션=value쌍. 사용 가능한 옵션은 다음과 같습니다.
maxwords, minwords(정수) :이 숫자는 출력에 가장 길고 가장 짧은 헤드 라인을 결정합니다. 기본값은 35와 15입니다.
Shortword(정수) :이 길이 이하의 단어는 쿼리 용어가 아닌 한 헤드 라인의 시작과 끝에서 삭제됩니다. 3의 기본값은 일반적인 영어 기사를 제거합니다.
하이라이트(부울) : iftrue전체 토토 꽁 머니는 앞의 세 매개 변수를 무시하고 헤드 라인으로 사용됩니다. 기본값은false.
maxfragments(정수) : 표시 할 최대 텍스트 조각 수. 0의 기본값은 비 배제 기반 헤드 라인 생성 방법을 선택합니다. 0보다 큰 값은 조각 기반 헤드 라인 생성을 선택합니다 (아래 참조).
Startsel, Stopsel(문자열) : 토토 꽁 머니에 표시되는 쿼리 단어를 구분하는 문자열은 다른 발췌 단어와 구별됩니다. 기본값은입니다."<b"and"</b", HTML 출력에 적합 할 수 있습니다.
FragmentDelimiter(문자열) : 둘 이상의 조각이 표시되면 조각 이이 문자열로 분리됩니다. 기본값은"...".
이 옵션 이름은 사례에서 인식됩니다. 공백이나 쉼표가 포함 된 경우 문자열 값을 두 배로 인용해야합니다.
비 배수 기반 헤드 라인 생성에서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요약이므로 느리게 진행될 수 있으며주의해서 사용해야합니다.