Postgres /全文搜索显示部分文档的预览

时间:2014-03-08 04:40:25

标签: postgresql postgresql-9.3

我正在使用postgres 9.3进行全文搜索,我正在运行像

这样的查询
select * from jobs where fts @@ plainto_tsquery('pg_catalog.english','search term');

我得到了正确的结果,但是,我希望能够获得与搜索条件匹配的部分搜索结果。 FTS列只是描述列的to_tsvector()。我想做的是显示一个简短的描述摘录,突出显示的条款。关于我如何实现这一目标的任何想法?

1 个答案:

答案 0 :(得分:2)

这是ts_headline()函数的用途。

它旨在为您提供"原创"的摘录或重点。你已经标准化的文字。最基本的用法是:

SELECT ts_headline(description, keywords) as result
    FROM jobs, plainto_tsquery('pg_catalog.english','search term') as keywords
    WHERE fts @@ keywords;

请注意"说明"在此查询中,我猜测包含原始文本的列的名称和" fts"是包含规范化文本的列的猜测。

此查询将返回一个结果集,其中包含您的原始文本的摘录,其中匹配的标记通过HTML <b>标记突出显示。

可以将一个逗号分隔的可选值字符串传递给此函数以更改其行为。例如,您可以通过设置StartSelEndSel值来更改您将返回的周围标记:

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;

现在<b>代码将成为<em>代码。实际上,它们不必是HTML标签,您可以传入(几乎)任何字符串。

要设置的另一个受欢迎的值是您希望通过设置MaxFragments值以控制与MaxWords和{{1}组合返回的最大可能摘录数量而看到的摘录数量用于设置每个摘录周围的文本数量的值。

MinWords

上面的查询现在最多会显示四个可能的摘录,并且在两到五个单词之间设置一个单词边界。

如果您希望仅显示整个文档并突出显示结果,则可以使用SELECT ts_headline(description, keywords, 'MaxFragments=4,MaxWords=2,MinWords=5') as result FROM jobs, plainto_tsquery('pg_catalog.english','search term') as keywords WHERE fts @@ keywords; 值,该值将覆盖所有设置的片段值:

HighlightAll

注意: 提防使用SELECT ts_headline(description, keywords, 'HighlightAll=true') as result FROM jobs, plainto_tsquery('pg_catalog.english','search term') as keywords WHERE fts @@ keywords; 因为它可能会导致性能瓶颈。对于您要突出显示的每条记录,数据库必须去获取整个文本,解析它并插入所需的开始和结束元素。

请使用精心打理的功能,并且只在完整结果集的一小部分(前五或十大记录)中将其设置为松散。