微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

提取接近关键字的 PostgreSQL 文本数据

如何解决提取接近关键字的 PostgreSQL 文本数据

我正在开发一个将文本日志写入 Postgresql 12 中的文本列的系统。我想对关键字执行简单搜索(这部分很简单!),但是我只想提取文本的一部分出现在定位的搜索关键字附近的内容(以提供上下文)。

日志包含由回车分隔的行。假设我想搜索关键字“异常”并返回包含该关键字的文本列中的每一行。或者,也许我想返回带有关键字的行以及之前的行和之后的行。

这是否可以单独使用 Postgresql 查询功能?或者我是否需要编写其他自定义代码提取我感兴趣的行。(顺便说一句,我目前不使用 tsvector 功能。)

任何帮助将不胜感激。谢谢!


[已编辑以提供更多详细信息。]

假设我有一个名为 LOG_RECORDS 的表,其中包含一个名为 LOG_CONTENT 的 TEXT 列。该表的某一行在 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%';

但我只想返回以下内容(表示包含关键字“异常”的行加上前后行),而不是整个 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'

DEMO

在这种情况下,AFAIK 使用 Full text search 也是不可能的,因为您的日志不包含 Exception 作为单独的词或词的前缀。它作为词的后缀或中间出现,ts_query 仅支持全文搜索或前缀搜索。

还要在你的列上添加 GIN 索引以加快搜索速度

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?