Postgres:ts_vector @@ ts_query 无法按预期使用通配符('searchterm:*')

问题描述 投票:0回答:2

我正在尝试构建一个全文搜索,其中应该匹配半个词。在我的示例中,列值为“offer”,搜索词为“off”。我像这样构建查询。第一行不返回行,但第二行返回行。

SELECT * FROM my_table WHERE to_tsvector(my_column) @@ to_tsquery('off:*')
SELECT * FROM my_table WHERE to_tsvector(my_column) @@ to_tsquery('offe:*')

在这两种情况下,传递给 to_tsquery 的术语应与列值(“offer”)匹配。

现在,我尝试通过硬编码 to_tsvector 的值来简化此操作:

SELECT 1 WHERE to_tsvector('offer') @@ to_tsquery('offe:*') -> returns 1
SELECT 1 WHERE to_tsvector('offer') @@ to_tsquery('off:*') -> Does not return anything.

这对我来说没有任何意义,因为“offe”和“off”都包含在“offer”中。谁能给我解释一下这种行为吗?

postgresql full-text-search
2个回答
1
投票

“Off”是英文停用词,因此通过英文文本搜索配置

to_tsquery()
将其删除。


0
投票

to_tsquery 仍然应用词干和停用词,并且“off”是英语中的停用词,因此它被删除。 (删除了字符串中唯一的词位后,它将发布一个 NOTICE,但如果您不在客户端上处理 NOTICE,我想您不会知道这一点。)

要绕过词干和停用词,您可以直接输入 tsquery:

SELECT 1 WHERE to_tsvector('offer') @@ 'off:*'::tsquery;

当然,如果您使用配置和部分匹配来进行词干提取(或停止词),那么您就生活在罪恶的状态中。

© www.soinside.com 2019 - 2024. All rights reserved.