HSQLDB 文本搜索性能

Posted

技术标签:

【中文标题】HSQLDB 文本搜索性能【英文标题】:HSQLDB text search performance 【发布时间】:2016-06-10 02:59:59 【问题描述】:

我在运行简单搜索时表现不佳(约 20-30 秒):

select Text from Library where REGEXP_MATCHES(Text, '.*abc.*')
select Text from Library where Text LIKE '%abc%'

这是我的桌子的描述:

从库中选择计数 (*) = 1 628 062 从库中选择 AVG(LENGTH(Text)) = 766 个字符 Library.script 文件为 2.5GB 文本字段已编入索引 我已经完成了 SHUTDOWN COMPACT; 库是一个“内存”表

有些事情可能不正常:

我没有此 DB 的 Library.data 或 .data 文件

对于如何使这种查询更快,我已经没有什么想法了。

有什么建议吗?

【问题讨论】:

这些查询都不能使用索引(除了 Postgres 之外,几乎所有其他 DBMS 也是如此)。但是对 160 万行的完整扫描也不应该花费 30 秒。但我不认为你可以在 HSQLDB 中做任何事情来加速这些查询。 【参考方案1】:

以最简单的形式编写查询。

select text from library where position('abc' in text) > 0

我检查了一下,这在 150 万行中大约需要一秒钟(但平均长度更短)。它应该比你尝试的要少。

【讨论】:

感谢 fredt,它确实比 like 和 regexp 快。但是,它不像 like 或 regexp 那样通用。当然,我们可以在子查询中使用位置作为一级过滤器,在主查询中使用正则表达式作为二级过滤器。你有别的看法吗? 除了你描述的以外没有别的办法。如果您使用 POSITION(...) > 0 AND REGXP_MATCHES(...) 它也可能有效,因为它通常按给定顺序应用过滤器。 是的,其中 POSITION('...' IN ...)>0 和 REGEXP_MATCHES(..., '.*') 提供了最佳性能,可能是最优雅的解决方案:~ 1.5秒

以上是关于HSQLDB 文本搜索性能的主要内容,如果未能解决你的问题,请参考以下文章

如何在 hsqldb 数据库中存储文本和二进制文件?

HSQLDB 结果集 - 如何获取没有引号的 HSQLDB 返回空间作为空格且不为空?

ElasticStack系列之十七 & 大文本搜索性能提升方案

使用脚本创建表和插入数据未找到 HSQLDB 表

仅使用填充的文本框执行搜索

lucene 中的高光性能非常慢