【发布时间】: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 操作符 (<->) 也是如此;您可以将 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' <-> 'dog'(即“红色”紧跟“狗”),我对最后两个亮点感到惊讶。
documentation for ts_headline 说:
以缩写形式显示文档中查询的匹配,
这让我相信这是一个错误,但 the longer blurb on highlighting results 只说函数
返回文档的摘录,其中突出显示了查询中的术语
确实,来自查询的术语突出显示...
我尝试过使用 ts_headline 的选项参数,但没有任何改变这种行为。
所以...我是不是说错了,是是错了,还是我只是对它的行为有错误的期望?
(似乎与this older question 相切,但它似乎描述了一个不同 错误。我无法确定this scenario 中究竟发生了什么或没有发生或应该发生什么,所以谁知道它是否相关。)
【问题讨论】:
标签: postgresql full-text-search