gpt4 book ai didi

postgresql - 如何将前缀匹配附加到 PostgreSQL 中的 tsquery

转载 作者:行者123 更新时间:2023-11-29 12:07:28 25 4
gpt4 key购买 nike

我正在尝试利用 PostgreSQL 的全文搜索功能,特别是当用户输入某些搜索文本时,我想在假设最后一个词不完整的情况下向他显示结果。

为此,需要将“*”通配符附加到最后一个 tsquery 词位。例如。如果用户输入 "The fat ra",则 tsquery 应该是 'fat' & 'ra':*

如果我将通配符附加到输入字符串并使用 plainto_tsquery 函数对其进行解析,则通配符将被删除 plainto_tsquery("The fat ra"|| ":*") => '脂肪'和'ra'

使用to_tsquery 函数手动构造一个tsquery 需要对字符串进行大量修改(例如修剪空格和其他特殊字符,用& 字符替换空格)以使函数接受它。

有更简单的方法吗?

最佳答案

您可以将 tsquery 中的最后一个词素转换为字符串,附加 ':*',然后将其转换回 tsquery:

=> SELECT ((to_tsquery('foo <-> bar')::text || ':*')::tsquery);
tsquery
-------------------
'foo' <-> 'bar':*

对于您的用例,您需要使用 <->而不是 &要求单词彼此相邻。下面是它们的不同之处的演示:

=> SELECT 'foo bar baz' @@ tsquery('foo & baz');
?column?
----------
t
(1 row)

=> SELECT 'foo bar baz' @@ tsquery('foo <-> baz');
?column?
----------
f
(1 row)

phraseto_tsquery可以很容易地指定许多必须彼此相邻的单词:

=> SELECT phraseto_tsquery('foo baz');
phraseto_tsquery
------------------
'foo' <-> 'baz'

综合起来:

=> SELECT (phraseto_tsquery('The fat ra')::text || ':*')::tsquery;
tsquery
------------------
'fat' <-> 'ra':*

根据您的需要,更简单的方法可能是直接使用字符串构建 tsquery,然后进行强制转换:

=> SELECT $$'fat' <-> 'ra':*$$::tsquery;
tsquery
------------------
'fat' <-> 'ra':*

关于postgresql - 如何将前缀匹配附加到 PostgreSQL 中的 tsquery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54575568/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com