通过大型文档更快地搜索子字符串

问题描述 投票:0回答:2

我有一个用英语+其他语言编写的超过100万条记录的csv文件。我必须创建一个获取关键字的UI,在文档中进行搜索,并返回该键出现的记录。我只在两列中查找密钥。

这是我的实现方式:

[首先,我为存储在CSV文件中的数据创建了一个postgres数据库。然后制作了一个经典网站,用户可以在其中输入关键字。这是我使用的SQL查询(在春季启动中)

SELECT * FROM table WHERE col1 LIKE %:keyword% OR col2 LIKE %:keyword%;

目前,它的工作情况非常好,但是我想知道如何加快搜索速度?使用SQL代替经典文档搜索更好吗?

spring database postgresql search
2个回答
1
投票

对于LIKE查询,您应该使用gin_trgm_ops运算符类查看pg_trgm索引类型。您根本不需要更改查询,只需在每列上建立索引。或者,也许是一个多列索引。


0
投票

如果只搜索一次文档并将其丢弃,则将其加载到数据库中会产生开销。而是可以使用nio并行搜索功能直接搜索文件,该功能使用多个线程来并行搜索文件:

    List<Record> result = Files.lines("some/path")
            .parallel()
            .unordered()
            .map(l -> lineToRecord(l))
            .filter(r -> r.getCol1().contains(keyword) || r.getCol2().contains(keyword))
            .collect(Collectors.toList());

注意:需要提供lineToRecord()方法和Record类。

如果要一遍又一遍地搜索文档,那么可以考虑为该文档建立索引。这意味着预处理文档以适合搜索要求。在这种情况下,它是col1和col2的关键字。索引就像Java中的地图,例如:

Map<String, Record> col1Index

但是由于您具有“ LIKE”语义,所以这样做不那么容易,因为它不像用空格分隔字符串那样简单,因为关键字可以匹配子字符串。因此,在这种情况下,最好寻找一些工具来提供帮助。通常,这类似于solr / lucene。

数据库还可以提供类似的功能,例如:https://www.postgresql.org/docs/current/pgtrgm.html

© www.soinside.com 2019 - 2024. All rights reserved.