use*_*833 3 postgresql full-text-search array
在搜索 能力和性能方面,将标签作为或或全文字段实现的优缺点是什么?array
text
我发现选择使用数组实现标签的能力有局限性,因为在我看来,如果数组包含,['juicy fruit']
那么搜索的人'fruit'
将找不到该记录(例如,tags && ARRAY['fruit']
找不到它)。创建该记录的人将不得不输入更像是['juicy fruit', 'juicy', 'fruit']
只需搜索'fruit'
或 即可找到他们的记录的内容'juicy'
。而如果我将标签实现为text
,那么搜索'fruit'
将找到'juicy fruit'
,更进一步,如果我将标签实现为全文,那么我将'juicy fruit'
在使用字符串'fruits'
(复数)进行搜索时找到。此外,我认为进行全文搜索不会有性能损失。想法?
但也许标签的全部意义是 完全匹配。
您可以通过使用或 generate_subscripts 函数来获取数组的搜索ANY/SOME
功能。但是,PostgreSQL 文档指出以下内容:
提示:数组不是集合;搜索特定的数组元素可能是数据库设计错误的标志。考虑使用一个单独的表格,其中每个项目都有一行,这将是一个数组元素。这将更容易搜索,并且可能对大量元素进行更好的缩放。
所以看起来你走在正确的轨道上,因为你没有失去性能是正确的(你更有可能获得它),而其他方法允许更大的灵活性。标签本身是关于完全匹配的,但大多数网站也有搜索标签的方法(例如,这个网站)。
如果您将标记存储实现为全文,则不会排除匹配(包括正则表达式)与更简单的表达式(例如LIKE/ILIKE
. 一个常见的场景是将文档(被搜索的文本块)存储为text
orvarying character
并将tsvector
全文搜索所需的类型存储在单独的列中。有关创建全文索引的更多信息,请参阅PostgreSQL 文档。
优点和缺点应该很明显:使用array
限制可扩展性和搜索选项,因为它缺乏文本索引、词干和屈折支持,但在需要精确匹配时很容易使用。text
搜索字符串时,使用数据类型更加灵活。使用text
具有生成tsvector
列的数据类型在所有场景中提供最大的灵活性和良好的性能,但需要更多的存储空间。
归档时间: |
|
查看次数: |
1374 次 |
最近记录: |