Joe*_*ove 3 postgresql postgresql-9.3
我将 postgres 9.3 与全文搜索一起使用,并且我正在运行类似的查询
select * from jobs where fts @@ plainto_tsquery('pg_catalog.english','search term');
Run Code Online (Sandbox Code Playgroud)
我得到了正确的结果,但是,我希望能够获得与搜索词匹配的部分搜索结果。FTS 列只是描述列的 to_tsvector() 。我想要做的是显示描述的简短摘录,并突出显示术语。关于我如何实现这一目标的任何想法?
这就是该ts_headline()功能的用途。
它旨在为您提供已规范化的“原始”文本的摘录或重点。最基本的用法是这样的:
SELECT ts_headline(description, keywords) as result
FROM jobs, plainto_tsquery('pg_catalog.english','search term') as keywords
WHERE fts @@ keywords;
Run Code Online (Sandbox Code Playgroud)
请注意,此查询中的“描述”是我对包含原始文本的列名称的猜测,而“fts”是对包含规范化文本的列的猜测。
此查询将返回一个结果集,其中包含原始文本的摘录,其中匹配的标记通过 HTML<b>标记突出显示。
有一个逗号分隔的可选值字符串,您可以传递给此函数以更改其行为。例如,您可以通过设置StartSel和EndSel值来更改您将返回的周围标签:
SELECT ts_headline(description, keywords, 'StartSel=<em>,StopSel=</em>') as result
FROM jobs, plainto_tsquery('pg_catalog.english','search term') as keywords
WHERE fts @@ keywords;
Run Code Online (Sandbox Code Playgroud)
现在<b>标签将成为<em>标签。实际上,它们不必是 HTML 标记,您可以传入(几乎)任何字符串。
另一个要设置的流行值是您希望看到的摘录数量,通过设置MaxFragments值来控制可能返回的最大摘录数量,并结合MaxWords和MinWords值来设置每个摘录应包含多少文本。
SELECT ts_headline(description, keywords, 'MaxFragments=4,MaxWords=5,MinWords=2') as result
FROM jobs, plainto_tsquery('pg_catalog.english','search term') as keywords
WHERE fts @@ keywords;
Run Code Online (Sandbox Code Playgroud)
上面的查询现在将显示最多四个可能的摘录,并在两到五个单词之间设置一个单词边界。
如果您希望简单地显示整个文档并突出显示结果,您可以使用该HighlightAll值,它会覆盖所有片段值集:
SELECT ts_headline(description, keywords, 'HighlightAll=true') as result
FROM jobs, plainto_tsquery('pg_catalog.english','search term') as keywords
WHERE fts @@ keywords;
Run Code Online (Sandbox Code Playgroud)
注意: 小心使用,ts_headline()因为它可能是性能瓶颈。对于您希望突出显示的每条记录,数据库必须获取整个文本,对其进行解析并插入所需的开始和结束元素。
请谨慎使用该功能,并且仅将其设置为完整结果集的一小部分(前五名或前十名记录)。