我有一堆带有一堆cols的桌子 我在这样的表上创建了一个全文索引:
CREATE INDEX phrasetable_exp_idx ON msc.mytable
USING gin(to_tsvector('norwegian', coalesce(msc.mytable.col1,'') || ' ' ||
coalesce(msc.mytable.col2,'') || ' ' ||
coalesce(msc.mytable.col3,'') || ' ' ||
coalesce(msc.mytable.col4,'') || ' ' ||
coalesce(msc.mytable.col5,'') || ' ' ||
coalesce(msc.mytable.col6,'') || ' ' ||
coalesce(msc.mytable.col7,'')));
我尝试了一些搜索,但它们闪电般快,但是,对于某个特定的搜索,我没有得到预期的结果。 我的表中有一行,其中col1和col2都具有确切的值" Importkompetanse Oslo AS" 在col3中它的值为#9; 9999"。 只有查询to_tsquery(' 9999')才会返回该行,这表明它确实具有值" Importkompetanse Oslo AS"在col1和col2中,但前两个查询不返回任何匹配项。
SELECT *
FROM msc.mytable
WHERE to_tsvector('norwegian', coalesce(msc.col1,'') || ' ' ||
coalesce(msc.mytable.col2,'') || ' ' ||
coalesce(msc.mytable.col3,'') || ' ' ||
coalesce(msc.mytable.col4,'') || ' ' ||
coalesce(msc.mytable.col5,'') || ' ' ||
coalesce(msc.mytable.col6,'') || ' ' ||
coalesce(msc.mytable.col7,'')));
@@ --to_tsquery('Importkompetanse&Oslo&AS') -- nada
plainto_tsquery('Importkompetanse') -- nada
--to_tsquery('9999') -- OK!
有没有人知道为什么我的搜索没有结果?
编辑:
出于某种原因,to_tsquery返回如下内容: "' 9999':9' importkompetans':1,6" importkompetanse这个词好像被切断了?
但是,如果我把它设置为简单而不是挪威语,我会得到预期的结果,一切看起来都不错。那是为什么?
答案 0 :(得分:1)
您在tsvector
和tsquery
值之间使用了交叉配置。您应该使用一致的配置,例如:
select to_tsvector('norwegian', 'Importkompetanse Oslo AS')
@@ to_tsquery('norwegian', 'Importkompetanse&Oslo&AS');
这就是为什么它适用于'simple'
配置(即default)。
注意:您始终可以使用ts_debug()
进行debug文本搜索:f.ex。 'Importkompetanse'
尚未被截止,'importkompetans'
只是这个词的恰当词汇(在'norwegian'
配置中)。
关闭:如果您在查询中也使用了精确的表达式,那么您将使用一个非常长的基于表达式的索引,该索引只会被使用。您在示例中使用了它,但这会使您的查询非常长,如果您稍后更改索引表达式,则需要确保所有“使用”都已更新。
您可以使用简单的(sql)函数来简化查询:
create or replace function col_tsvector(mytable)
returns tsvector
immutable
language sql
as $function$
return to_tsvector('norwegian',
coalesce($1.col1, '') || ' ' ||
coalesce($1.col2, '') || ' ' ||
coalesce($1.col3, '') || ' ' ||
coalesce($1.col4, '') || ' ' ||
coalesce($1.col5, '') || ' ' ||
coalesce($1.col6, '') || ' ' ||
coalesce($1.col7, ''))
$function$;
通过这种方式,您可以大大简化索引定义&你的疑问也是。 (您甚至可以使用attribute notation。)