gpt4 book ai didi

java - 有效地检查大型数据集的子字符串

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:12:09 24 4
gpt4 key购买 nike

我有:

  • 具有 400 000 000 行的数据库表 (Cassandra 3)
  • 大约 10 000 个关键字的列表
  • 预计两个数据集都会及时增长

我需要:

  • 检查指定列是否包含关键字
  • 求和列中有多少行包含该关键字

我应该选择哪种方法?

方法 1(二级索引):

  • 创建辅助 SASI index on the table
  • 随时查找给定关键字“on fly”的匹配项
  • 但是,我害怕
    • 容量问题 - 二级索引会消耗额外的空间,对于这么大的表来说,它可能太多了
    • 性能 - 我不确定是否可以在合理的时间内在数亿行中找到关键字

方法 2(Java 作业 - 蛮力):

  • 不断迭代数据的 Java 作业
  • 匹配保存到缓存中
  • 缓存在下一次​​迭代中更新

    // Paginate throuh data...
    String page = null;
    do {
    PagingState state = page == null ? null : PagingState.fromString(page);
    PagedResult<DataRow> res = getDataPaged(query, status, PAGE_SIZE, state);

    // Iterate through the current page ...
    for (DataRow row : res.getResult()) {

    // Skip empty titles
    if (row.getTitle().length() == 0) {
    continue;
    }

    // Find match in title
    for (String k : keywords) {
    if (k.length() > row.getTitle().length()) {
    continue;
    }
    if (row.getTitle().toLowerCase().contains(k.toLowerCase()) {
    // TODO: SAVE match
    break;
    }
    }
    }

    status = res.getResult();
    page = res.getPage();

    // TODO: Wait here to reduce DB load

    } while (page != null);
  • 问题

    • 遍历整个表格可能会很慢。如果我每 1000 行等待一秒钟,那么这个周期将在 4.6 天内完成
    • 这需要额外的缓存空间;此外,频繁从缓存中删除会在 Cassandra 中产生墓碑

最佳答案

更好的方法是使用搜索引擎,例如 SolR 我们的 ElasticSearch。全文搜索是他们的专长。您可以轻松地将数据从 cassandra 转储到 Elasticsearch,并在 ElasticSearch 之上实现您的 Java 作业。

编辑:

借助 Cassandra,您可以将结果查询请求为 JSON,而 Elasticsearch 仅以 JSON“说话”,因此您将能够非常轻松地传输数据。

Elasticsearch

SolR

关于java - 有效地检查大型数据集的子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42752647/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com