select to_tsvector('english', 'Ice-cream') @@ to_tsquery('english', 'Ice<->cream');
是真的。尽管:
select to_tsvector('english', 'iDream Ice-cream iScream') @@ to_tsquery('english', 'iDream<->Ice<->cream<->iScream');
是假的。
据我了解。两者都在匹配项之前和之后添加相同的单词。它将保持相同的答案。
这是因为全文搜索特别对待连字符的词:
词位后面的数字标记了它们在原始文本中的位置(
cream
是第三个单词,依此类推)。用于短语搜索。您会看到原始的连字词在第二个位置,并且部分表示为在连字词之后。
所以
ice cream
与PostgreSQL 全文搜索不同。ice-cream
在第一种情况下,ice
紧随其后的是idream
,但不是在第二种情况下。这就是您的查询返回的原因FALSE
。看看解析器做了什么:
也许您正在寻找的解决方案是忽略连字符并只保留它们的部分: