在tsquery中转义连字符(postgresql)

时间:2017-11-26 10:42:11

标签: postgresql full-text-search

我需要根据以下格式的字符串创建一个tsquery:

something-smth-somthing-etc-etc

致电to_tsquery('something-smth-somthing-etc-etc')返回:

'something-smth-somthing-etc-etc' & 'someth' & 'smth' & 'somth' & 'etc' & 'etc'

显然,字符串经过标记化,词干化等。 但在我们的例子中,我们制作FTS的列已经包含了tsvector,它包含一个单词lexeme:'something-smth-somthing-etc-etc'

查询 select * from sometable where searchee @@ to_tsquery('something-smth-somthing-etc-etc')不会返回任何结果。

如何调用to_tsquery,以便它不会分析提供的字符串并创建单个lexeme查询?

或者我错过了一些更重要的东西?

1 个答案:

答案 0 :(得分:3)

总结你有tsvector提到的值,它没有被处理,但只是作为tsvecor类型插入:

t=# select to_tsvector('something-smth-somthing-etc-etc'), 'something-smth-somthing-etc-etc'::tsvector;
                                    to_tsvector                                    |             tsvector
-----------------------------------------------------------------------------------+-----------------------------------
 'etc':5,6 'smth':3 'something':2 'something-smth-somthing-etc-etc':1 'somthing':4 | 'something-smth-somthing-etc-etc'
(1 row)
确实你会错的:

t=# select 'something-smth-somthing-etc-etc'::tsvector @@ to_tsquery('something-smth-somthing-etc-etc');
 ?column?
----------
 f

要破解它你也可以跳过对tsquery的处理:

t=# select 'something-smth-somthing-etc-etc'::tsvector @@ 'something-smth-somthing-etc-etc'::tsquery;
 ?column?
----------
 t