【问题标题】:Is `ts_headline` intended to highlight non-matching parts of the query (which it does)?`ts_headline` 是否旨在突出显示查询的不匹配部分(确实如此)?
【发布时间】:2021-11-29 09:22:09
【问题描述】:

我在 Postgres 13.4 中运行了一些复杂的 FTS 查询,并在 ts_headline 中发现了一些出乎意料的行为,至少对我来说是这样,并且不确定我是否遇到了功能或错误。 ;)

初始健全性检查:

SELECT plainto_tsquery('english', 'red dog') @@ to_tsvector('The quick brown fox jumped over the lazy dog.');

-- false

不出意外:tsquery 的计算结果为 'red' & 'dog',文档不包含 'red',不匹配。但是当我试图成为头条新闻时:

SELECT ts_headline('The quick brown fox jumped over the lazy dog.', plainto_tsquery('english', 'red dog'));

-- The quick brown fox jumped over the lazy <b>dog</b>.

FOLLOWED_BY 操作符 (&lt;-&gt;) 也是如此;您可以将 plainto_tsquery 替换为 phraseto_tsquery (或构建您自己的 tsquery 文字)。它仍然会突出显示实际上不匹配的片段。

问题不是(或至少,不完全是)试图在没有真正匹配的情况下调用ts_headline 的结果。我原来的情况其实更像是:

SELECT ts_headline('I want a red dog, but not a black dog.  No red cats, either.', phraseto_tsquery('english', 'red dog'));

-- I want a <b>red</b> <b>dog</b>, but not a black <b>dog</b>.  No <b>red</b> cats, either.

在这种情况下,鉴于 tsquery 的计算结果为 'red' &lt;-&gt; 'dog'(即“红色”紧跟“狗”),我对最后两个亮点感到惊讶。

documentation for ts_headline 说:

以缩写形式显示文档查询的匹配,

这让我相信这是一个错误,但 the longer blurb on highlighting results 只说函数

返回文档的摘录,其中突出显示了查询中的术语

确实,来自查询的术语突出显示...

我尝试过使用 ts_headline 的选项参数,但没有任何改变这种行为。

所以...我是不是说错了,是错了,还是我只是对它的行为有错误的期望?

(似乎与this older question 相切,但它似乎描述了一个不同 错误。我无法确定this scenario 中究竟发生了什么或没有发生或应该发生什么,所以谁知道它是否相关。)

【问题讨论】:

    标签: postgresql full-text-search


    【解决方案1】:

    我认为您的问题是您认为ts_headline 会从结果集中消除行,但事实并非如此。为此,您需要一个 WHERE 条件。

    ts_headline 所做的是尽职尽责地突出字符串中的命中。如果没有命中,它不会突出显示任何内容,但仍会产生结果。

    为了获得有意义的结果,您应该在WHERE 条件中使用全文搜索后使用ts_headline

    SELECT ts_headline('english', doc, to_tsquery('english', 'red dog')
    FROM tab
    WHERE to_tsvector('english', doc) @@ to_tsquery('english', 'red dog');
    

    【讨论】:

    • 我明白你在说什么,但这并不是完整的答案。看最后一个例子。它实际上包含一个匹配项,但ts_headline 突出显示了除了那些 匹配项之外的内容。
    • 我不明白-它突出显示“红色”和“狗”,这是您查询的...
    猜你喜欢
    • 2015-03-06
    • 1970-01-01
    • 2019-05-18
    • 2018-09-22
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    相关资源
    最近更新 更多