我们有一个 Express API,可以使用 Sequelize 连接到 Postgres 数据库。
我们的一个端点返回一个销售列表,它接受不同的查询参数,如页面、列顺序、过滤器和搜索词。该搜索只是
ilike
与 8 列上的搜索词进行比较,再加上其他 2 个更复杂的类似功能:将词与客户的名字和姓氏的串联进行比较(使用 concat
函数);以及其他将其与位置名称的首字母缩略词进行比较(在该列上使用 regexp_replace
)。
我们正在使用数据最多的客户端(大约 100k 行)进行测试,端点通常需要 1 到 2 秒,这是可以接受的,但如果执行搜索,则需要大约 6 秒。
我们可以做一些简单的事情,比如减少我们搜索的列数(我们正在评估所有这些列是否都是必要的),停止使用缩写词,并做其他事情来代替全名的连接,就像 ||运算符(我正在尝试在 Sequelize 上执行此操作)。我们也可以使用索引。
但除此之外,您建议做什么?我正在评估使用 Elasticsearch,但它可能有点矫枉过正,并且需要时间来设置和维护。
我还阅读了 Postgres 上的完整搜索文本,这将使搜索速度更快,并为我们提供更高级的搜索功能(类似于 Elasticsearch),您会推荐吗?我想你会把它与 gist 或 gin 索引配对,对吗?
还有其他推荐吗?
尝试使用该列上的索引进行文本搜索
CREATE INDEX idx_fulltext_content ON documents USING GIN(to_tsvector('english', content));
我以前没有使用过,但我有elasticsearch的经验
elasticsearch 拥有大堆栈,适用于大型数据集,例如每日 100k 文档。
你只需要简单的文本搜索,不需要为这个简单的查询带来弹性(搜索引擎功能) 在使用新技术之前尝试一下您拥有的功能