﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-paulwong-随笔分类-SOLR/LUCENCE</title><link>http://www.blogjava.net/paulwong/category/54077.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 05 Dec 2014 00:58:43 GMT</lastBuildDate><pubDate>Fri, 05 Dec 2014 00:58:43 GMT</pubDate><ttl>60</ttl><item><title>基于Solr的HBase多条件查询测试</title><link>http://www.blogjava.net/paulwong/archive/2014/12/04/421052.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 04 Dec 2014 11:02:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2014/12/04/421052.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/421052.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2014/12/04/421052.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/421052.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/421052.html</trackback:ping><description><![CDATA[<h2>背景：</h2><p style="padding: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 25px; color: #333333; font-stretch: normal; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">某电信项目中采用HBase来存储用户终端明细数据，供前台页面即时查询。HBase无可置疑拥有其优势，但其本身只对rowkey支持毫秒级的快速检索，对于多字段的组合查询却无能为力。针对HBase的多条件查询也有多种方案，但是这些方案要么太复杂，要么效率太低，本文只对基于Solr的HBase多条件查询方案进行测试和验证。</p><h2>原理：</h2><p style="padding: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 25px; color: #333333; font-stretch: normal; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">基于Solr的HBase多条件查询原理很简单，将HBase表中涉及条件过滤的字段和rowkey在Solr中建立索引，通过Solr的多条件查询快速获得符合过滤条件的rowkey值，拿到这些rowkey之后在HBASE中通过指定rowkey进行查询。</p><p style="padding: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 25px; color: #333333; font-stretch: normal; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;"><a href="http://static.oschina.net/uploads/img/201412/04175006_BbOr.png" target="_blank" style="padding: 0px; margin: 0px; color: #ff8373; outline: 0px; font-size: 12px;"><img alt="" src="http://static.oschina.net/uploads/img/201412/04175006_BbOr.png" style="padding: 5px; margin: 10px 0px; border: 1px solid #dddddd; max-width: 640px; cursor: pointer; background: #f4f7f9;" /></a></p><h2>测试环境：</h2><p style="padding: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 25px; color: #333333; font-stretch: normal; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">solr 4.0.0版本，使用其自带的jetty服务端容器，单节点；</p><p style="padding: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 25px; color: #333333; font-stretch: normal; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">hbase-0.94.2-cdh4.2.1，10台Lunux服务器组成的HBase集群。</p><p style="padding: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 25px; color: #333333; font-stretch: normal; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">HBase中2512万条数据172个字段；</p><p style="padding: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 25px; color: #333333; font-stretch: normal; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">Solr索引HBase中的100万条数据；</p><h2>测试结果：</h2><p style="padding: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 25px; color: #333333; font-stretch: normal; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">1、100万条数据在Solr中对8个字段建立索引。在Solr中最多8个过滤条件获取51316条数据的rowkey值，基本在57-80毫秒。根据Solr返回的rowkey值在HBase表中获取所有51316条数据12个字段值，耗时基本在15秒；</p><p style="padding: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 25px; color: #333333; font-stretch: normal; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">2、数据量同上，过滤条件同上，采用Solr分页查询，每次获取20条数据，Solr获得20个rowkey值耗时4-10毫秒，拿到Solr传入的rowkey值在HBase中获取对应20条12个字段的数据，耗时6毫秒。</p><h2>以下列出测试环境的搭建、以及相关代码实现过程。</h2><h3>一、Solr环境的搭建</h3><p style="padding: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 25px; color: #333333; font-stretch: normal; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">因为初衷只是测试Solr的使用，Solr的运行环境也只是用了其自带的jetty，而非大多人用的Tomcat；没有搭建Solr集群，只是一个单一的Solr服务端，也没有任何参数调优。</p><p style="padding: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 25px; color: #333333; font-stretch: normal; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">1）在<span style="padding: 0px; margin: 0px; line-height: 1.8;">Apache网站上下载Solr 4：<a href="http://lucene.apache.org/solr/downloads.html" rel="nofollow" style="padding: 0px; margin: 0px; color: #ff8373; outline: 0px; font-size: 12px;">http://lucene.apache.org/solr/downloads.html</a>，我们这里下载的是&#8220;<span style="padding: 0px; margin: 0px; line-height: 1.8;">apache-solr-4.0.0.tgz&#8221;；</span></span></p><p style="padding: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 25px; color: #333333; font-stretch: normal; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; line-height: 1.8;">2）在当前目录解压Solr压缩包：</span></p><pre style="padding: 5px; margin-top: 10px; margin-bottom: 10px; margin-left: 20px; line-height: 18px; font-size: 9pt; font-family: 'Courier New', Arial; border-width: 1px 1px 1px 5px; border-style: solid; border-color: #dddddd #dddddd #dddddd #6ce26c; color: #333333; background: #f6f6f6;">&nbsp;-xvzf&nbsp;apache-solr-..tgz</pre><p style="padding: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 25px; color: #333333; font-stretch: normal; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">3）修改Solr的配置文件schema.xml，添加我们需要索引的多个字段（配置文件位于&#8220;/opt/apache-solr-4.0.0/example/solr/collection1/conf/&#8221;）</p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: Verdana, sans-serif, 宋体; background-color: #ffffff;"></p><pre style="padding: 5px; margin-top: 10px; margin-bottom: 10px; margin-left: 20px; line-height: 18px; font-size: 9pt; font-family: 'Courier New', Arial; border-width: 1px 1px 1px 5px; border-style: solid; border-color: #dddddd #dddddd #dddddd #6ce26c; color: #333333; background: #f6f6f6;">&nbsp;&nbsp;&nbsp;&lt;field&nbsp;name="rowkey"&nbsp;type="string"&nbsp;indexed="true"&nbsp;stored="true"&nbsp;required="true"&nbsp;multiValued="false"&nbsp;/&gt;&nbsp; &nbsp;&nbsp;&nbsp;&lt;field&nbsp;name="time"&nbsp;type="string"&nbsp;indexed="true"&nbsp;stored="true"&nbsp;required="false"&nbsp;multiValued="false"&nbsp;/&gt; &nbsp;&nbsp;&nbsp;&lt;field&nbsp;name="tebid"&nbsp;type="string"&nbsp;indexed="true"&nbsp;stored="true"&nbsp;required="false"&nbsp;multiValued="false"&nbsp;/&gt; &nbsp;&nbsp;&nbsp;&lt;field&nbsp;name="tetid"&nbsp;type="string"&nbsp;indexed="true"&nbsp;stored="true"&nbsp;required="false"&nbsp;multiValued="false"&nbsp;/&gt; &nbsp;&nbsp;&nbsp;&lt;field&nbsp;name="puid"&nbsp;type="string"&nbsp;indexed="true"&nbsp;stored="true"&nbsp;required="false"&nbsp;multiValued="false"&nbsp;/&gt; &nbsp;&nbsp;&nbsp;&lt;field&nbsp;name="mgcvid"&nbsp;type="string"&nbsp;indexed="true"&nbsp;stored="true"&nbsp;required="false"&nbsp;multiValued="false"&nbsp;/&gt; &nbsp;&nbsp;&nbsp;&lt;field&nbsp;name="mtcvid"&nbsp;type="string"&nbsp;indexed="true"&nbsp;stored="true"&nbsp;required="false"&nbsp;multiValued="false"&nbsp;/&gt; &nbsp;&nbsp;&nbsp;&lt;field&nbsp;name="smaid"&nbsp;type="string"&nbsp;indexed="true"&nbsp;stored="true"&nbsp;required="false"&nbsp;multiValued="false"&nbsp;/&gt; &nbsp;&nbsp;&nbsp;&lt;field&nbsp;name="mtlkid"&nbsp;type="string"&nbsp;indexed="true"&nbsp;stored="true"&nbsp;required="false"&nbsp;multiValued="false"&nbsp;/&gt;</pre><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: Verdana, sans-serif, 宋体; background-color: #ffffff;"></p><p style="padding: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 25px; color: #333333; font-stretch: normal; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">另外关键的一点是修改原有的uniqueKey，本文设置HBase表的rowkey字段为Solr索引的uniqueKey：</p><pre style="padding: 5px; margin-top: 10px; margin-bottom: 10px; margin-left: 20px; line-height: 18px; font-size: 9pt; font-family: 'Courier New', Arial; border-width: 1px 1px 1px 5px; border-style: solid; border-color: #dddddd #dddddd #dddddd #6ce26c; color: #333333; background: #f6f6f6;">&lt;uniqueKey&gt;rowkey&lt;/uniqueKey&gt;</pre><p style="padding: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 25px; color: #333333; font-stretch: normal; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">type 参数代表索引数据类型，我这里将type全部设置为string是为了避免异常类型的数据导致索引建立失败，正常情况下应该根据实际字段类型设置，比如整型字段设置为int，更加有利于索引的建立和检索；</p><p style="padding: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 25px; color: #333333; font-stretch: normal; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">indexed 参数代表此字段是否建立索引，根据实际情况设置，建议不参与条件过滤的字段一律设置为false；</p><p style="padding: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 25px; color: #333333; font-stretch: normal; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">stored 参数代表是否存储此字段的值，建议根据实际需求只将需要获取值的字段设置为true，以免浪费存储，比如我们的场景只需要获取rowkey，那么只需把rowkey字段设置为true即可，其他字段全部设置flase；</p><p style="padding: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 25px; color: #333333; font-stretch: normal; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">required 参数代表此字段是否必需，如果数据源某个字段可能存在空值，那么此属性必需设置为false，不然Solr会抛出异常；</p><p style="padding: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 25px; color: #333333; font-stretch: normal; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">multiValued 参数代表此字段是否允许有多个值，通常都设置为false，根据实际需求可设置为true。</p><p style="padding: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 25px; color: #333333; font-stretch: normal; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">4）我们使用Solr自带的example来作为运行环境，定位到example目录，启动服务监听：</p><pre style="padding: 5px; margin-top: 10px; margin-bottom: 10px; margin-left: 20px; line-height: 18px; font-size: 9pt; font-family: 'Courier New', Arial; border-width: 1px 1px 1px 5px; border-style: solid; border-color: #dddddd #dddddd #dddddd #6ce26c; color: #333333; background: #f6f6f6;">cd&nbsp;/opt/apache-solr-4.0.0/example java&nbsp;-jar&nbsp;./start.jar</pre><p style="padding: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 25px; color: #333333; font-stretch: normal; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">如果启动成功，可以通过浏览器打开此页面：http://192.168.1.10:8983/solr/</p><p style="padding: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 25px; color: #333333; font-stretch: normal; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;"><a href="http://static.oschina.net/uploads/img/201412/04175007_0H1x.png" target="_blank" style="padding: 0px; margin: 0px; color: #ff8373; outline: 0px; font-size: 12px;"><img alt="" src="http://static.oschina.net/uploads/img/201412/04175007_0H1x.png" style="padding: 5px; margin: 10px 0px; border: 1px solid #dddddd; max-width: 640px; cursor: pointer; background: #f4f7f9;" /></a></p><h3>二、读取HBase源表的数据，在Solr中建立索引</h3><p style="padding: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 25px; color: #333333; font-stretch: normal; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">一种方案是通过HBase的普通API获取数据建立索引，此方案的缺点是效率较低每秒只能处理100多条数据（或许可以通过多线程提高效率）：</p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: Verdana, sans-serif, 宋体; background-color: #ffffff;"></p><pre style="padding: 5px; margin-top: 10px; margin-bottom: 10px; margin-left: 20px; line-height: 18px; font-size: 9pt; font-family: 'Courier New', Arial; border-width: 1px 1px 1px 5px; border-style: solid; border-color: #dddddd #dddddd #dddddd #6ce26c; color: #333333; background: #f6f6f6;">package&nbsp;com.ultrapower.hbase.solrhbase;import&nbsp;java.io.IOException;import&nbsp;org.apache.hadoop.conf.Configuration;import&nbsp;org.apache.hadoop.hbase.HBaseConfiguration;import&nbsp;org.apache.hadoop.hbase.KeyValue;import&nbsp;org.apache.hadoop.hbase.client.HTable;import&nbsp;org.apache.hadoop.hbase.client.Result;import&nbsp;org.apache.hadoop.hbase.client.ResultScanner;import&nbsp;org.apache.hadoop.hbase.client.Scan;import&nbsp;org.apache.hadoop.hbase.util.Bytes;import&nbsp;org.apache.solr.client.solrj.SolrServerException;import&nbsp;org.apache.solr.client.solrj.impl.HttpSolrServer;import&nbsp;org.apache.solr.common.SolrInputDocument;public&nbsp;class&nbsp;SolrIndexer&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;args &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;IOException &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;SolrServerException&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;throws&nbsp;IOException, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SolrServerException&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;Configuration&nbsp;conf; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpSolrServer&nbsp;solrServer&nbsp;=&nbsp;new&nbsp;HttpSolrServer(&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"http://192.168.1.10:8983/solr");&nbsp;//&nbsp;因为服务端是用的Solr自带的jetty容器，默认端口号是8983  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conf&nbsp;=&nbsp;HBaseConfiguration.create(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTable&nbsp;table&nbsp;=&nbsp;new&nbsp;HTable(conf,&nbsp;"hb_app_xxxxxx");&nbsp;//&nbsp;这里指定HBase表名称 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Scan&nbsp;scan&nbsp;=&nbsp;new&nbsp;Scan(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scan.addFamily(Bytes.toBytes("d"));&nbsp;//&nbsp;这里指定HBase表的列族 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scan.setCaching(500); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scan.setCacheBlocks(false); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResultScanner&nbsp;ss&nbsp;=&nbsp;table.getScanner(scan);  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("start&nbsp;...");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(Result&nbsp;r&nbsp;:&nbsp;ss)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SolrInputDocument&nbsp;solrDoc&nbsp;=&nbsp;new&nbsp;SolrInputDocument(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solrDoc.addField("rowkey",&nbsp;new&nbsp;String(r.getRow()));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(KeyValue&nbsp;kv&nbsp;:&nbsp;r.raw())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;fieldName&nbsp;=&nbsp;new&nbsp;String(kv.getQualifier()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;fieldValue&nbsp;=&nbsp;new&nbsp;String(kv.getValue());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(fieldName.equalsIgnoreCase("time")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||&nbsp;fieldName.equalsIgnoreCase("tebid")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||&nbsp;fieldName.equalsIgnoreCase("tetid")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||&nbsp;fieldName.equalsIgnoreCase("puid")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||&nbsp;fieldName.equalsIgnoreCase("mgcvid")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||&nbsp;fieldName.equalsIgnoreCase("mtcvid")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||&nbsp;fieldName.equalsIgnoreCase("smaid")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||&nbsp;fieldName.equalsIgnoreCase("mtlkid"))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solrDoc.addField(fieldName,&nbsp;fieldValue); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solrServer.add(solrDoc); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solrServer.commit(true,&nbsp;true,&nbsp;true); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;i&nbsp;+&nbsp;1; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("已经成功处理&nbsp;"&nbsp;+&nbsp;i&nbsp;+&nbsp;"&nbsp;条数据"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ss.close(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.close(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("done&nbsp;!"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(IOException&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;finally&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ss.close(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.close(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("erro&nbsp;!"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}  }</pre><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: Verdana, sans-serif, 宋体; background-color: #ffffff;"></p><p style="padding: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 25px; color: #333333; font-stretch: normal; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">另外一种方案是用到HBase的Mapreduce框架，分布式并行执行效率特别高，处理1000万条数据仅需5分钟，但是这种高并发需要对Solr服务器进行配置调优，不然会抛出服务器无法响应的异常：</p><pre style="padding: 5px; margin-top: 10px; margin-bottom: 10px; margin-left: 20px; line-height: 18px; font-size: 9pt; font-family: 'Courier New', Arial; border-width: 1px 1px 1px 5px; border-style: solid; border-color: #dddddd #dddddd #dddddd #6ce26c; color: #333333; background: #f6f6f6;">Error:&nbsp;org.apache.solr.common.SolrException:&nbsp;Server&nbsp;at&nbsp;http://192.168.1.10:8983/solr&nbsp;returned&nbsp;non&nbsp;ok&nbsp;status:503,&nbsp;message:Service&nbsp;Unavailable</pre><p style="padding: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 25px; color: #333333; font-stretch: normal; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; line-height: 1.8; color: #3366ff;">MapReduce入口程序：</span></p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: Verdana, sans-serif, 宋体; background-color: #ffffff;"></p><pre style="padding: 5px; margin-top: 10px; margin-bottom: 10px; margin-left: 20px; line-height: 18px; font-size: 9pt; font-family: 'Courier New', Arial; border-width: 1px 1px 1px 5px; border-style: solid; border-color: #dddddd #dddddd #dddddd #6ce26c; color: #333333; background: #f6f6f6;">package&nbsp;com.ultrapower.hbase.solrhbase;import&nbsp;java.io.IOException;import&nbsp;java.net.URISyntaxException;import&nbsp;org.apache.hadoop.conf.Configuration;import&nbsp;org.apache.hadoop.hbase.HBaseConfiguration;import&nbsp;org.apache.hadoop.hbase.client.Scan;import&nbsp;org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;import&nbsp;org.apache.hadoop.hbase.util.Bytes;import&nbsp;org.apache.hadoop.mapreduce.Job;import&nbsp;org.apache.hadoop.mapreduce.lib.output.NullOutputFormat;public&nbsp;class&nbsp;SolrHBaseIndexer&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;void&nbsp;usage()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println("输入参数:&nbsp;&lt;配置文件路径&gt;&nbsp;&lt;起始行&gt;&nbsp;&lt;结束行&gt;"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.exit(1); &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;Configuration&nbsp;conf;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;throws&nbsp;IOException, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InterruptedException,&nbsp;ClassNotFoundException,&nbsp;URISyntaxException&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(args.length&nbsp;==&nbsp;0&nbsp;||&nbsp;args.length&nbsp;&gt;&nbsp;3)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;usage(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;createHBaseConfiguration(args[0]); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ConfigProperties&nbsp;tutorialProperties&nbsp;=&nbsp;new&nbsp;ConfigProperties(args[0]); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;tbName&nbsp;=&nbsp;tutorialProperties.getHBTbName(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;tbFamily&nbsp;=&nbsp;tutorialProperties.getHBFamily();  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Job&nbsp;job&nbsp;=&nbsp;new&nbsp;Job(conf,&nbsp;"SolrHBaseIndexer"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;job.setJarByClass(SolrHBaseIndexer.class);  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Scan&nbsp;scan&nbsp;=&nbsp;new&nbsp;Scan();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(args.length&nbsp;==&nbsp;3)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scan.setStartRow(Bytes.toBytes(args[1])); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scan.setStopRow(Bytes.toBytes(args[2])); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scan.addFamily(Bytes.toBytes(tbFamily)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scan.setCaching(500);&nbsp;//&nbsp;设置缓存数据量来提高效率 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scan.setCacheBlocks(false);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;创建Map任务&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TableMapReduceUtil.initTableMapperJob(tbName,&nbsp;scan, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SolrHBaseIndexerMapper.class,&nbsp;null,&nbsp;null,&nbsp;job);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;不需要输出 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;job.setOutputFormatClass(NullOutputFormat.class);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;job.setNumReduceTasks(0); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.exit(job.waitForCompletion(true)&nbsp;?&nbsp;0&nbsp;:&nbsp;1); &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;从配置文件读取并设置HBase配置信息 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;propsLocation &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;void&nbsp;createHBaseConfiguration(String&nbsp;propsLocation)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ConfigProperties&nbsp;tutorialProperties&nbsp;=&nbsp;new&nbsp;ConfigProperties( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;propsLocation); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conf&nbsp;=&nbsp;HBaseConfiguration.create(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conf.set("hbase.zookeeper.quorum",&nbsp;tutorialProperties.getZKQuorum()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conf.set("hbase.zookeeper.property.clientPort", &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tutorialProperties.getZKPort()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conf.set("hbase.master",&nbsp;tutorialProperties.getHBMaster()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conf.set("hbase.rootdir",&nbsp;tutorialProperties.getHBrootDir()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conf.set("solr.server",&nbsp;tutorialProperties.getSolrServer()); &nbsp;&nbsp;&nbsp;&nbsp;} }</pre><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: Verdana, sans-serif, 宋体; background-color: #ffffff;"></p><p style="padding: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 25px; color: #333333; font-stretch: normal; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; line-height: 1.8; color: #3366ff;">对应的Mapper：</span></p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: Verdana, sans-serif, 宋体; background-color: #ffffff;"></p><pre style="padding: 5px; margin-top: 10px; margin-bottom: 10px; margin-left: 20px; line-height: 18px; font-size: 9pt; font-family: 'Courier New', Arial; border-width: 1px 1px 1px 5px; border-style: solid; border-color: #dddddd #dddddd #dddddd #6ce26c; color: #333333; background: #f6f6f6;">package&nbsp;com.ultrapower.hbase.solrhbase;import&nbsp;java.io.IOException;import&nbsp;org.apache.hadoop.conf.Configuration;import&nbsp;org.apache.hadoop.hbase.KeyValue;import&nbsp;org.apache.hadoop.hbase.client.Result;import&nbsp;org.apache.hadoop.hbase.io.ImmutableBytesWritable;import&nbsp;org.apache.hadoop.hbase.mapreduce.TableMapper;import&nbsp;org.apache.hadoop.io.Text;import&nbsp;org.apache.solr.client.solrj.SolrServerException;import&nbsp;org.apache.solr.client.solrj.impl.HttpSolrServer;import&nbsp;org.apache.solr.common.SolrInputDocument;public&nbsp;class&nbsp;SolrHBaseIndexerMapper&nbsp;extends&nbsp;TableMapper&lt;Text,&nbsp;Text&gt;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;map(ImmutableBytesWritable&nbsp;key,&nbsp;Result&nbsp;hbaseResult, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Context&nbsp;context)&nbsp;throws&nbsp;InterruptedException,&nbsp;IOException&nbsp;{  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Configuration&nbsp;conf&nbsp;=&nbsp;context.getConfiguration();  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpSolrServer&nbsp;solrServer&nbsp;=&nbsp;new&nbsp;HttpSolrServer(conf.get("solr.server")); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solrServer.setDefaultMaxConnectionsPerHost(100); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solrServer.setMaxTotalConnections(1000); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solrServer.setSoTimeout(20000); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solrServer.setConnectionTimeout(20000); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SolrInputDocument&nbsp;solrDoc&nbsp;=&nbsp;new&nbsp;SolrInputDocument();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solrDoc.addField("rowkey",&nbsp;new&nbsp;String(hbaseResult.getRow()));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(KeyValue&nbsp;rowQualifierAndValue&nbsp;:&nbsp;hbaseResult.list())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;fieldName&nbsp;=&nbsp;new&nbsp;String( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rowQualifierAndValue.getQualifier()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;fieldValue&nbsp;=&nbsp;new&nbsp;String(rowQualifierAndValue.getValue());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(fieldName.equalsIgnoreCase("time")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||&nbsp;fieldName.equalsIgnoreCase("tebid")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||&nbsp;fieldName.equalsIgnoreCase("tetid")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||&nbsp;fieldName.equalsIgnoreCase("puid")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||&nbsp;fieldName.equalsIgnoreCase("mgcvid")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||&nbsp;fieldName.equalsIgnoreCase("mtcvid")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||&nbsp;fieldName.equalsIgnoreCase("smaid")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||&nbsp;fieldName.equalsIgnoreCase("mtlkid"))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solrDoc.addField(fieldName,&nbsp;fieldValue); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solrServer.add(solrDoc); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solrServer.commit(true,&nbsp;true,&nbsp;true); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(SolrServerException&nbsp;e)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println("更新Solr索引异常:"&nbsp;+&nbsp;new&nbsp;String(hbaseResult.getRow())); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} }</pre><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: Verdana, sans-serif, 宋体; background-color: #ffffff;"></p><p style="padding: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 25px; color: #333333; font-stretch: normal; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; line-height: 1.8; color: #3366ff;">读取参数配置文件的辅助类：</span></p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: Verdana, sans-serif, 宋体; background-color: #ffffff;"></p><pre style="padding: 5px; margin-top: 10px; margin-bottom: 10px; margin-left: 20px; line-height: 18px; font-size: 9pt; font-family: 'Courier New', Arial; border-width: 1px 1px 1px 5px; border-style: solid; border-color: #dddddd #dddddd #dddddd #6ce26c; color: #333333; background: #f6f6f6;">package&nbsp;com.ultrapower.hbase.solrhbase;import&nbsp;java.io.File;import&nbsp;java.io.FileReader;import&nbsp;java.io.IOException;import&nbsp;java.util.Properties;public&nbsp;class&nbsp;ConfigProperties&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;Properties&nbsp;props;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;HBASE_ZOOKEEPER_QUORUM;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;HBASE_ZOOKEEPER_PROPERTY_CLIENT_PORT;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;HBASE_MASTER;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;HBASE_ROOTDIR;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;DFS_NAME_DIR;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;DFS_DATA_DIR;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;FS_DEFAULT_NAME;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;SOLR_SERVER;&nbsp;//&nbsp;Solr服务器地址&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;HBASE_TABLE_NAME;&nbsp;//&nbsp;需要建立Solr索引的HBase表名称&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;HBASE_TABLE_FAMILY;&nbsp;//&nbsp;HBase表的列族&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;ConfigProperties(String&nbsp;propLocation)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;props&nbsp;=&nbsp;new&nbsp;Properties();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;file&nbsp;=&nbsp;new&nbsp;File(propLocation); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("从以下位置加载配置文件：&nbsp;"&nbsp;+&nbsp;file.getAbsolutePath()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileReader&nbsp;is&nbsp;=&nbsp;new&nbsp;FileReader(file); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;props.load(is);  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HBASE_ZOOKEEPER_QUORUM&nbsp;=&nbsp;props.getProperty("HBASE_ZOOKEEPER_QUORUM"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HBASE_ZOOKEEPER_PROPERTY_CLIENT_PORT&nbsp;=&nbsp;props.getProperty("HBASE_ZOOKEEPER_PROPERTY_CLIENT_PORT"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HBASE_MASTER&nbsp;=&nbsp;props.getProperty("HBASE_MASTER"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HBASE_ROOTDIR&nbsp;=&nbsp;props.getProperty("HBASE_ROOTDIR"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DFS_NAME_DIR&nbsp;=&nbsp;props.getProperty("DFS_NAME_DIR"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DFS_DATA_DIR&nbsp;=&nbsp;props.getProperty("DFS_DATA_DIR"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FS_DEFAULT_NAME&nbsp;=&nbsp;props.getProperty("FS_DEFAULT_NAME"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SOLR_SERVER&nbsp;=&nbsp;props.getProperty("SOLR_SERVER"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HBASE_TABLE_NAME&nbsp;=&nbsp;props.getProperty("HBASE_TABLE_NAME"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HBASE_TABLE_FAMILY&nbsp;=&nbsp;props.getProperty("HBASE_TABLE_FAMILY");  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(IOException&nbsp;e)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;RuntimeException("加载配置文件出错"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(NullPointerException&nbsp;e)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;RuntimeException("文件不存在"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;getZKQuorum()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;HBASE_ZOOKEEPER_QUORUM; &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;getZKPort()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;HBASE_ZOOKEEPER_PROPERTY_CLIENT_PORT; &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;getHBMaster()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;HBASE_MASTER; &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;getHBrootDir()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;HBASE_ROOTDIR; &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;getDFSnameDir()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;DFS_NAME_DIR; &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;getDFSdataDir()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;DFS_DATA_DIR; &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;getFSdefaultName()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;FS_DEFAULT_NAME; &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;getSolrServer()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;SOLR_SERVER; &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;getHBTbName()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;HBASE_TABLE_NAME; &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;getHBFamily()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;HBASE_TABLE_FAMILY; &nbsp;&nbsp;&nbsp;&nbsp;} }</pre><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: Verdana, sans-serif, 宋体; background-color: #ffffff;"></p><p style="padding: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 25px; color: #333333; font-stretch: normal; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; line-height: 1.8; color: #3366ff;">参数配置文件&#8220;config.properties&#8221;：</span></p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: Verdana, sans-serif, 宋体; background-color: #ffffff;"></p><pre style="padding: 5px; margin-top: 10px; margin-bottom: 10px; margin-left: 20px; line-height: 18px; font-size: 9pt; font-family: 'Courier New', Arial; border-width: 1px 1px 1px 5px; border-style: solid; border-color: #dddddd #dddddd #dddddd #6ce26c; color: #333333; background: #f6f6f6;">HBASE_ZOOKEEPER_QUORUM=slave-1,slave-2,slave-3,slave-4,slave-5HBASE_ZOOKEEPER_PROPERTY_CLIENT_PORT=2181HBASE_MASTER=master-1:60000HBASE_ROOTDIR=hdfs:///hbaseDFS_NAME_DIR=/opt/data/dfs/name DFS_DATA_DIR=/opt/data/d0/dfs2/data FS_DEFAULT_NAME=hdfs://192.168.1.10:9000SOLR_SERVER=http://192.168.1.10:8983/solrHBASE_TABLE_NAME=hb_app_m_user_te HBASE_TABLE_FAMILY=d</pre><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: Verdana, sans-serif, 宋体; background-color: #ffffff;"></p><h3>三、结合Solr进行HBase数据的多条件查询：</h3><p style="padding: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 25px; color: #333333; font-stretch: normal; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">可以通过web页面操作Solr索引，</p><p style="padding: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 25px; color: #333333; font-stretch: normal; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">查询：</p><pre style="padding: 5px; margin-top: 10px; margin-bottom: 10px; margin-left: 20px; line-height: 18px; font-size: 9pt; font-family: 'Courier New', Arial; border-width: 1px 1px 1px 5px; border-style: solid; border-color: #dddddd #dddddd #dddddd #6ce26c; color: #333333; background: #f6f6f6;">http://192.168.1.10:8983/solr/select?(time:201307&nbsp;AND&nbsp;tetid:1&nbsp;AND&nbsp;mgcvid:101&nbsp;AND&nbsp;smaid:101&nbsp;AND&nbsp;puid:102)</pre><p style="padding: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 25px; color: #333333; font-stretch: normal; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;"><a href="http://static.oschina.net/uploads/img/201412/04175007_Ayl0.png" target="_blank" style="padding: 0px; margin: 0px; color: #ff8373; outline: 0px; font-size: 12px;"><img alt="" src="http://static.oschina.net/uploads/img/201412/04175007_Ayl0.png" style="padding: 5px; margin: 10px 0px; border: 1px solid #dddddd; max-width: 640px; cursor: pointer; background: #f4f7f9;" /></a></p><p style="padding: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 25px; color: #333333; font-stretch: normal; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">删除所有索引：</p><pre style="padding: 5px; margin-top: 10px; margin-bottom: 10px; margin-left: 20px; line-height: 18px; font-size: 9pt; font-family: 'Courier New', Arial; border-width: 1px 1px 1px 5px; border-style: solid; border-color: #dddddd #dddddd #dddddd #6ce26c; color: #333333; background: #f6f6f6;">http://192.168.1.10:8983/solr/update/?stream.body=&lt;delete&gt;&lt;query&gt;*:*&lt;/query&gt;&lt;/delete&gt;&amp;stream.contentType=text/xml;charset=utf-8&amp;commit=true</pre><p style="padding: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 25px; color: #333333; font-stretch: normal; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;"><span style="padding: 0px; margin: 0px; line-height: 1.8; color: #0000ff;">通过java客户端结合Solr查询HBase数据：</span></p><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: Verdana, sans-serif, 宋体; background-color: #ffffff;"></p><pre style="padding: 5px; margin-top: 10px; margin-bottom: 10px; margin-left: 20px; line-height: 18px; font-size: 9pt; font-family: 'Courier New', Arial; border-width: 1px 1px 1px 5px; border-style: solid; border-color: #dddddd #dddddd #dddddd #6ce26c; color: #333333; background: #f6f6f6;">package&nbsp;com.ultrapower.hbase.solrhbase;import&nbsp;java.io.IOException;import&nbsp;java.nio.ByteBuffer;import&nbsp;java.util.ArrayList;import&nbsp;java.util.List;import&nbsp;org.apache.hadoop.conf.Configuration;import&nbsp;org.apache.hadoop.hbase.HBaseConfiguration;import&nbsp;org.apache.hadoop.hbase.client.Get;import&nbsp;org.apache.hadoop.hbase.client.HTable;import&nbsp;org.apache.hadoop.hbase.client.Result;import&nbsp;org.apache.hadoop.hbase.util.Bytes;import&nbsp;org.apache.solr.client.solrj.SolrQuery;import&nbsp;org.apache.solr.client.solrj.SolrServer;import&nbsp;org.apache.solr.client.solrj.SolrServerException;import&nbsp;org.apache.solr.client.solrj.impl.HttpSolrServer;import&nbsp;org.apache.solr.client.solrj.response.QueryResponse;import&nbsp;org.apache.solr.common.SolrDocument;import&nbsp;org.apache.solr.common.SolrDocumentList;public&nbsp;class&nbsp;QueryData&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;args &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;SolrServerException&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@throws&nbsp;IOException&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;throws&nbsp;SolrServerException,&nbsp;IOException&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;Configuration&nbsp;conf; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conf&nbsp;=&nbsp;HBaseConfiguration.create(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTable&nbsp;table&nbsp;=&nbsp;new&nbsp;HTable(conf,&nbsp;"hb_app_m_user_te"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Get&nbsp;get&nbsp;=&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;Get&gt;&nbsp;list&nbsp;=&nbsp;new&nbsp;ArrayList&lt;Get&gt;(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;url&nbsp;=&nbsp;"http://192.168.1.10:8983/solr"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SolrServer&nbsp;server&nbsp;=&nbsp;new&nbsp;HttpSolrServer(url); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SolrQuery&nbsp;query&nbsp;=&nbsp;new&nbsp;SolrQuery("time:201307&nbsp;AND&nbsp;tetid:1&nbsp;AND&nbsp;mgcvid:101&nbsp;AND&nbsp;smaid:101&nbsp;AND&nbsp;puid:102"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;query.setStart(0);&nbsp;//数据起始行，分页用 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;query.setRows(10);&nbsp;//返回记录数，分页用 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QueryResponse&nbsp;response&nbsp;=&nbsp;server.query(query); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SolrDocumentList&nbsp;docs&nbsp;=&nbsp;response.getResults(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("文档个数："&nbsp;+&nbsp;docs.getNumFound());&nbsp;//数据总条数也可轻易获取 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("查询时间："&nbsp;+&nbsp;response.getQTime());&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(SolrDocument&nbsp;doc&nbsp;:&nbsp;docs)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;get&nbsp;=&nbsp;new&nbsp;Get(Bytes.toBytes((String)&nbsp;doc.getFieldValue("rowkey"))); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(get); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result[]&nbsp;res&nbsp;=&nbsp;table.get(list);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte[]&nbsp;bt1&nbsp;=&nbsp;null;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte[]&nbsp;bt2&nbsp;=&nbsp;null;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte[]&nbsp;bt3&nbsp;=&nbsp;null;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte[]&nbsp;bt4&nbsp;=&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str1&nbsp;=&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str2&nbsp;=&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str3&nbsp;=&nbsp;null; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str4&nbsp;=&nbsp;null;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(Result&nbsp;rs&nbsp;:&nbsp;res)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bt1&nbsp;=&nbsp;rs.getValue("d".getBytes(),&nbsp;"3mpon".getBytes()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bt2&nbsp;=&nbsp;rs.getValue("d".getBytes(),&nbsp;"3mponid".getBytes()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bt3&nbsp;=&nbsp;rs.getValue("d".getBytes(),&nbsp;"amarpu".getBytes()); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bt4&nbsp;=&nbsp;rs.getValue("d".getBytes(),&nbsp;"amarpuid".getBytes());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(bt1&nbsp;!=&nbsp;null&nbsp;&amp;&amp;&nbsp;bt1.length&gt;0)&nbsp;{str1&nbsp;=&nbsp;new&nbsp;String(bt1);}&nbsp;else&nbsp;{str1&nbsp;=&nbsp;"无数据";}&nbsp;//对空值进行new&nbsp;String的话会抛出异常 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(bt2&nbsp;!=&nbsp;null&nbsp;&amp;&amp;&nbsp;bt2.length&gt;0)&nbsp;{str2&nbsp;=&nbsp;new&nbsp;String(bt2);}&nbsp;else&nbsp;{str2&nbsp;=&nbsp;"无数据";}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(bt3&nbsp;!=&nbsp;null&nbsp;&amp;&amp;&nbsp;bt3.length&gt;0)&nbsp;{str3&nbsp;=&nbsp;new&nbsp;String(bt3);}&nbsp;else&nbsp;{str3&nbsp;=&nbsp;"无数据";}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(bt4&nbsp;!=&nbsp;null&nbsp;&amp;&amp;&nbsp;bt4.length&gt;0)&nbsp;{str4&nbsp;=&nbsp;new&nbsp;String(bt4);}&nbsp;else&nbsp;{str4&nbsp;=&nbsp;"无数据";} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(new&nbsp;String(rs.getRow())&nbsp;+&nbsp;"&nbsp;"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(str1&nbsp;+&nbsp;"|"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(str2&nbsp;+&nbsp;"|"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(str3&nbsp;+&nbsp;"|"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(str4&nbsp;+&nbsp;"|"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.close(); &nbsp;&nbsp;&nbsp;&nbsp;} }</pre><p style="padding: 0px; margin: 8px 0px; line-height: 22.5px; letter-spacing: 0.5px; font-size: 13px; color: #333333; font-family: Verdana, sans-serif, 宋体; background-color: #ffffff;"></p><h2>小结：</h2><p style="padding: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 25px; color: #333333; font-stretch: normal; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">通过测试发现，结合Solr索引可以很好的实现HBase的多条件查询，同时还能解决其两个难点：分页查询、数据总量统计。</p><p style="padding: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 25px; color: #333333; font-stretch: normal; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">实际场景中大多都是分页查询，分页查询返回的数据量很少，采用此种方案完全可以达到前端页面毫秒级的实时响应；若有大批量的数据交互，比如涉及到数据导出，实际上效率也是很高，十万数据仅耗时10秒。</p><p style="padding: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 25px; color: #333333; font-stretch: normal; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">另外，如果真的将Solr纳入使用，Solr以及HBase端都可以不断进行优化，比如可以搭建Solr集群，甚至可以采用SolrCloud基于hadoop的分布式索引服务。</p><p style="padding: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 25px; color: #333333; font-stretch: normal; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">总之，HBase不能多条件过滤查询的先天性缺陷，在Solr的配合之下可以得到较好的弥补，难怪诸如新蛋科技、国美电商、苏宁电商等互联网公司以及众多游戏公司，都使用Solr来支持快速查询。</p><p style="padding: 0px; margin-top: 10px; margin-bottom: 10px; line-height: 25px; color: #333333; font-stretch: normal; font-family: verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">----end</p><img src ="http://www.blogjava.net/paulwong/aggbug/421052.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2014-12-04 19:02 <a href="http://www.blogjava.net/paulwong/archive/2014/12/04/421052.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SOLR/LUCENCE资源</title><link>http://www.blogjava.net/paulwong/archive/2013/12/27/408127.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 27 Dec 2013 08:13:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2013/12/27/408127.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/408127.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2013/12/27/408127.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/408127.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/408127.html</trackback:ping><description><![CDATA[视频：01. lucene简介和创建索引初步等<a href="http://www.itsoku.com/video/sp/63/v/1683.shtml" target="_blank"><br />http://www.itsoku.com/video/sp/63/v/1683.shtml</a><img src ="http://www.blogjava.net/paulwong/aggbug/408127.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2013-12-27 16:13 <a href="http://www.blogjava.net/paulwong/archive/2013/12/27/408127.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>