Postgresql - 全文搜索索引 - 意外查询结果

时间:2015-01-21 00:11:44

标签: postgresql full-text-search full-text-indexing

我有一堆带有一堆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这个词好像被切断了?

但是,如果我把它设置为简单而不是挪威语,我会得到预期的结果,一切看起来都不错。那是为什么?

1 个答案:

答案 0 :(得分:1)

您在tsvectortsquery值之间使用了交叉配置。您应该使用一致的配置,例如:

select to_tsvector('norwegian', 'Importkompetanse Oslo AS')
       @@ to_tsquery('norwegian', 'Importkompetanse&Oslo&AS');

SQLFiddle

这就是为什么它适用于'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。)