gpt4 book ai didi

postgresql - 在 Postgresql 下使用 to_tsquery 搜索奇怪的结果

转载 作者:行者123 更新时间:2023-11-29 12:03:54 27 4
gpt4 key购买 nike

我在使用 tsquery 搜索像 pro-physik.de 这样的表达式时得到了一个奇怪的结果。

如果我通过 tsquery 请求 pro-physik:*,我想获取所有以 pro-physik 开头的条目。不幸的是,那些带有 pro-physik.de 的条目丢失了。

这里有两个例子来说明这个问题:

查询 1:

select 
to_tsvector('simple', 'pro-physik.de') @@
to_tsquery('simple', 'pro-physik:*') = true

结果 1:false(应该是 true)

查询 2:

select 
to_tsvector('simple', 'pro-physik.de') @@
to_tsquery('simple', 'pro-p:*') = true

结果 2:true

有人知道我该如何解决这个问题吗?

最佳答案

问题的核心是解析器会将pro-physik.de解析为主机名:

SELECT alias, token FROM ts_debug('simple', 'pro-physik.de');

alias | token
-------+---------------
host | pro-physik.de
(1 row)

比较这个:

SELECT alias, token FROM ts_debug('simple', 'pro-physik-de');
alias | token
-----------------+---------------
asciihword | pro-physik-de
hword_asciipart | pro
blank | -
hword_asciipart | physik
blank | -
hword_asciipart | de
(6 rows)

现在 pro-physikpro-p不是主机名,所以你得到

SELECT to_tsquery('simple', 'pro-physik:*');
to_tsquery
---------------------------------------
'pro-physik':* & 'pro':* & 'physik':*
(1 row)

SELECT to_tsquery('simple', 'pro-p:*');
to_tsquery
-----------------------------
'pro-p':* & 'pro':* & 'p':*
(1 row)

第一个 tsquery 不会匹配,因为 physik 不是 pro-physik.de 的前缀,第二个会匹配,因为 pro-p, prep 三个都是前缀

作为变通方法,使用这样的全文搜索:

select 
to_tsvector('simple', replace('pro-physik.de', '.', ' ')) @@
to_tsquery('simple', replace('pro-physik:*', '.', ' '))

关于postgresql - 在 Postgresql 下使用 to_tsquery 搜索奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38525177/

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