ElasticSearch javaAPI demo示例

欢迎关注“程序杂货铺”公众号,里面有精彩内容,欢迎大家收看^_^

一.数据实体:

ID:自增主键
ID:ID值
VALUE_DAY:该机器当天的值
GROUPNAME:组名
TYPE_MACHINE:机器类型
DATE:日期
TYPE:类型

二.Java代码:

1.创建客户端:

package elasticsearch.util;

import java.net.InetAddress;

import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.transport.InetSocketTransportAddress;


public class ClientUtil {
	private Client client;
	public ClientUtil() {
		try {
			init();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 初始化客户端
	 * */
	private void init() throws Exception {
		byte[] bs = new byte[] { (byte) 192, (byte) 168, (byte)52, (byte)130 }; 
		this.client = TransportClient.builder().build()  
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByAddress(bs), 9300));
	}

	public Client getClient() {
		return client;
	}

}

2.创建索引,主要创建mapper

package elasticsearch.service;

import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.IndicesAdminClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;

public class CreateIndex {
	
	/**
	 * 创建空索引  默认setting 无mapping
	 * @param client
	 * @param index
	 * @return
	 */
	public boolean createSimpleIndex(Client client, String index){
	    IndicesAdminClient indicesAdminClient = client.admin().indices();
	    CreateIndexResponse response = indicesAdminClient.prepareCreate(index).get();
	    return response.isAcknowledged();
	}
	
	/**
	 * 创建索引 指定setting,创建mapper
	 * @param client
	 * @param index
	 * @return
	 */
	public boolean createIndex(Client client, String index){
	    // settings
	    Settings settings = Settings.builder()
	    		.put("index.number_of_shards", 1)
	    		.put("index.number_of_replicas", 0)
	    		//.put("cluster.name", "poc")
	    		//.put("node.name", "node1")
	    		//.put("client.transport.ignore_cluster_name", true)
	    		//.put("node.client", true)
	    		//.put("client.transport.sniff", true)
	    		.build();
	    // mapping
	    XContentBuilder mappingBuilder;
	    try {
	        mappingBuilder = XContentFactory.jsonBuilder()
	                .startObject()
	                    .startObject(index)
	                        .startObject("properties")
	                            .startObject("ID").field("type", "string").field("store", "yes").endObject()
	                            .startObject("IP").field("type", "string").field("store", "yes").endObject()
	                            .startObject("VALUE_DAY").field("type", "string").field("store", "yes").endObject()
	                            .startObject("GROUPNAME").field("type", "string").field("store", "yes").endObject()
	                            .startObject("TYPE_MACHINE").field("type", "string").field("store", "yes").endObject()
	                            .startObject("DATE").field("type", "string").field("store", "yes").endObject()
	                            .startObject("TYPE").field("type", "string").field("store", "yes").endObject()
	                        .endObject()
	                    .endObject()
	                .endObject();
	    } catch (Exception e) {
	        System.out.println("--------- createIndex 创建 mapping 失败:" + e);
	        return false;
	    }
	    IndicesAdminClient indicesAdminClient = client.admin().indices();
	    CreateIndexResponse response = indicesAdminClient.prepareCreate(index)
	            .setSettings(settings)
	            .addMapping(index, mappingBuilder)
	            .get();
	    return response.isAcknowledged();
	}
}

3.将元数据写入索引文件

(1)获取元数据

package elasticsearch.util;

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.json.JSONObject;

public class DataFactory {
	public static List<String> dataCreater(String path) throws Exception {
		
		FileReader fr = new FileReader(path);
		BufferedReader br = new BufferedReader(fr);
		String line=null;
		List<String> dataList = new ArrayList<String>();
		
		while((line = br.readLine()) != null){
			String[] data = line.split("\t");
			Map<String, String> map = new HashMap<String, String>();
			map.put("ID", data[0]);
			map.put("IP", data[1]);
			map.put("VALUE_DAY", data[2]);
			map.put("GROUPNAME", data[3]);
			map.put("TYPE_MACHINE", data[4]);
			map.put("DATE", data[5]);
			map.put("TYPE", data[6]);
			JSONObject jsonObject = JSONObject.fromObject(map);
			String str = jsonObject.toString();
			dataList.add(str);
		}
		
		br.close();
		fr.close();
		
		return dataList;
	}
}

(2)数据写入索引

package elasticsearch.service;

import java.util.List;

