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);
}
}
}