以数组、文本和全文形式实现的标签的能力和性能

use*_*833 3 postgresql full-text-search array

搜索 能力性能方面,将标签作为或或全文字段实现的优缺点是什么?arraytext

我发现选择使用数组实现标签的能力有局限性,因为在我看来,如果数组包含,['juicy fruit']那么搜索的人'fruit'将找不到该记录(例如,tags && ARRAY['fruit']找不到它)。创建该记录的人将不得不输入更像是['juicy fruit', 'juicy', 'fruit']只需搜索'fruit'或 即可找到他们的记录的内容'juicy'。而如果我将标签实现为text,那么搜索'fruit'将找到'juicy fruit',更进一步,如果我将标签实现为全文,那么我将'juicy fruit'在使用字符串'fruits'(复数)进行搜索时找到。此外,我认为进行全文搜索不会有性能损失。想法?

但也许标签的全部意义 完全匹配

dar*_*onw 5

您可以通过使用或 generate_subscripts 函数来获取数组搜索ANY/SOME功能。但是,PostgreSQL 文档指出以下内容:

提示:数组不是集合;搜索特定的数组元素可能是数据库设计错误的标志。考虑使用一个单独的表格,其中每个项目都有一行,这将是一个数组元素。这将更容易搜索,并且可能对大量元素进行更好的缩放。

所以看起来你走在正确的轨道上,因为你没有失去性能是正确的(你更有可能获得它),而其他方法允许更大的灵活性。标签本身是关于完全匹配的,但大多数网站也有搜索标签的方法(例如,这个网站)。

如果您将标记存储实现为全文,则不会排除匹配(包括正则表达式)与更简单的表达式(例如LIKE/ILIKE. 一个常见的场景是将文档(被搜索的文本块)存储为textorvarying character并将tsvector全文搜索所需的类型存储在单独的列中。有关创建全文索引的更多信息,请参阅PostgreSQL 文档

优点和缺点应该很明显:使用array限制可扩展性和搜索选项,因为它缺乏文本索引、词干和屈折支持,但在需要精确匹配时很容易使用。text搜索字符串时,使用数据类型更加灵活。使用text具有生成tsvector列的数据类型在所有场景中提供最大的灵活性和良好的性能,但需要更多的存储空间。