搜索时的单词建议。
我可以像这样查询
select title from test where ts_filter(tsv, '{A}') @@ to_tsquery('english_nostop', 'god<->o' || ':*')
# tsv is something like to_tsvector('english_nostop', test.title)
<->
是这样的pattern = pattern.replace(' ', '<->')
。当模式包含时,这可能会有一些问题<
。以为我们可以删除这样的字符。
结合 tsquery 在这里不起作用。我找不到事情做to_tsquery(':*')
但是如何使用phraseto_tsquery
来替换 to_tsquery
?而且还能有:*
工作吗?
在@Laurenz Albe 回答之后。 phraseto_tsquery
不能这样做。
可能我需要提供更多细节。为什么我要使用phraseto_tsquery
.
我用
CREATE TEXT SEARCH DICTIONARY english_stem_nostop (
Template = snowball
, Language = english
);
CREATE TEXT SEARCH CONFIGURATION public.english_nostop ( COPY = pg_catalog.english );
ALTER TEXT SEARCH CONFIGURATION public.english_nostop
ALTER MAPPING FOR asciiword, asciihword, hword_asciipart, hword, hword_part, word WITH english_stem_nostop;
要保留停用词可以搜索。
但我需要在 python 中改变这样的模式:
pattern = info["pattern"]
replace_punctuation = str.maketrans(string.punctuation, ' ' * len(string.punctuation))
pattern = pattern.translate(replace_punctuation)
replace_space = pattern.replace(" ", '<->')
你可以看到我替换punctuation
为' '
. 然后替换' '
为<->
.
我提出了这个问题。因为我想知道我可以不在python中转换模式而只使用psql来转换模式。
为什么同时需要':*'
和<->
。这是一个例子:
select title from book where ts_filter(tsv_nostop, '{A}') @@ to_tsquery('english_nostop', 'how<->t'||':*')
except
select title from book where ts_filter(tsv_nostop, '{A}') @@ to_tsquery('english_nostop', 'how<->t');
这将显示标题包含how to
。当用户输入how t
. 我们想弹出一些标题。
你不能用
phraseto_tsquery
.phraseto_tsquery
较低级别的函数提供了更多使用或无法获得的功能websearch_to_tsquery
。