Postgresql 中文操作指南
9.13. Text Search Functions and Operators #
Table 9.42, Table 9.43和 Table 9.44总结了全文搜索提供的函数和运算符。有关 PostgreSQL 文本搜索功能的详细说明,请参见 Chapter 12。
Table 9.42. Text Search Operators
Operator Description Example(s) |
tsvector @@ tsquery → boolean tsquery @@ tsvector → boolean tsvector 和 tsquery 是否匹配?(可以按照任何顺序提供参数。) to_tsvector('fat cats ate rats') @@ to_tsquery('cat & rat') → t |
text @@ tsquery → boolean 隐式调用 to_tsvector() 后,文本字符串是否与 tsquery 匹配? 'fat cats ate rats' @@ to_tsquery('cat & rat') → t |
tsvector @@@ tsquery → boolean tsquery @@@ tsvector → boolean 这是 @@ 的弃用同义词。 to_tsvector('fat cats ate rats') @@@ to_tsquery('cat & rat') → t |
tsvector _ |
_ tsvector → tsvector 连接两个 tsvector。如果两个输入都包含词素位置,则相应调整第二个输入的位置。'_a:1 b:2'::tsvector |
'c:1 d:2 b:3'::tsvector_ → 'a':1 'b':2,5 'c':3 'd':4 |
tsquery && tsquery → tsquery 将两个 tsquery 合并在一起,生成一个与同时匹配两个输入查询的文档匹配的查询。_fat |
rat'::tsquery && 'cat'::tsquery_ → _( 'fat' |
'rat' ) & 'cat'_ |
tsquery _ |
_ tsquery → tsquery 将两个 tsquery 合并在一起,生成一个查询,该查询匹配与任一输入查询匹配的文档。_fat |
rat'::tsquery |
'cat'::tsquery_ → _'fat' |
'rat' |
'cat'_ |
!! tsquery → tsquery 取反 tsquery ,生成一个匹配与输入查询不匹配的文档的查询。 !! 'cat'::tsquery → !'cat' |
tsquery <→ tsquery → tsquery 构建一个词组查询,如果两个输入查询在连续词素处匹配,则匹配。 to_tsquery('fat') <→ to_tsquery('rat') → 'fat' <→ 'rat' |
tsquery @> tsquery → boolean 第一个 tsquery 是否包含第二个?(这仅考虑一个查询中出现的全部词素是否出现在另一个查询中,忽略组合运算符。) 'cat'::tsquery @> 'cat & rat'::tsquery → f |
tsquery <@ tsquery → boolean 第一个 tsquery 是否包含在第二个中?(这仅考虑一个查询中出现的全部词素是否出现在另一个查询中,忽略组合运算符。) 'cat'::tsquery <@ 'cat & rat'::tsquery → t 'cat'::tsquery <@ '!cat & rat'::tsquery → t |
除了这些专门运算符外,在 Table 9.1中显示的常见比较运算符可用于类型 tsvector_和 _tsquery。它们对于文本搜索并不是很有用,但允许在这些类型的列上构建唯一索引。
Table 9.43. Text Search Functions
Function Description Example(s) |
array_to_tsvector ( text[] ) → tsvector 将文本字符串数组转换为 tsvector 。给定字符串按原样用作词素,不会进一步处理。数组元素不能是空字符串或 NULL 。 array_to_tsvector('{fat,cat,rat}'::text[]) → 'cat' 'fat' 'rat' |
get_current_ts_config ( ) → regconfig 返回当前默认文本搜索配置的 OID(由 default_text_search_config 设置)。 get_current_ts_config() → english |
length ( tsvector ) → integer 返回 tsvector 中的词素数量。 length('fat:2,4 cat:3 rat:5A'::tsvector) → 3 |
numnode ( tsquery ) → integer 返回 tsquery 中的词素数量和运算符。_numnode('(fat & rat) |
cat'::tsquery)_ → 5 |
plainto_tsquery ( [ config regconfig , ] query text ) → tsquery 将文本转换为 tsquery ,根据指定或默认配置归一化单词。字符串中的标点符号会被忽略(它不会确定查询运算符)。产生的查询匹配文档,其中包含文本中全部非停用词。 plainto_tsquery('english', 'The Fat Rats') → 'fat' & 'rat' |
phraseto_tsquery ( [ config regconfig , ] query text ) → tsquery 将文本转换为 tsquery ,根据指定或默认配置归一化单词。字符串中的标点符号会被忽略(它不会确定查询运算符)。产生的查询匹配包含文本中全部非停用词的词组。 phraseto_tsquery('english', 'The Fat Rats') → 'fat' <→ 'rat' phraseto_tsquery('english', 'The Cat and Rats') → 'cat' <2> 'rat' |
websearch_to_tsquery ( [ config regconfig , ] query text ) → tsquery 将文本转换为 tsquery ,根据指定或默认配置归一化单词。带引号的单词序列会转换为词组测试。“or”一词被理解为会生成 OR 运算符,连字符会生成 NOT 运算符;其他标点符号会被忽略。这近似于某些常用网络搜索工具的行为。 websearch_to_tsquery('english', '"fat rat" or cat dog') → _'fat' <→ 'rat' |
'cat' & 'dog'_ |
querytree ( tsquery ) → text 生成 tsquery 可索引部分的表示形式。结果为空或仅为 T 指示不可索引查询。 querytree('foo & ! bar'::tsquery) → 'foo' |
setweight ( vector tsvector , weight "char" ) → tsvector 将指定的 weight 分配给 vector 的每个元素。 setweight('fat:2,4 cat:3 rat:5B'::tsvector, 'A') → 'cat':3A 'fat':2A,4A 'rat':5A |
setweight ( vector tsvector , weight "char" , lexemes text[] ) → tsvector 将指定的 weight 分配给 vector 中列在 lexemes 的元素。 lexemes 中的字符串将作为词素按原样采用,不再进行处理。与 vector 中的任何词素不匹配的字符串将被忽略。 setweight('fat:2,4 cat:3 rat:5,6B'::tsvector, 'A', '{cat,rat}') → 'cat':3A 'fat':2,4 'rat':5A,6A |
strip ( tsvector ) → tsvector 从 tsvector 中移除位置和权重。 strip('fat:2,4 cat:3 rat:5A'::tsvector) → 'cat' 'fat' 'rat' |
to_tsquery ( [ config regconfig , ] query text ) → tsquery 将文本转换为 tsquery ,根据指定或默认配置对单词进行标准化。该单词必须通过有效的 tsquery 运算符组合。 to_tsquery('english', 'The & Fat & Rats') → 'fat' & 'rat' |
to_tsvector ( [ config regconfig , ] document text ) → tsvector 将文本转换为 tsvector ,根据指定或默认配置对单词进行标准化。结果中包含位置信息。 to_tsvector('english', 'The Fat Rats') → 'fat':2 'rat':3 |
to_tsvector ( [ config regconfig , ] document json ) → tsvector to_tsvector ( [ config regconfig , ] document jsonb ) → tsvector 将 JSON 文档中的每个字符串值转换为 tsvector ,根据指定或默认配置对单词进行标准化。然后按文档顺序连接结果以生成输出。位置信息按每个字符串值对之间存在一个停用词来生成。(请注意,在 JSON 对象的字段的“文档顺序”在输入为 jsonb 时依赖于实现;请观察示例中的差异。) to_tsvector('english', '{"aa": "The Fat Rats", "b": "dog"}'::json) → 'dog':5 'fat':2 'rat':3 to_tsvector('english', '{"aa": "The Fat Rats", "b": "dog"}'::jsonb) → 'dog':1 'fat':4 'rat':5 |
json_to_tsvector ( [ config regconfig , ] document json , filter jsonb ) → tsvector jsonb_to_tsvector ( [ config regconfig , ] document jsonb , filter jsonb ) → tsvector 从 JSON 文档中选择 filter 请求的每个项目,并将每个项目转换为 tsvector ,根据指定或默认配置对单词进行标准化。然后按文档顺序连接结果以生成输出。位置信息按每个选定项目对之间存在一个停用词来生成。(请注意,在 JSON 对象的字段的“文档顺序”在输入为 jsonb 时依赖于实现。) filter 必须是包含以下关键字中零个或多个的 jsonb 数组: "string" (包含所有字符串值)、 "numeric" (包含所有数字值)、 "boolean" (包含所有布尔值)、 "key" (包含所有键)或 "all" (包含所有上述值)。作为特殊情况, filter 也可以是其中一个关键字的简单 JSON 值。 json_to_tsvector('english', '{"a": "The Fat Rats", "b": 123}'::json, '["string", "numeric"]') → '123':5 'fat':2 'rat':3 json_to_tsvector('english', '{"cat": "The Fat Rats", "dog": 123}'::json, '"all"') → '123':9 'cat':1 'dog':7 'fat':4 'rat':5 |
ts_delete ( vector tsvector , lexeme text ) → tsvector 从 vector 中移除 lexeme 的任何出现。 lexeme 字符串将作为词素按原样采用,不再进行处理。 ts_delete('fat:2,4 cat:3 rat:5A'::tsvector, 'fat') → 'cat':3 'rat':5A |
ts_delete ( vector tsvector , lexemes text[] ) → tsvector 从 vector 中移除 lexemes 中的词素的任何出现。 lexemes 中的字符串将作为词素按原样采用,不再进行处理。与 vector 中的任何词素不匹配的字符串将被忽略。 ts_delete('fat:2,4 cat:3 rat:5A'::tsvector, ARRAY['fat','rat']) → 'cat':3 |
ts_filter ( vector tsvector , weights "char"[] ) → tsvector 从 vector 中仅选择具有 weights 给定值的元素。 ts_filter('fat:2,4 cat:3b,7c rat:5A'::tsvector, '{a,b}') → 'cat':3B 'rat':5A |
ts_headline ( [ config regconfig , ] document text , query tsquery [, options text ] ) → text 采用缩略形式显示在 document 中的 query 匹配项,而 document 必须是原始文本,而不是 tsvector 。匹配查询前,将根据指定或默认配置对文档中的单词进行规范化。在 Section 12.3.4 中讨论了此函数的使用,同时也对可用的 options 进行了说明。 ts_headline('The fat cat ate the rat.', 'cat') → The fat <b>cat</b> ate the rat. |
ts_headline ( [ config regconfig , ] document json , query tsquery [, options text ] ) → text ts_headline ( [ config regconfig , ] document jsonb , query tsquery [, options text ] ) → text 采用缩略形式显示 JSON document 内部字符串值中出现的 query 匹配项。有关更多详情,请参见 Section 12.3.4 。 ts_headline('{"cat":"raining cats and dogs"}'::jsonb, 'cat') → {"cat": "raining <b>cats</b> and dogs"} |
ts_rank ( , ] _vector tsvector , query tsquery [, normalization integer ] ) → real 计算一个分数,显示 vector 与 query 的匹配程度。有关详情,请参见 Section 12.3.3 。 ts_rank(to_tsvector('raining cats and dogs'), 'cat') → 0.06079271 |
ts_rank_cd ( , ] _vector tsvector , query tsquery [, normalization integer ] ) → real 计算一个分数,显示 vector 与 query 的匹配程度,采用了覆盖密度算法。有关详情,请参见 Section 12.3.3 。 ts_rank_cd(to_tsvector('raining cats and dogs'), 'cat') → 0.1 |
ts_rewrite ( query tsquery , target tsquery , substitute tsquery ) → tsquery 用 substitute 替换 query 中的 target 出现。有关详情,请参见 Section 12.4.2.1 。_ts_rewrite('a & b'::tsquery, 'a'::tsquery, 'foo |
bar':tsquery)_ → _'b' & ( 'foo' |
'bar' )_ |
ts_rewrite ( query tsquery , select text ) → tsquery 根据通过执行 SELECT 命令获得的目标和替换,替换 query 的部分内容。有关详情,请参见 Section 12.4.2.1 。 SELECT ts_rewrite('a & b'::tsquery, 'SELECT t,s FROM aliases') → _'b' & ( 'foo' |
'bar' )_ |
tsquery_phrase ( query1 tsquery , query2 tsquery ) → tsquery 构建一个短语查询,搜索相继词素(与 <→ 运算符相同)中的 query1 和 query2 的匹配项。 tsquery_phrase(to_tsquery('fat'), to_tsquery('cat')) → 'fat' <→ 'cat' |
tsquery_phrase ( query1 tsquery , query2 tsquery , distance integer ) → tsquery 构建一个短语查询,搜索相隔正好 distance 个词素的 query1 和 query2 的匹配项。 tsquery_phrase(to_tsquery('fat'), to_tsquery('cat'), 10) → 'fat' <10> 'cat' |
tsvector_to_array ( tsvector ) → text[] 将 tsvector 转换为词素阵列。 tsvector_to_array('fat:2,4 cat:3 rat:5A'::tsvector) → {cat,fat,rat} |
unnest ( tsvector ) → setof record ( lexeme text , positions smallint[] , weights text )将 tsvector 展开到一行集合中,每行一个词素。 select * from unnest('cat:3 fat:2,4 rat:5A'::tsvector) → 词素 |
positions |
weights ---------------------------- cat |
{3} |
{D} fat |
{2,4} |
{D,D} rat |
{5} |
{A} |
Note
所有接受可选 regconfig 参数的文本搜索函数,当省略该参数时,将使用 default_text_search_config 指定的配置。
在 Table 9.44中的函数是分别列出的,因为它们通常不用于日常的文本搜索操作。它们主要有助于新文本搜索配置的开发和调试。
Table 9.44. Text Search Debugging Functions
Function Description Example(s) |
ts_debug ( [ config regconfig , ] document text ) → setof record ( alias text , description text , token text , dictionaries regdictionary[] , dictionary regdictionary , lexemes text[] )从 document 中根据指定的或默认文本搜索配置提取和规范化标记,并返回有关如何处理每个标记的信息。请参阅 Section 12.8.1 了解详细信息。 ts_debug('english', 'The Brightest supernovaes') → (asciiword,"Word, all ASCII",The,{english_stem},english_stem,{}) …​ |
ts_lexize ( dict regdictionary , token text ) → text[] 返回替换词素数组(如果字典已知输入标记)或空数组(如果字典已知标记但它是一个停用词)或 NULL(如果它不是已知单词)。请参阅 Section 12.8.3 了解详细信息。 ts_lexize('english_stem', 'stars') → {star} |
ts_parse ( parser_name text , document text ) → setof record ( tokid integer , token text )使用命名的解析器从 document 提取标记。请参阅 Section 12.8.2 了解详细信息。 ts_parse('default', 'foo - bar') → (1,foo) …​ |
ts_parse ( parser_oid oid , document text ) → setof record ( tokid integer , token text )使用由 OID 指定的解析器从 document 提取标记。请参阅 Section 12.8.2 了解详细信息。 ts_parse(3722, 'foo - bar') → (1,foo) …​ |
ts_token_type ( parser_name text ) → setof record ( tokid integer , alias text , description text )返回一个表,描述已命名解析器可以识别的每种类型的标记。请参阅 Section 12.8.2 了解详细信息。 ts_token_type('default') → (1,asciiword,"Word, all ASCII") …​ |
ts_token_type ( parser_oid oid ) → setof record ( tokid integer , alias text , description text )返回一个表,描述由 OID 指定的解析器可以识别的每种类型的标记。请参阅 Section 12.8.2 了解详细信息。 ts_token_type(3722) → (1,asciiword,"Word, all ASCII") …​ |
ts_stat ( sqlquery text [, weights text ] ) → setof record ( word text , ndoc integer , nentry integer )执行 sqlquery ,它必须返回单个 tsvector 列,并返回有关数据中包含的每个不同词素的统计信息。请参阅 Section 12.4.4 了解详细信息。 ts_stat('SELECT vector FROM apod') → (foo,10,15) …​ |