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

Postgresql - full text search index - unexpected query results

我有一个 table 有一堆 cols 我在 table 上创建了一个全文索引,如下所示:

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,'')));

我尝试了一些搜索,它们非常快,但是,对于一个特定的搜索,我没有得到预期的结果。 我的 table 中有一行,其中 col1 和 col2 都有确切的值 "Importkompetanse Oslo AS" 在 col3 中,它的值为“9999”。 只有查询 to_tsquery('9999') return 是行,这表明它在 col1 和 col2 中确实具有值 "Importkompetanse Oslo AS",但前两个查询 return 没有匹配项。

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 return 是这样的: “'9999':9 'importkompetans':1,6” importkompetanse这个词好像被砍掉了?

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

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

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

SQLFiddle

这就是它使用 'simple' 配置(即您的 default)的原因。

注意:您始终可以debug使用ts_debug()进行文本搜索:f.ex。 'Importkompetanse'没有被截断,'importkompetans'只是这个词的合适词素(在'norwegian'配置中)。

Off:你使用了一个非常长的、基于表达式的索引,只有当你在查询中也使用了精确的表达式时才会使用它。您在您的示例中正确使用了它,但这会使您的查询变得非常长,如果您稍后更改索引表达式,您需要确保所有 "uses" 也更新。

您可以使用一个简单的 (sql) 函数来简化您的查询:

create or replace function col_tsvector(mytable)
  returns tsvector
  immutable
  language sql
  as $function$
return to_tsvector('norwegian',
  coalesce(.col1, '') || ' ' || 
  coalesce(.col2, '') || ' ' || 
  coalesce(.col3, '') || ' ' ||
  coalesce(.col4, '') || ' ' ||
  coalesce(.col5, '') || ' ' ||
  coalesce(.col6, '') || ' ' ||
  coalesce(.col7, ''))
$function$;

有了这个,您也可以大大简化索引定义和查询。 (您甚至可以使用 attribute notation。)