提取接近关键字的 PostgreSQL 文本数据
Extract PostgreSQL text data proximate to keyword
我正在开发一个将文本日志写入 PostgreSQL 12 文本列的系统。我想对关键字执行简单搜索(这部分很简单!),但我只想提取一部分显示在找到的搜索关键字附近的文本内容(以提供上下文)。
日志包含由回车符 return 分隔的行。假设我想搜索关键字“exception”并返回包含该关键字的文本列中的每一行。或者,也许我想 return 带有关键字的行以及之前的行和之后的行。
是否可以单独使用 PostgreSQL 查询功能?或者我是否需要编写其他自定义代码来提取我感兴趣的行。(顺便说一句,我目前不使用 tsvector 功能。)
如有任何帮助,我们将不胜感激。谢谢!
[编辑以提供更多详细信息。]
假设我有一个名为 LOG_RECORDS 的 table,其中包含一个名为 LOG_CONTENT 的 TEXT 列。此 table 的特定行在 LOG_CONTENT 中包含以下内容:
2021-05-28 13:34:20.6101-04 - Loading Configurations
2021-05-28 13:34:31.6656-04 - Settings Initialization Complete: Test Device Configuration
2021-05-28 13:34:31.6656-04 - RecordWriter:Initialize
2021-05-28 13:34:32.3982-04 - Migrating configuration database data from schema version 21 to 21
2021-05-28 13:34:32.4590-04 - Add User successful: Export
2021-05-28 13:34:44.6605-04 - SerialConnectionManagedReadBufferBase - ReadTask - System.InvalidOperationException: The operation is not allowed on non-connected sockets.
at InTheHand.Net.Bluetooth.Msft.SocketBluetoothClient.GetStream()
at Sensus.CommunicationDevices.SerialConnections.SerialConnectionBT.ReadInternal(Byte[] buffer, Int32 maxBytes)
at Sensus.CommunicationDevices.SerialConnections.SerialConnectionManagedReadBufferBase.ReadTask()
2021-05-28 13:34:47.1807-04 - Communicator connection failed
2021-05-28 13:37:36.5337-04 - Linking
2021-05-28 13:37:37.2534-04 - Operation complete
要搜索关键字“例外”,我可以简单地查询以下内容:
SELECT * FROM LOG_RECORDS WHERE UPPER(LOG_CONTENT) LIKE '%EXCEPTION%';
但我只想返回以下内容(表示包含关键字“exception”的行加上前后的行),而不是整个 TEXT 值:
2021-05-28 13:34:32.4590-04 - Add User successful: Export
2021-05-28 13:34:44.6605-04 - SerialConnectionManagedReadBufferBase - ReadTask - System.InvalidOperationException: The operation is not allowed on non-connected sockets.
at InTheHand.Net.Bluetooth.Msft.SocketBluetoothClient.GetStream()
如果这太具有挑战性,只需返回带有关键字的行就可以了:
2021-05-28 13:34:44.6605-04 - SerialConnectionManagedReadBufferBase - ReadTask - System.InvalidOperationException: The operation is not allowed on non-connected sockets.
希望这是有道理的。谢谢!
这是一个解决方案,但不是很高效:
select t.id, t2.arr || E'\n' ||t1.arr from log_records t
cross join lateral unnest(string_to_array(log_content,E'\n')) with ordinality t1(arr,e)
join lateral unnest(string_to_array(log_content,E'\n')) with ordinality t2(arr,e) on t1.e=t2.e+1
where t1.arr ~ 'Exception'
and t.log_content ~ 'Exception'
此外,AFAIK 在这种情况下无法使用 Full text search
,因为您的日志不包含 Exception
作为单独的词或词的前缀。它作为单词的后缀或中间出现,ts_query
仅支持全文搜索或前缀搜索。
同时在您的列上添加 GIN
索引以加快搜索速度
我正在开发一个将文本日志写入 PostgreSQL 12 文本列的系统。我想对关键字执行简单搜索(这部分很简单!),但我只想提取一部分显示在找到的搜索关键字附近的文本内容(以提供上下文)。
日志包含由回车符 return 分隔的行。假设我想搜索关键字“exception”并返回包含该关键字的文本列中的每一行。或者,也许我想 return 带有关键字的行以及之前的行和之后的行。
是否可以单独使用 PostgreSQL 查询功能?或者我是否需要编写其他自定义代码来提取我感兴趣的行。(顺便说一句,我目前不使用 tsvector 功能。)
如有任何帮助,我们将不胜感激。谢谢!
[编辑以提供更多详细信息。]
假设我有一个名为 LOG_RECORDS 的 table,其中包含一个名为 LOG_CONTENT 的 TEXT 列。此 table 的特定行在 LOG_CONTENT 中包含以下内容:
2021-05-28 13:34:20.6101-04 - Loading Configurations
2021-05-28 13:34:31.6656-04 - Settings Initialization Complete: Test Device Configuration
2021-05-28 13:34:31.6656-04 - RecordWriter:Initialize
2021-05-28 13:34:32.3982-04 - Migrating configuration database data from schema version 21 to 21
2021-05-28 13:34:32.4590-04 - Add User successful: Export
2021-05-28 13:34:44.6605-04 - SerialConnectionManagedReadBufferBase - ReadTask - System.InvalidOperationException: The operation is not allowed on non-connected sockets.
at InTheHand.Net.Bluetooth.Msft.SocketBluetoothClient.GetStream()
at Sensus.CommunicationDevices.SerialConnections.SerialConnectionBT.ReadInternal(Byte[] buffer, Int32 maxBytes)
at Sensus.CommunicationDevices.SerialConnections.SerialConnectionManagedReadBufferBase.ReadTask()
2021-05-28 13:34:47.1807-04 - Communicator connection failed
2021-05-28 13:37:36.5337-04 - Linking
2021-05-28 13:37:37.2534-04 - Operation complete
要搜索关键字“例外”,我可以简单地查询以下内容:
SELECT * FROM LOG_RECORDS WHERE UPPER(LOG_CONTENT) LIKE '%EXCEPTION%';
但我只想返回以下内容(表示包含关键字“exception”的行加上前后的行),而不是整个 TEXT 值:
2021-05-28 13:34:32.4590-04 - Add User successful: Export
2021-05-28 13:34:44.6605-04 - SerialConnectionManagedReadBufferBase - ReadTask - System.InvalidOperationException: The operation is not allowed on non-connected sockets.
at InTheHand.Net.Bluetooth.Msft.SocketBluetoothClient.GetStream()
如果这太具有挑战性,只需返回带有关键字的行就可以了:
2021-05-28 13:34:44.6605-04 - SerialConnectionManagedReadBufferBase - ReadTask - System.InvalidOperationException: The operation is not allowed on non-connected sockets.
希望这是有道理的。谢谢!
这是一个解决方案,但不是很高效:
select t.id, t2.arr || E'\n' ||t1.arr from log_records t
cross join lateral unnest(string_to_array(log_content,E'\n')) with ordinality t1(arr,e)
join lateral unnest(string_to_array(log_content,E'\n')) with ordinality t2(arr,e) on t1.e=t2.e+1
where t1.arr ~ 'Exception'
and t.log_content ~ 'Exception'
此外,AFAIK 在这种情况下无法使用 Full text search
,因为您的日志不包含 Exception
作为单独的词或词的前缀。它作为单词的后缀或中间出现,ts_query
仅支持全文搜索或前缀搜索。
同时在您的列上添加 GIN
索引以加快搜索速度