ES008-Elasticsearch+hbase整合

原创 2015年10月13日 10:36:51
1:设计索引库的settings信息的mappings信息,并把这些配置信息保存到一个配置文件中。
1.1 vi articles.json

{
    "settings":{
         "number_of_shards":3,
         "number_of_replicas":1
    },
    "mappings":{
         "article":{
             "dynamic":"strict",
             "properties":{
                 "id":{"type":"integer","store":"yes"},
                 "title":{"type":"string","store":"yes","index":"analyzed","analyzer":" ik"},
                 "describe":{"type":"string","store":"yes","index":"analyzed","analyzer":" ik"},
                 "author":{"type":"string","store":"yes","index":"no"}
             }
         }
    }
}

其中: dynamic:strict  表示禁用ElasticSearch动态匹配字段类型,title和describe使用 ik分词
1.2 命令行创建索引
curl -XPUT 'localhost:9200/articles/' -d'{"settings":{"number_of_shards":3,"number_of_replicas":1}}'

2:安装配置 es服务。
    1):整合IK中文分词工具
    
3:启动 es

4:创建索引库
    使用开始定义的文件进行创建,使用下面命令进行创建
    curl -XPOST ' localhost:9200/articles' -d @articles.json

5:初始化数据

把原始数据在 es中建立索引,并且还要在 hbase中保存一份。
需要使用提供的代码里面的一个类(DataImportHBaseAndIndex.java)
public class DataImportHBaseAndIndex {

    public static final String FILE_PATH= "D:/bigdata/es_hbase/datasrc/article.txt" ;
    public static void main(String[] args) throws java.lang.Exception {
          // 读取数据源
         InputStream in = new FileInputStream(new File(FILE_PATH ));
         BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in ,"UTF-8" ));
         String line = null;
         List<Article> articleList = new ArrayList<Article>();
         Article article = null;
          while ((line = bufferedReader .readLine()) != null) {
             String[] split = StringUtils.split(line, "\t");
              article = new Article();
              article.setId( new Integer(split [0]));
              article.setTitle( split[1]);
              article.setAuthor( split[2]);
              article.setDescribe( split[3]);
              article.setContent( split[3]);
              articleList.add(article );
         }

          for (Article a : articleList ) {
              // HBase插入数据
             HBaseUtils hBaseUtils = new HBaseUtils();
              hBaseUtils.put(hBaseUtils .TABLE_NAME , String.valueOf(a.getId()), hBaseUtils.COLUMNFAMILY_1 ,
                      hBaseUtils.COLUMNFAMILY_1_TITLE , a .getTitle());
              hBaseUtils.put(hBaseUtils .TABLE_NAME , String.valueOf(a.getId()), hBaseUtils.COLUMNFAMILY_1 ,
                      hBaseUtils.COLUMNFAMILY_1_AUTHOR , a.getAuthor());
              hBaseUtils.put(hBaseUtils .TABLE_NAME , String.valueOf(a.getId()), hBaseUtils.COLUMNFAMILY_1 ,
                      hBaseUtils.COLUMNFAMILY_1_DESCRIBE , a.getDescribe());
              hBaseUtils.put(hBaseUtils .TABLE_NAME , String.valueOf(a.getId()), hBaseUtils.COLUMNFAMILY_1 ,
                      hBaseUtils.COLUMNFAMILY_1_CONTENT , a.getContent());

              // ElasticSearch 插入数据
             EsUtil. addIndex(EsUtil.DEFAULT_INDEX, EsUtil.DEFAULT_TYPE , a );
         }
    }
}

注意:
(1)使用 hbaseutils工具类的时候,要注意修改 zk的IP地址和hbase.rootdir的地址
还需要在集群中创建一个表(HBase集群):
create 'article','info'

(2) 使用 es工具类的时候要注意:addIndex方法需要实现
/**
     * 向ElasticSearch添加索引
     *
     * @param index
     *            索引库名称
     * @param type
     *            搜索类型
     * @param article
     *            数据
     * @return 当前doc的id
     */
    public static String addIndex(String index , String type, Article article ) {

         HashMap<String, Object> hashMap = new HashMap<String,  Object>();
          hashMap.put( "id", article .getId());
          hashMap.put( "title", article .getTitle());
          hashMap.put( "describe", article.getDescribe());
          hashMap.put( "author", article .getAuthor());
         IndexResponse response = getInstance().prepareIndex(index, type, String.valueOf(article.getId())).setSource( hashMap).get();
          return response .getId();
    }

   
     
6:Es工具类中的search方法是否已经完善。
     
