优化大文本上的pgsql搜索查询(“like”,全文搜索,…)

gg58donl  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(331)

我们有一个软件解决方案,可供200多个客户使用。我们最近改用pgsql,因为我们以前的数据库处理客户使用的搜索查询太慢。
我们的数据库如下所示:
表a

1. ID
(+ some other fields which aren't important here)

表b
此表用于存储表a中项目的“数据”。这对每个客户都是不同的。例如,“type”可以是“clientname”,值可以是“azerty”。表a中的一条记录在表b中可以有无限条记录。大多数情况下,表a中的1条记录在表b中有5到10条记录。

1. ID TABLE A
 2. TYPE
 3. VALUE

表c

1. TABLE A ID
 2. VERSIONNR
 3. DESCRIPTION

此文件具有表a中记录的不同版本。每个版本都有一个扩展的描述。范围从0个字符到无限字符。
我们的问题是:我们的客户习惯于“谷歌式”搜索。例如:它们键入'azerty',我们显示表a中的所有记录,其中表a的id:
“azerty”在表c的最新版本的描述中
“azerty”在表b的一个值中
其他问题:此搜索是“包含”。如果他们搜索“zer”,他们还应该找到包含“azerty”的记录。多个参数是“and”,如果它们搜索“zer 123”,则需要显示描述与“zer”和“123”匹配或值与“zer”和“123”匹配的所有记录。
我们迄今为止所做的:
有一个选项,用户可以签入/ checkout 是否要搜索描述。我们大多建议他们只搜索值,只在需要时使用描述。
对于一个搜索查询,我们对数据库执行多个搜索线程,因为一次搜索所有文档会花费太多时间。
前一段时间,在我们以前的慢速数据库引擎上,我的一个同事制作了“搜索表”,基本上这是一个表,它包含表id上的所有值,因此在搜索时不需要sql查询中的任何连接。看起来是这样的:
表d
表a id
值(此表a id的表b中的所有值,用“”分隔)
description(表a id的最新版本的描述)
示例记录:

- 1
- ZER 123 CLIENT NAME NUMBER 7856 jsdfjklf 4556423
- DESCRIPTION CAN BE VERY LONG.

如果客户搜索“zer 123”,则变为:“从表\u d中选择表\u a \u id,其中的值为“%zer%”,值为“%123%””
重要提示:我们的一些客户在表a中有很多记录+5.000.000,这意味着表b中有大量记录(+/-50.000.000)。我们的大多数客户在表a中有30万到50万条记录。
我的问题:
有没有比搜索表更好/更快的方法来搜索所有的值?如果没有search表,我将不得不为customer的search参数中的每个“”创建一个join,如果他们在表a中有大量记录,那么这将工作得太慢(我想?)。例如:
从表\u a.id=sub1.table\u a\u id和sub1.value(如“%zer%”)的表\u a.id=sub2.table\u a\u id和sub2.value(如“%123%”)的表\u b sub2中选择id
我看了一下pgsql中的全文搜索。我想我不能用它,因为你不能像(‘contains’)那样使用它?
是否有任何索引可以用于值(文件b或搜索文件)和描述(文件c或搜索文件)以加快搜索速度?我已经读过了,但我不认为有什么,因为在用“比如“%zer%”搜索时不使用索引?
我希望我已经解释清楚了。提前谢谢!

yvt65v4c

yvt65v4c1#

你的术语很混乱,但我想你写“文件”时是指“表”。
不能用一个查询在多个表中进行合理的搜索,但可以同时在一个表的多个列中进行搜索。
根据您的描述,我想说您需要一个关于表中相关字符串列的串联的三角索引。

相关问题