【问题标题】:Postgres/full text search showing a preview of part of a documentPostgres/全文搜索显示文档部分的预览
【发布时间】:2020-08-27 13:07:06
【问题描述】:

我正在使用带有全文搜索功能的 postgres 9.3,并且正在运行类似

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

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

【问题讨论】:

    标签: postgresql postgresql-9.3


    【解决方案1】:

    这就是 ts_headline() 函数的用途。

    它旨在为您提供已规范化的“原始”文本的摘录或亮点。最基本的用法是这样的:

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

    请注意,此查询中的“description”是我对包含原始文本的列名称的猜测,“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;
    

    现在&lt;b&gt; 标签将变为&lt;em&gt; 标签。实际上,它们不必是 HTML 标签,您可以传入(几乎)任何字符串。

    另一个流行的设置值是您希望看到的摘录数量,通过设置MaxFragments 值来控制可能返回的最大摘录数量,并结合MaxWordsMinWords 值来设置多少文本应围绕每个摘录。

    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; 
    

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

    如果您希望简单地显示整个文档并突出显示结果,您可以使用HighlightAll 值,它会覆盖所有片段值集:

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

    注意:小心使用ts_headline(),因为它可能会成为性能瓶颈。对于您希望突出显示的每条记录,数据库必须获取整个文本,对其进行解析并插入所需的开始和结束元素。

    非常小心使用该函数,并且只在完整结果集中的一小部分(前五或前十记录)上放开它。

    【讨论】:

    • 关于性能的好点。正如文档所述,使用嵌套查询首先找到您的匹配项,然后仅针对您要显示的那些文档运行 ts_headline:postgresql.org/docs/9.5/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 2021-03-13
    相关资源
    最近更新 更多