优化 PGSQL SQL 大文本搜索查询('like',全文搜索,...)
optimizing PGSQL SQL search queries on big texts ('like', full text search, ... )
我们有超过 200 位客户使用的软件解决方案。我们最近切换到 pgsql,因为我们以前的数据库在处理客户使用的搜索查询时速度太慢。
我们的数据库如下所示:
TABLE一个
1. ID
(+ some other fields which aren't important here)
TABLE B
这个table是用来在tableA的物品上储存'data'的。这对每个客户来说都是不同的。例如 'Type' 可以是 'CLIENTNAME' 和值 'AZERTY'。 TABLE A 上的一条记录可以在 TABLE B 中有无限条记录。通常 Table A 中的 1 条记录在 Table B 上有 5 - 10 条记录。
1. ID TABLE A
2. TYPE
3. VALUE
TABLE C
1. TABLE A ID
2. VERSIONNR
3. DESCRIPTION
这个文件有不同版本的TABLEA记录。每个版本都有一个扩展描述。这可以从 0 个字符到无限。
我们的问题:我们的客户习惯于 'google-like' 搜索。例如:他们键入 'AZERTY',我们显示来自 TABLE A 的所有记录,其中 TABLE A 的 ID:
- 'AZERTY'在最新版本的描述里TABLEC
- 'AZERTY' 是 TABLE B
的值之一
其他问题:此搜索是 'contains'。如果他们搜索 'ZER',他们也应该找到其中包含 'AZERTY' 的记录。多个参数是一个 'AND',如果它们搜索 'ZER 123',我们需要显示描述匹配 'ZER' 和 '123' 或值匹配 'ZER' 和 ' 123'.
到目前为止我们做了什么:
- 用户可以选择 in/out 是否要搜索描述。我们通常建议他们只搜索值,只在需要时使用描述。
- 我们为一个搜索查询创建了多个数据库搜索线程,因为一次搜索所有文档会花费太多时间。
- 前段时间,在我们以前的慢速数据库引擎上,我的一个同事制作了 'search tables',基本上这是一个 table,其中包含一个 TABLE ID 上的所有值,所以搜索时不需要在 SQL 查询中加入任何内容。它看起来像这样:
TABLED
- TABLE一个ID
- VALUES(此 TABLE A ID 来自 TABLE B 的所有值,以 ' ' 分隔)
- DESCRIPTION(此 TABLE A ID 的最新版本的描述)
示例记录:
- 1
- ZER 123 CLIENT NAME NUMBER 7856 jsdfjklf 4556423
- DESCRIPTION CAN BE VERY LONG.
如果客户搜索 'ZER 123',这将变为:
"select TABLE_A_ID from TABLE_D where values like '%ZER%' and values like '%123%'"
重要:
我们的一些客户在 TABLE A.+5.000.000 中有很多记录,这意味着在 TABLE B (+/- 50.000.000) 中有很多记录。我们的大多数客户在 TABLE A 中拥有 300.000 到 500.000 条记录。
我的问题:
是否有比搜索 table 更好/更快的方法来搜索所有值?如果没有搜索 table,我将不得不为客户的搜索参数中的每个 ' ' 进行连接,如果他们在 TABLE A 中有很多记录,这将工作太慢(我认为?) . 例如:
select ID 来自 TABLE_A
INNER JOIN TABLE_B Sub1 ON TABLE_A.ID = Sub1.TABLE_A_ID and Sub1.VALUE like '%ZER%'
INNER JOIN TABLE_B Sub2 on FILE_A.ID = Sub2.TABLE_A_ID and Sub2.VALUE like '%123%'
PGSQL里面的全文搜索我看过了。我不认为我可以使用它,因为你不能像这样使用它 (= 'contains') ?
- 我可以在值(FILE B 或搜索文件)和描述(FILE C 或搜索文件)上使用任何索引来加快搜索速度吗?我读过它但我认为没有,因为使用 "like '%ZER%'" ?
搜索时不使用索引
我希望我已经解释清楚了。
提前致谢!
您的术语令人困惑,但我假设您在写 "files" 时指的是 "tables"。
您无法通过单个查询在多个 table 中进行合理搜索,但您可以同时在单个 table 的多个列中进行搜索。
根据您的描述,我会说您需要 trigram index 连接 table 中的相关字符串列。
我们有超过 200 位客户使用的软件解决方案。我们最近切换到 pgsql,因为我们以前的数据库在处理客户使用的搜索查询时速度太慢。
我们的数据库如下所示:
TABLE一个
1. ID
(+ some other fields which aren't important here)
TABLE B
这个table是用来在tableA的物品上储存'data'的。这对每个客户来说都是不同的。例如 'Type' 可以是 'CLIENTNAME' 和值 'AZERTY'。 TABLE A 上的一条记录可以在 TABLE B 中有无限条记录。通常 Table A 中的 1 条记录在 Table B 上有 5 - 10 条记录。
1. ID TABLE A
2. TYPE
3. VALUE
TABLE C
1. TABLE A ID
2. VERSIONNR
3. DESCRIPTION
这个文件有不同版本的TABLEA记录。每个版本都有一个扩展描述。这可以从 0 个字符到无限。
我们的问题:我们的客户习惯于 'google-like' 搜索。例如:他们键入 'AZERTY',我们显示来自 TABLE A 的所有记录,其中 TABLE A 的 ID:
- 'AZERTY'在最新版本的描述里TABLEC
- 'AZERTY' 是 TABLE B 的值之一
其他问题:此搜索是 'contains'。如果他们搜索 'ZER',他们也应该找到其中包含 'AZERTY' 的记录。多个参数是一个 'AND',如果它们搜索 'ZER 123',我们需要显示描述匹配 'ZER' 和 '123' 或值匹配 'ZER' 和 ' 123'.
到目前为止我们做了什么:
- 用户可以选择 in/out 是否要搜索描述。我们通常建议他们只搜索值,只在需要时使用描述。
- 我们为一个搜索查询创建了多个数据库搜索线程,因为一次搜索所有文档会花费太多时间。
- 前段时间,在我们以前的慢速数据库引擎上,我的一个同事制作了 'search tables',基本上这是一个 table,其中包含一个 TABLE ID 上的所有值,所以搜索时不需要在 SQL 查询中加入任何内容。它看起来像这样:
TABLED
- TABLE一个ID
- VALUES(此 TABLE A ID 来自 TABLE B 的所有值,以 ' ' 分隔)
- DESCRIPTION(此 TABLE A ID 的最新版本的描述)
示例记录:
- 1
- ZER 123 CLIENT NAME NUMBER 7856 jsdfjklf 4556423
- DESCRIPTION CAN BE VERY LONG.
如果客户搜索 'ZER 123',这将变为: "select TABLE_A_ID from TABLE_D where values like '%ZER%' and values like '%123%'"
重要: 我们的一些客户在 TABLE A.+5.000.000 中有很多记录,这意味着在 TABLE B (+/- 50.000.000) 中有很多记录。我们的大多数客户在 TABLE A 中拥有 300.000 到 500.000 条记录。
我的问题:
是否有比搜索 table 更好/更快的方法来搜索所有值?如果没有搜索 table,我将不得不为客户的搜索参数中的每个 ' ' 进行连接,如果他们在 TABLE A 中有很多记录,这将工作太慢(我认为?) . 例如:
select ID 来自 TABLE_A INNER JOIN TABLE_B Sub1 ON TABLE_A.ID = Sub1.TABLE_A_ID and Sub1.VALUE like '%ZER%' INNER JOIN TABLE_B Sub2 on FILE_A.ID = Sub2.TABLE_A_ID and Sub2.VALUE like '%123%'
PGSQL里面的全文搜索我看过了。我不认为我可以使用它,因为你不能像这样使用它 (= 'contains') ?
- 我可以在值(FILE B 或搜索文件)和描述(FILE C 或搜索文件)上使用任何索引来加快搜索速度吗?我读过它但我认为没有,因为使用 "like '%ZER%'" ? 搜索时不使用索引
我希望我已经解释清楚了。 提前致谢!
您的术语令人困惑,但我假设您在写 "files" 时指的是 "tables"。
您无法通过单个查询在多个 table 中进行合理搜索,但您可以同时在单个 table 的多个列中进行搜索。
根据您的描述,我会说您需要 trigram index 连接 table 中的相关字符串列。