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这个词好像被砍掉了?
但是,如果我将它设置为简单而不是挪威语,我会得到预期的结果并且一切看起来都不错。这是为什么?
您在 tsvector
和 tsquery
值之间使用了交叉配置。您应该使用一致的配置,例如:
select to_tsvector('norwegian', 'Importkompetanse Oslo AS')
@@ to_tsquery('norwegian', 'Importkompetanse&Oslo&AS');
这就是它使用 '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。)
我有一个 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这个词好像被砍掉了?
但是,如果我将它设置为简单而不是挪威语,我会得到预期的结果并且一切看起来都不错。这是为什么?
您在 tsvector
和 tsquery
值之间使用了交叉配置。您应该使用一致的配置,例如:
select to_tsvector('norwegian', 'Importkompetanse Oslo AS')
@@ to_tsquery('norwegian', 'Importkompetanse&Oslo&AS');
这就是它使用 '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。)