Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对于大型数据集,有效地检查子字符串_Java_Cassandra_Substring_Cassandra 3.0 - Fatal编程技术网

Java 对于大型数据集,有效地检查子字符串

Java 对于大型数据集,有效地检查子字符串,java,cassandra,substring,cassandra-3.0,Java,Cassandra,Substring,Cassandra 3.0,我有: 具有400000行的数据库表(Cassandra 3) 大约10000个关键字的列表 预计这两个数据集将随着时间的推移而增长 我需要: 检查指定列是否包含关键字 求和列中包含关键字的行数 我应该选择哪种方法 方法1(二级索引): 创建二级 随时查找给定关键字“动态”的匹配项 然而,我害怕 capcapacity问题-二级索引可能会占用额外的空间,对于如此大的表来说可能会太多 性能-我不确定是否可以在合理的时间内找到数亿行中的关键字 方法2(Java作业-暴力): 连续迭

我有:

  • 具有400000行的数据库表(Cassandra 3)
  • 大约10000个关键字的列表
  • 预计这两个数据集将随着时间的推移而增长
我需要:

  • 检查指定列是否包含关键字
  • 求和列中包含关键字的行数
我应该选择哪种方法

方法1(二级索引):

  • 创建二级
  • 随时查找给定关键字“动态”的匹配项
  • 然而,我害怕
    • capcapacity问题-二级索引可能会占用额外的空间,对于如此大的表来说可能会太多
    • 性能-我不确定是否可以在合理的时间内找到数亿行中的关键字
方法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);
    
    //通过数据分页。。。
    字符串页=null;
    做{
    PagingState state=page==null?null:PagingState.fromString(第页);
    PagedResult res=getDataPaged(查询、状态、页面大小、状态);
    //遍历当前页面。。。
    对于(DataRow行:res.getResult()){
    //跳过空标题
    if(row.getTitle().length()==0){
    继续;
    }
    //在标题中查找匹配项
    for(字符串k:关键字){
    if(k.length()>row.getTitle().length()){
    继续;
    }
    if(row.getTitle().toLowerCase().contains(k.toLowerCase()){
    //TODO:保存匹配
    打破
    }
    }
    }
    status=res.getResult();
    page=res.getPage();
    //TODO:在此处等待以减少数据库负载
    }while(page!=null);
    
  • 问题

    • 遍历整个表可能非常慢,如果每1000行等待一秒钟,那么这个循环将在4.6天内完成
    • 这将需要额外的缓存空间;此外,频繁地从缓存中删除将在Cassandra中生成墓碑

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

编辑:

使用Cassandra,您可以将结果查询作为JSON请求,而Elasticsearch只使用JSON“说话”,因此您可以非常轻松地传输数据


如何运行选项2一次并创建缓存(可以是外部资源),对于将来的更新,使用过滤机制在存储数据后更新缓存谢谢,您能否更具体地说明“轻松地将数据从cassandra转储到Elasticsearch”?