检查大型数据集的子字符串

时间:2017-03-12 20:21:54

标签: java cassandra substring cassandra-3.0

我有:

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

我需要:

  • 检查指定列是否包含关键字
  • 汇总列
  • 中包含关键字的行数

我应该选择哪种方法?

方法1(二级指标):

  • 创建辅助SASI index on the table
  • 查找给定关键字的匹配项"在飞行中"随时
  • 然而,我很害怕
    • cappacity问题 - 二级索引会消耗额外的空间,而对于这样大的表来说,它可能会太多
    • 性能 - 我不确定在合理的时间内是否可以在数百万行中找到关键字

方法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中的墓碑

1 个答案:

答案 0 :(得分:2)

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

修改

使用Cassandra,您可以将结果查询请求为JSON,并使用Elasticsearch&#39;说&#39;仅在JSON中,因此您可以非常轻松地传输数据。

Elasticsearch

SolR