我正在尝试构建一个全文搜索,其中应该匹配半个词。在我的示例中,列值为“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”中。谁能给我解释一下这种行为吗?
“Off”是英文停用词,因此通过英文文本搜索配置
to_tsquery()
将其删除。
to_tsquery 仍然应用词干和停用词,并且“off”是英语中的停用词,因此它被删除。 (删除了字符串中唯一的词位后,它将发布一个 NOTICE,但如果您不在客户端上处理 NOTICE,我想您不会知道这一点。)
要绕过词干和停用词,您可以直接输入 tsquery:
SELECT 1 WHERE to_tsvector('offer') @@ 'off:*'::tsquery;
当然,如果您使用配置和部分匹配来进行词干提取(或停止词),那么您就生活在罪恶的状态中。