import org.elasticsearch.action.index.IndexRequestBuilder;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.Client;

import elasticsearch.util.DataFactory;

public class WriteToIndex {
	
	/**
	 * 数据写入索引
	 * @param client
	 * @param index
	 * @return
	 * @throws Exception 
	 */
	public void write(Client client, String index, String tablename, String filePath) throws Exception{
		
		//创建索引库 需要注意的是.setRefresh(true)这里一定要设置,否则第一次建立索引查找不到数据
        IndexRequestBuilder requestBuilder = client.prepareIndex(index, tablename).setRefresh(true);
		List<String> dataList = DataFactory.dataCreater(filePath);
	    for(String data : dataList){
	    	//System.out.println(data);
	    	requestBuilder.setSource(data).execute().actionGet();
	    }
	}
}

4.查询

package elasticsearch.service;

import java.util.ArrayList;
import java.util.List;

import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;

public class SearchIndex {
	
	/**
	 * 查询全部内容,实现分页查询
	 * */
	public List<String> searchAll(Client client, String index, String table) {
		
		SearchResponse response = client.prepareSearch().setIndices(index).setTypes(table).get();
		int n = (int) response.getHits().totalHits();
		int size = 100;
		List<String> retList = new ArrayList<String>();
		
		for(int i = 0;i < n;){
			response = client.prepareSearch().setIndices(index).setTypes(table).setScroll(TimeValue.timeValueMinutes(2)).setFrom(i).setSize(size).get();
			i += size;
			SearchHits searchHits = response.getHits();
			for (SearchHit hit : searchHits) {
		        retList.add(hit.getSourceAsString());
		    }
		}
		return retList;
	}
	
	/**
	 * 使用过滤器查询,实现分页查询
	 * */
	public List<String> queryByFilter(Client client, String index, String table) {
		
		// 查询groupname为"压力测试"的数据
	    QueryBuilder queryBuilder = QueryBuilders.matchQuery("GROUPNAME", "压力测试");
	    
		SearchResponse response = client.prepareSearch().setIndices(index).setTypes(table).setQuery(queryBuilder).get();
		int n = (int) response.getHits().totalHits();
		System.out.println(n);
		int size = 100;
		List<String> retList = new ArrayList<String>();
		
		response = client.prepareSearch().setIndices(index).setTypes(table).setScroll(TimeValue.timeValueMinutes(5)).setSize(n).setQuery(queryBuilder).get();
		SearchHits searchHits = response.getHits();
		for (SearchHit hit : searchHits) {
	        retList.add(hit.getSourceAsString());
	    }
		
		return retList;
	}

}

5.测试方法

package elasticsearch.test;

import java.util.List;

import org.elasticsearch.client.Client;

import elasticsearch.service.CreateIndex;
import elasticsearch.service.SearchIndex;
import elasticsearch.service.WriteToIndex;
import elasticsearch.util.ClientUtil;

public class test {
	
	/**
	 * 创建索引,主要创建mapper
	 * */
	public static void createIndex(ClientUtil clientUtil) {
		CreateIndex test = new CreateIndex();
		test.createIndex(clientUtil.getClient(), "poc");
	}
	
	/**
	 * 将元数据写入索引文件
	 * */
	public static void insertDataToIndex(ClientUtil clientUtil) {
		WriteToIndex test = new WriteToIndex();
		try {
			test.write(clientUtil.getClient(), "poc", "zabbixmetadata", "data/poc");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 查询
	 * */
	public static void searchIndex(ClientUtil clientUtil) {
		SearchIndex search = new SearchIndex();
		//List<String> ret = search.searchAll(clientUtil.getClient(), "poc", "zabbixmetadata");
		List<String> ret = search.queryByFilter(clientUtil.getClient(), "poc", "zabbixmetadata");
		System.out.println(ret.size());
		System.out.println(ret);
	}

	public static void main(String[] args) throws Exception {
		ClientUtil clientUtil = new ClientUtil();
		//createIndex(clientUtil);        // 1.创建索引文件
		//insertDataToIndex(clientUtil);  // 2.将元数据写入索引
		//searchIndex(clientUtil);        // 3.查询
	}

}

6.备注

详细源代码请见:
http://download.csdn.net/download/u013473512/9998225
https://github.com/Emmitte/ElasticSearch
 
欢迎关注“ 程序杂货铺”公众号,里面有精彩内容,欢迎大家收看^_^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值