/**
     * ElasticSearch查询
     *
     * @param skey
     *            搜索关键字
     * @param index
     *            索引库
     * @param type
     *            类型
     * @param start
     *            开始下标
     * @param row
     *            每页显示最大记录书
     * @return 数据记录
     */
    public static Map<String, Object> search(String skey, String index , String type, Integer start, Integer row) {

         HashMap<String, Object> dataMap = new HashMap<String, Object>();
         ArrayList<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>();

         SearchRequestBuilder builder = EsUtil.getInstance().prepareSearch(index);
          builder.setTypes( type);
         builder.setSearchType(SearchType. DFS_QUERY_THEN_FETCH);
          if (StringUtils.isNotBlank( skey)) {
              builder.setQuery(QueryBuilders. multiMatchQuery(skey, "title", "describe" ));// 匹配title和describe两个字段
         }
          builder.setFrom( start);
          builder.setSize( row);

          // 设置查询高亮显示
          builder.addHighlightedField( "title");
          builder.addHighlightedField( "describe");
          builder.setHighlighterPreTags( "<font color='red'>");
          builder.setHighlighterPostTags( "</font>");

         SearchResponse response = builder.get(); // 执行查询
         SearchHits hits = response.getHits();
          long totalCount = hits .getTotalHits();// 总数
         SearchHit[] hits2 = hits.getHits();
         Map<String, Object> source = null;
          for (SearchHit searchHit : hits2 ) {
              source = searchHit.getSource();// 获取查询数据
              // 查询字段title和 describle高亮控制
             Map<String, HighlightField> highlightFields = searchHit .getHighlightFields();

             HighlightField highlightFieldTile = highlightFields.get("title" );
              if (highlightFieldTile != null) {
                 Text[] fragments = highlightFieldTile.getFragments();
                 String name = "";
                  for (Text text : fragments ) {
                       name += text;
                 }
                  source.put( "title", name );// 设置title高亮字段
             }
             HighlightField highlightFieldDescribe = highlightFields.get("describe" );
              if (highlightFieldDescribe != null) {
                 Text[] fragments = highlightFieldDescribe.getFragments();
                 String name = "";
                  for (Text text : fragments ) {
                       name += text;
                 }
                  source.put( "describe", name ); // 设置describe高亮字段
             }

              dataList.add( source);
         }
          dataMap.put( "count", totalCount );
          dataMap.put( "dataList", dataList );
          return dataMap ;
    }
    


7:下面就可以使用 jetty进行启动。
    如何安装 jetty
         参考:http://eclipse-jetty.github.io/installation.html
8:访问:http://localhost:8080/article
   
    
9:如果使用 tomcat启动这个项目
    注意: jdk使用1.7   tomcat使用7.0

相关文章推荐

elasticsearch整合hbase步骤

elasticsearch整合hbase步骤

使用Elasticsearch建索引提高HBase检索速度的探索

一个多月对Elasticsearch的探索,现将其中的坑列出来,以免后面再忘记。 首先在这里申明数据量: 记录数:1914531 用户量:62749 可以看到数据量还是很小的。数据是一个用户在某个时间...

通过HBase Observer同步数据到ElasticSearch

通过HBase Observer同步数据到ElasticSearchObserver希望解决的问题 HBase是一个分布式的存储体系,数据按照RowKey分成不同的Region,再分...
  • hhl2046
  • hhl2046
  • 2016年09月18日 16:37
  • 556

通过HBase Observer同步数据到ElasticSearch

通过HBase Observer同步数据到ElasticSearch Observer希望解决的问题 HBase是一个分布式的存储体系,数据按照RowKey分成不同的Region,再分...

Hbase1.2数据同步到ElasticSearch2.x

最近公司业务调整 需要把原有的数据从关系型数据库调整到Hbase中,奈何Hbase做查询性能并不是那么优秀 所以准备集成Es做二级索引 在网上找了一大堆的资料 全部都是ElasticSearch1....
  • xj90314
  • xj90314
  • 2016年10月14日 17:14
  • 1169

Elasticsearch+Hbase实现海量数据秒回查询

首先祝大家2017新年快乐,我今天分享的是通过ElasticSearch与hbase进行整合的一个搜索案例,这个案例涉及的技术面比较广,首先你得有JAVAEE的基础,要会SSM,而且还要会大数据中的h...
  • sdksdk0
  • sdksdk0
  • 2017年01月01日 16:38
  • 7787

使用协处理器将HBase数据索引到Elasticsearch集群

HBaseCon 2013: Using Coprocessors to Index Columns in an Elasticsearch Cluster 使用协处理器将列数据索引到Elastic...
  • cmdssd1
  • cmdssd1
  • 2016年06月24日 17:57
  • 1595

HBase建立二级索引的一些解决方案

HBase的一级索引就是rowkey,我们只能通过rowkey进行检索。如果我们相对hbase里面列族的列列进行一些组合查询,就需要采用HBase的二级索引方案来进行多条件的查询。 常见的二级索引方...

Elasticsearch对Hbase中的数据建索引实现海量数据快速查询

我已将项目代码上传,地址https://github.com/xiazi123/Test 一、将项目导入myeclipse中 方法1: 将下载好的文件(是解压es_hbase6文件夹而不是Te...

Elasticsearch+Hbase实现海量数据秒回查询

文章出处:http://blog.csdn.net/sdksdk0/article/details/53966430 作者:朱培      ID:sdksdk0      ------------...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ES008-Elasticsearch+hbase整合
举报原因:
原因补充:

(最多只允许输入30个字)