热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Solr+Hbase多条件查(优劣互补)

为什么要使用solr+hbase组合:某电信项目中采用HBase来存储用户终端明细数据,供前台页面即时查询。HBase无可置疑拥有其优势,但其本身只对rowkey支持毫秒级的快速检索,对于多

为什么要使用solr+hbase组合:

某电信项目中采用HBase来存储用户终端明细数据,供前台页面即时查询。HBase无可置疑拥有其优势,但其本身只对rowkey支持毫秒级的快速检索,对于多字段的组合查询却无能为力。针对HBase的多条件查询也有多种方案,但是这些方案要么太复杂,要么效率太低,本文只对基于Solr的HBase多条件查询方案进行测试和验证。

solr+habse组合的原理:

基于Solr的HBase多条件查询原理很简单,将HBase表中涉及条件过滤的字段和rowkey在Solr中建立索引,通过Solr的多条件查询快速获得符合过滤条件的rowkey值,拿到这些rowkey之后在HBASE中通过指定rowkey进行查询。

环境

1.              已搭建好的hadoop集群,3节点hadoop测试集群(见文档hadoop2.5完全分布式集群搭建)

2.              hadoop集群之上搭建hbase集群(文档中hadoop2.5分布式中已包含)

3.              已搭建好的solrcloud集群,3节点solrcloud集群(见文档solrcloud分布式集群)

4.              oracle中导入数据到hbase中(可以通过普通java代码或mapreduce,也可以直接使用工具sqoop

5.              使用sqooporacle中的数据导入hbase

sqoop实现数据从oracle导入hdfs(hbase)

 

sqoop import --append --connect jdbc:oracle:thin:@192.168.0.20:1521:orcl --username yqdev --password yq --m 1 --table c_text --columns id,url,title --hbase-create-table --hbase-table c_text --hbase-row-key id --column-family textinfo


 

注:需要在hbase中先创建c_text表,创建列族textinfo;我只导入了id,url,title三列,其中idrowkey.

6.              创建索引

hbase中读取数据,将需要用作查询字段添加索引到solr中(例如title

    

  /**

* create solrIndex

*

* @throws IOException

* @throws SolrServerException

*/

public static void addIndex() throws IOException, SolrServerException {

// hbase

Scan scan = new Scan();

scan.addFamily(Bytes.toBytes(FAMILY_NAME));

// scan.setCaching(500);

scan.setCacheBlocks(false);

ResultScanner rs = table.getScanner(scan);



System.out.println("start......");

Collection docs = new ArrayList();

Long totalCount = 0l;

for (Result r : rs) {

SolrInputDocument doc = new SolrInputDocument();

doc.addField("id", new String(r.getRow()));

for (KeyValue kv : r.raw()) {

String fieldName = new String(kv.getQualifier());

String fieldValue = new String(kv.getValue());

if (fieldName.equalsIgnoreCase("id")

|| fieldName.equalsIgnoreCase("title")

|| fieldName.equalsIgnoreCase("url")) {

doc.addField(fieldName, fieldValue);

}

docs.add(doc);

}

if (docs.size() >= 1000) {

cloudSolrServer.add(docs);

cloudSolrServer.commit();

totalCount = totalCount + docs.size();

docs = new ArrayList();

System.out.println("already deal with : " + totalCount);

}

}

}



 

7.              查询测试

     

 /**

* 1.query solrIndex pass some condition 2.query data from hbase pass rowkey

*

* @throws IOException

* @throws SolrServerException

*/

public static void query() throws IOException, SolrServerException {

Get get = null;

List list = new ArrayList();

SolrQuery query = new SolrQuery("title:基金");

query.setStart(0);

query.setRows(40);

QueryResponse respOnse= cloudSolrServer.query(query);

SolrDocumentList docs = response.getResults();

System.out.println("total:" + docs.getNumFound());

System.out.println("query time:" + response.getQTime());

//get rowkey from solr

for (SolrDocument doc : docs) {

get = new Get(Bytes.toBytes((String) doc.getFieldValue("id")));

list.add(get);

}

//order rowkey query data from hbase

for (Get gt : list) {

Result result = table.get(gt);

byte[] value = result.getValue("textinfo".getBytes(),

"title".getBytes());

System.out.println("title------- \t" + new String(value));

}

}




hbase+solr多条件查询的设计方案:

(利用hbase的大数据存储和solr的强大的索引,达到互补的效果)

基于SolrHBase多条件查询原理很简单,将HBase表中涉及条件过滤的字段和rowkeySolr中建立索引,通过Solr的多条件查询快速获得符合过滤条件的rowkey值,拿到这些rowkey之后在HBASE中通过指定rowkey进行查询。

 

参考:http://www.cnblogs.com/chenz/articles/3229997.html


推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
author-avatar
戴安娜DianaKok
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有