我有一个包含100m行的表,我需要全文搜索它,并提供有关如何相似的信息(例如:使用pg_trgm
模块)的文本。因为这里的问题是它应该很快。
我尝试了gist和gin索引,有一个额外的列与我的领域的tsvector等。
我的想法是首先使用tsvector进行查询,然后运行pg_trgm
模块提供的相似性函数。
我的问题如下。如果我使用一个完整的单词作为查询,它将工作。但如果我附加一些东西就不会了。
这是完全有意义的,因为“A quick brown fox...”的tsvector是"'a':1 'brown':3 'fox':4 'quick':2"
。
我希望我说清楚了我想达到的目标。
示例:
工作
select to_tsvector('A quick brown fox...') @@ to_tsquery('quick') -- true
不工作
select to_tsvector('A quick brown fox...') @@ to_tsquery('quicks') -- false
有什么想法如何使用postgresql来实现这一点吗?
2条答案
按热度按时间bis0qfac1#
您需要设置语言配置参数,如下所示:
只有当
tsquery
和tsvector
具有相同的语言配置时,才能正确识别具有复数和填充的词素。4xy9mtcn2#
在PostgreSQL中使用tsvector和tsquery执行全文搜索时,实际上可以对tsvector和tsquery使用相同的配置。这可以通过识别配置的值并在整个应用程序中一致地使用它来实现。假设一个表有数百万行,您可以添加一个额外的列来表示tsvector行,其中包含每个tsvector的配置。然后可以使用GIN索引来表示配置。使用@@参数在tsvector列中搜索关键字时,必须指定配置,因为索引配置中不接受默认值。每个tsvector可能具有不同的配置,因此在执行搜索时使用正确的配置很重要。这可以被看作是令牌化与词形化不同,第二个词形化仅在给定两个约束的情况下通过to_tsquery实现,并为tsvector和给定查询设置相同的配置。