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

hbase和es在搜索场景的应用

背景     最近有个简单的需求,离线数据挖掘得出的标签需要支持online的查询,查询场景比较简单,支持按照单个id或者多个id批量查询,tp99需要在200ms,批量的时候id 集合的大小不会超过...
  • xyl520
  • xyl520
  • 2017年08月02日 01:04
  • 736

elasticsearch整合hbase步骤

elasticsearch整合hbase步骤
  • high2011
  • high2011
  • 2016年06月07日 09:48
  • 4058

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

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

使用elasticsearch提高hbase基于列的查询效率

网上能查到的hbase提高基于列的查询效率a
  • blacklau
  • blacklau
  • 2014年10月04日 19:51
  • 5069

HBase数据同步到ElasticSearch的方案

ElasticSearch的River机制 ElasticSearch自身提供了一个River机制,用于同步数据。 这里可以找到官方目前推荐的River: http://www.elasticsear...
  • hengyunabc
  • hengyunabc
  • 2014年11月15日 16:22
  • 21410

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

文章出处:http://blog.csdn.net/sdksdk0/article/details/53966430 作者:朱培      ID:sdksdk0      ------------...
  • qq_26803795
  • qq_26803795
  • 2017年01月03日 14:53
  • 4289

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

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

Elasticsearch 架构

Elasticsearch 是最近两年异军突起的一个兼有搜索引擎和NoSQL数据库功能的开源系统,基于Java/Lucene构建。最近研究了一下,感觉 Elasticsearch 的架构以及其开源的生...
  • u010039929
  • u010039929
  • 2017年09月06日 08:33
  • 215

Hbase1.2数据同步到ElasticSearch2.x

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

面向高稳定,高性能之-Hbase数据实时同步到ElasticSearch(之二)

我在这篇focus在两个主题:如何支持多表同步共用一个jar包,如何持续稳定的与ES交互写入数据。 在 《 使用Hbase协作器(Coprocessor)同步数据到ElasticSearch》中作...
  • zhulangfly
  • zhulangfly
  • 2017年06月22日 15:06
  • 1626
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ES008-Elasticsearch+hbase整合
举报原因:
原因补充:

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