gpt4 book ai didi

performance - 改进 PostgreSQL 中小数据文本搜索的好处和权衡

转载 作者:行者123 更新时间:2023-11-29 14:11:46 25 4
gpt4 key购买 nike

  • 我有 4 个感兴趣的文本列。
  • 每列最多约 100 个字符。
  • 其中 3 列中的文本主要是拉丁词。 (数据是生物目录,这些是事物的名称。)
  • 数据目前约为 500 行。我预计这不会超过 1000。
  • 少数用户(10 岁以下)将拥有添加、更新和删除数据的编辑权限。我不希望这些用户给数据库带来沉重的负担。

因此,所有这些都表明需要考虑一个非常小的数据集。

我需要在所有 4 列中搜索至少 1 列包含搜索文本(不区分大小写)的行。将通过 Web 应用程序发出查询(并提供结果)。我对如何处理它有点迷茫。

PostgreSQL 提供了一些选项来提高文本搜索速度。我一直在考虑的内置于 PostgreSQL 中的可能选项是

  1. 根本不要尝试将其编入索引。只需在 lower 上使用 ILIKELIKE 或类似的。 (没有索引?)
  2. 使用 pg_trgm 建立索引以提高搜索速度。我假设我需要以某种方式索引连接。
  3. 全文搜索。我假设这也涉及连接索引。

不幸的是,我并不真正熟悉其中任何一个的预期性能或 yield 和权衡,因此很难知道我应该首先尝试哪些事情以及我什至不应该考虑哪些事情。我读过的一些内容表明,为 2 和 3 编制索引非常慢,这与我偶尔会进行修改的事实相冲突。混合语言使全文搜索看起来没有吸引力,因为它似乎是基于语言的,除非它可以同时处理多种语言。我是否期望对于这么小的数据,一个简单的 ILIKElower 上的一个 LIKE 可能足够快?或者也许索引对于这么小的数据修改的低负载足够快?在数据库之外寻找一些东西会更好吗?

当然,我必须实际对所有这些进行基准测试才能真正确定什么是最快的,但不幸的是,我没有太多时间来完成这个项目。那么这些方法的好处和权衡是什么?这些选项中有哪些不适合解决此类问题?还有哪些其他类型的解决方案(包括可能在数据库之外的)值得考虑?

(我想我可能会发现一些关于在 PG 中进行文本搜索的初学者教程很有用,但我的搜索大部分都是全文搜索,我什至不知道它是否对我有用。)

我使用的是 PG 9.2.4,所以 9.3 之前的任何好东西都是一个选项。

最佳答案

更新:我已将此答案扩展为 a detailed blog post .

与其纯粹关注速度,不如先考虑搜索语义。定义您的要求。

例如,用户是否需要能够根据术语的顺序进行区分?应该

radiata pinus

查找:

pinus radiata

?相同的规则是否适用于列内和列之间的词?

空格始终是单词分隔符,还是搜索词列中的空格?

你需要通配符吗?如果是这样,您是只需要左 anchor 通配符(想想 staph%)还是还需要右 anchor 通配符或中缀通配符(%ccusp% s)?只有 pg_tgrm 可以帮助您处理中缀通配符。后缀通配符可以通过单词的 reverse() 上的索引来处理,但这很快就会变得笨拙,因此在实践中 pg_tgrm 是最好的选择。

如果您主要搜索离散词并且词序不重要,那么 Pg 使用 to_tsvectorto_tsquery 进行全文搜索将是可取的。它支持左 anchor 通配符搜索、加权、类别等。

如果您主要对离散列进行前缀搜索,那么可以对每列的常规 B 树索引进行简单的 LIKE 查询。

所以。弄清楚您需要什么,然后如何去做。您当前的不确定性可能部分源于您不太清楚自己想要什么。

关于performance - 改进 PostgreSQL 中小数据文本搜索的好处和权衡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18438996/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com