ElasticSearch

ElasticSearch

elasticsearch 跟 MySQL 中定义资料格式的角色关系对照表如下

MySQL             elasticsearch 
database          index 
table             type 

table schema mapping

row                          document 
field                         field  

ElasticSearch 注意事项

http://ubuntu1:9200/28s/_search

28s表示index

http://ubuntu1:5601 是Kibana的访问url

ElasticSearch + HBase Demo

此项目的Demo有一个问题,即建完索引后,多个条件查询只有符合http://ubuntu1:9200/28s/_search的才可以查询,但是单个条件都能搜索到,很奇怪???不知道是建索引时的问题,还是查询时的问题,求大神指教,本人使用的ElasticSearch版本是5.5

获取客户端

public static TransportClient getClient() {  
     if(client!=null){  
         return client;  
     }  
     Settings settings = Settings.builder().put("cluster.name", "ubuntu").build();  
     try {  
         client = new PreBuiltTransportClient(settings) 
                 .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("ubuntu1"), 9300))  
                 .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("ubuntu3"), 9300));  
     } catch (UnknownNamedObjectException | UnknownHostException e) {  
         e.printStackTrace();  
     }  
     return client;  
 }  

添加索引

//添加数据即添加索引
 public static String addIndex(String index, String type, HashMap<String,Object> hashMap,String id){   
     IndexResponse response = getClient().prepareIndex(index, type, id).setSource(hashMap).get();  
     return response.getId();  
 } 

get操作

//根据_id来获取一条document即记录
 public static void get(){
     GetResponse response = client.prepareGet(HbaseConfig.index, HbaseConfig.type, "54371").get();
     System.out.println(response.toString()+response.getId());
     for(String s : response.getFields().keySet()){
         System.out.println(s);
     }
 }

全表搜索

//搜索所有的ducument,需要索引名称和类型
 public static void findAll() throws UnknownHostException {
     SearchResponse rs = client.prepareSearch(HbaseConfig.index).setTypes(HbaseConfig.type)
             .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
             .setExplain(true).execute().actionGet();
     System.out.println(rs.getHits().getTotalHits());
     // 遍历查询结果
     for (SearchHit hit : rs.getHits().getHits()){
         System.out.println(hit.getId());
     }
 }

删除索引

//删除索引
 public static void delete(){
     DeleteIndexResponse dResponse = client.admin().indices().prepareDelete(HbaseConfig.index)
             .execute().actionGet();
     System.out.println(dResponse.isAcknowledged());
 }

单个条件搜索

//单个条件检索,输入field即column和value
 public static void search(String colum,String value){

     SearchResponse response = client.prepareSearch(HbaseConfig.index)
               .setTypes(HbaseConfig.type)
               .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
               .setQuery(QueryBuilders.termQuery(colum, value))
               .setSize(100)
               .setExplain(true)
               .get();
        SearchHits shs = response.getHits();
        //根据查询到的rowkeys构建Get
        List<Get> gets = new ArrayList<Get>();
        System.out.println("num:" + shs.getTotalHits());
        for(SearchHit hit : shs){
            String rowkey = hit.getId();
            System.out.println(rowkey);
            Get get = new Get(Bytes.toBytes(rowkey));
            gets.add(get);

        }
        Result[] rs = null;
        try {
            rs = HbaseUtil.getInstance().getTable(HbaseConfig.tableName).get(gets);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
        //打印hbase表查询结果
        for(Result r:rs){
            System.out.println(r); 
        }
 }

多个条件“与” 就是这个有问题!!!

//多个条件“与”检索,输入field即column和value
 public static void andSearch(String column1,String value1, String column2, String value2){
     QueryBuilder qb = QueryBuilders.boolQuery()
             .must(QueryBuilders.termQuery(column1, value1))
             .must(QueryBuilders.termQuery(column2, value2));

     SearchResponse response = client.prepareSearch(HbaseConfig.index)
               .setTypes(HbaseConfig.type)
               .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
               .setQuery(qb)
               .setSize(100)
               .get();
        SearchHits shs = response.getHits();
        System.out.println("num:" + shs.getTotalHits());

        //根据查询到的rowkeys构建Get
        List<Get> gets = new ArrayList<Get>();
        for(SearchHit hit : shs){
            String rowkey = hit.getId();
            System.out.println(rowkey);
            Get get = new Get(Bytes.toBytes(rowkey));
            gets.add(get);

        }
        Result[] rs = null;
        try {
            rs = HbaseUtil.getInstance().getTable(HbaseConfig.tableName).get(gets);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
        //打印hbase表查询结果
        for(Result r:rs){
            System.out.println(r); 
        }
 }

多个条件“或”

//多个条件"或"检索,输入field即column和value
 public static void multiSearch(String column1, String value1, String column2, String value2){
     SearchRequestBuilder srb1 = client.prepareSearch(HbaseConfig.index)
                                       .setTypes(HbaseConfig.type)
                                       .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                                       .setSize(100)
                                       .setQuery(QueryBuilders.termQuery(column1, value1));

     SearchRequestBuilder srb2 = client.prepareSearch(HbaseConfig.index)
               .setTypes(HbaseConfig.type)
               .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
               .setSize(100)
               .setQuery(QueryBuilders.termQuery(column2, value2));


     MultiSearchResponse responses = client.prepareMultiSearch()
                                     .add(srb1)
                                     .add(srb2)
                                     .get();
     for(MultiSearchResponse.Item item : responses.getResponses()){
         SearchResponse response = item.getResponse();
         SearchHits shs = response.getHits();
        //根据查询到的rowkeys构建Get
        List<Get> gets = new ArrayList<Get>();
        for(SearchHit hit : shs){
            String rowkey = hit.getId();
            System.out.println(rowkey);
            Get get = new Get(Bytes.toBytes(rowkey));
            gets.add(get);

        }
        Result[] rs = null;
        try {
            rs = HbaseUtil.getInstance().getTable(HbaseConfig.tableName).get(gets);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
         //打印hbase表查询结果
         for(Result r:rs){
             System.out.println(r); 
         }
     }

 }
Share