基于员工信息的CRUD操作
/**
* 员工增删改查的应用程序
*
* @author Administrator
*
*/
public class EmployeeCRUDApp {
@SuppressWarnings({ "unchecked", "resource" })
public static void main(String[] args) throws Exception {
// 先构建client
Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
TransportClient client = new PreBuiltTransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));
// createEmployee(client);
// getEmployee(client);
// updateEmployee(client);
// deleteEmployee(client);
client.close();
}
/**
* 创建员工信息(创建一个document)
*
* @param client
*/
private static void createEmployee(TransportClient client) throws Exception {
IndexResponse response = client.prepareIndex("company", "employee", "1")
.setSource(XContentFactory.jsonBuilder().startObject().field("name", "jack").field("age", 27)
.field("position", "technique").field("country", "china").field("join_date", "2017-01-01")
.field("salary", 10000).endObject())
.get();
System.out.println(response.getResult());
}
/**
* 获取员工信息
*
* @param client
* @throws Exception
*/
private static void getEmployee(TransportClient client) throws Exception {
GetResponse response = client.prepareGet("company", "employee", "1").get();
System.out.println(response.getSourceAsString());
}
/**
* 修改员工信息
*
* @param client
* @throws Exception
*/
private static void updateEmployee(TransportClient client) throws Exception {
UpdateResponse response = client.prepareUpdate("company", "employee", "1")
.setDoc(XContentFactory.jsonBuilder().startObject().field("position", "technique manager").endObject())
.get();
System.out.println(response.getResult());
}
/**
* 删除 员工信息
*
* @param client
* @throws Exception
*/
private static void deleteEmployee(TransportClient client) throws Exception {
DeleteResponse response = client.prepareDelete("company", "employee", "1").get();
System.out.println(response.getResult());
}
}
/**
* 员工搜索应用程序
*
* @author Administrator
*
*/
public class EmployeeSearchApp {
@SuppressWarnings({ "unchecked", "resource" })
public static void main(String[] args) throws Exception {
Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
TransportClient client = new PreBuiltTransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));
prepareData(client);
// executeSearch(client);
client.close();
}
/**
* 执行搜索操作
*
* @param client
*/
private static void executeSearch(TransportClient client) {
SearchResponse response = client.prepareSearch("company").setTypes("employee")
.setQuery(QueryBuilders.matchQuery("position", "technique"))
.setPostFilter(QueryBuilders.rangeQuery("age").from(30).to(40)).setFrom(0).setSize(1).get();
SearchHit[] searchHits = response.getHits().getHits();
for (int i = 0; i < searchHits.length; i++) {
System.out.println(searchHits[i].getSourceAsString());
}
}
/**
* 准备数据
*
* @param client
*/
private static void prepareData(TransportClient client) throws Exception {
client.prepareIndex("company", "employee", "1")
.setSource(XContentFactory.jsonBuilder().startObject().field("name", "jack").field("age", 27)
.field("position", "technique software").field("country", "china")
.field("join_date", "2017-01-01").field("salary", 10000).endObject())
.get();
client.prepareIndex("company", "employee", "2")
.setSource(XContentFactory.jsonBuilder().startObject().field("name", "marry").field("age", 35)
.field("position", "technique manager").field("country", "china")
.field("join_date", "2017-01-01").field("salary", 12000).endObject())
.get();
client.prepareIndex("company", "employee", "3")
.setSource(XContentFactory.jsonBuilder().startObject().field("name", "tom").field("age", 32)
.field("position", "senior technique software").field("country", "china")
.field("join_date", "2016-01-01").field("salary", 11000).endObject())
.get();
client.prepareIndex("company", "employee", "4")
.setSource(XContentFactory.jsonBuilder().startObject().field("name", "jen").field("age", 25)
.field("position", "junior finance").field("country", "usa").field("join_date", "2016-01-01")
.field("salary", 7000).endObject())
.get();
client.prepareIndex("company", "employee", "5")
.setSource(XContentFactory.jsonBuilder().startObject().field("name", "mike").field("age", 37)
.field("position", "finance manager").field("country", "usa").field("join_date", "2015-01-01")
.field("salary", 15000).endObject())
.get();
}
}
基于员工新的聚合查询操作
/**
* 员工聚合分析应用程序
*
* @author Administrator
*
*/
public class EmployeeAggrApp {
@SuppressWarnings({ "unchecked", "resource" })
public static void main(String[] args) throws Exception {
Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
TransportClient client = new PreBuiltTransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));
SearchResponse searchResponse = client.prepareSearch("company")
.addAggregation(AggregationBuilders.terms("group_by_country").field("country")
.subAggregation(AggregationBuilders.dateHistogram("group_by_join_date").field("join_date")
.dateHistogramInterval(DateHistogramInterval.YEAR)
.subAggregation(AggregationBuilders.avg("avg_salary").field("salary"))))
.execute().actionGet();
Map<String, Aggregation> aggrMap = searchResponse.getAggregations().asMap();
StringTerms groupByCountry = (StringTerms) aggrMap.get("group_by_country");
Iterator<Bucket> groupByCountryBucketIterator = groupByCountry.getBuckets().iterator();
while (groupByCountryBucketIterator.hasNext()) {
Bucket groupByCountryBucket = groupByCountryBucketIterator.next();
System.out.println(groupByCountryBucket.getKey() + ":" + groupByCountryBucket.getDocCount());
Histogram groupByJoinDate = (Histogram) groupByCountryBucket.getAggregations().asMap()
.get("group_by_join_date");
Iterator<org.elasticsearch.search.aggregations.bucket.histogram.Histogram.Bucket> groupByJoinDateBucketIterator = groupByJoinDate
.getBuckets().iterator();
while (groupByJoinDateBucketIterator.hasNext()) {
org.elasticsearch.search.aggregations.bucket.histogram.Histogram.Bucket groupByJoinDateBucket = groupByJoinDateBucketIterator
.next();
System.out.println(groupByJoinDateBucket.getKey() + ":" + groupByJoinDateBucket.getDocCount());
Avg avg = (Avg) groupByJoinDateBucket.getAggregations().asMap().get("avg_salary");
System.out.println(avg.getValue());
}
}
client.close();
}
}
注:聚合查询的时候可能出现问题:fielddata需要变为true,这个时候需要手动添加mapping
GET /company/_mapping/employee
{
"company": {
"mappings": {
"employee": {
"properties": {
"age": {
"type": "long"
},
"country": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"join_date": {
"type": "date"
},
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"position": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"salary": {
"type": "long"
}
}
}
}
}
}
Delete /company
上面查出来以后进行截取,修改"fielddata": true
PUT /company
{
"mappings": {
"employee": {
"properties": {
"age": {
"type": "long"
},
"country": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
},
"fielddata": true
},
"join_date": {
"type": "date"
},
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"position": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"salary": {
"type": "long"
}
}
}
}
}
elasticsearch-5.2.0获取代码:
import org.apache.commons.lang.StringUtils;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.springframework.stereotype.Component;
import com.ad.utils.ConfigUtil;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* Created by wangyunpeng on 2017/8/5.
*/
@Component
public class ElasticSearchClient {
@Resource(type=ConfigUtil.class)
private ConfigUtil configUtil;
private Map<String, Client> clientMap = new ConcurrentHashMap<String, Client>();
/*1.@PostConstruct说明
被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Serclet的inti()方法。被@PostConstruct修饰的方法会在构造函数之后,init()方法之前运行。
2.@PreConstruct说明
被@PreConstruct修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。被@PreConstruct修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前。
*/
@PostConstruct
public void init() {
init(configUtil.clusterName, configUtil.clusterIpAddress);
//init(configUtil.clusterName2, configUtil.clusterIpAddress2);
}
private void init(String clusterName, String clusterIpAddress){
try {
Settings settings = Settings.builder()
.put("cluster.name", clusterName)
.build();
addClient(settings, getAllAddress(clusterIpAddress));
}catch(Exception e){
e.printStackTrace();
}
}
/**
* 得所有的地址端口
* @param ips
* @return
* @throws Exception
*/
public List<TransportAddress> getAllAddress(String ips)throws Exception {
List<TransportAddress> addressList = new ArrayList<TransportAddress>();
if(StringUtils.isNotBlank(ips)&&ips.contains(",")){
String[] ipaddr=ips.split(",");
for (int i=0;i<ipaddr.length;i++) {
addressList.add(new TransportAddress(InetAddress.getByName(ipaddr[i]),configUtil.clusterPort));
}
}else{
addressList.add(new TransportAddress(InetAddress.getByName(ips),configUtil.clusterPort));
}
return addressList;
}
/**
* 添加es客户端
* @param setting
* @param transportAddress
* @throws Exception
*/
public void addClient(Settings setting, List<TransportAddress> transportAddress) throws Exception{
TransportClient client = new PreBuiltTransportClient(setting);
for(int i=0;i<transportAddress.size();i++){
client.addTransportAddress(transportAddress.get(i));
}
clientMap.put(setting.get("cluster.name"), client);
}
public Client getClient(String clusterName) {
return clientMap.get(clusterName);
}
}
import org.apache.commons.lang.StringUtils;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.springframework.stereotype.Component;
import com.ad.utils.ConfigUtil;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* Created by wangyunpeng on 2017/8/5.
*/
@Component
public class ElasticSearchClient {
@Resource(type=ConfigUtil.class)
private ConfigUtil configUtil;
private Map<String, Client> clientMap = new ConcurrentHashMap<String, Client>();
/*1.@PostConstruct说明
被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Serclet的inti()方法。被@PostConstruct修饰的方法会在构造函数之后,init()方法之前运行。
2.@PreConstruct说明
被@PreConstruct修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。被@PreConstruct修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前。
*/ @PostConstruct
public void init() {
init(configUtil.clusterName, configUtil.clusterIpAddress);
//init(configUtil.clusterName2, configUtil.clusterIpAddress2);
}
private void init(String clusterName, String clusterIpAddress){
try {
Settings settings = Settings.builder()
.put("cluster.name", clusterName)
.build();
addClient(settings, getAllAddress(clusterIpAddress));
}catch(Exception e){
e.printStackTrace();
}
/*try {
Settings settings = TransportClient.builder().build().settings().builder().put("cluster.name", clusterName).build();
addClient(settings, getAllAddress(clusterIpAddress));
}catch(Exception e){
e.printStackTrace();
}*/
}
/**
* 得所有的地址端口
* @param ips
* @return
* @throws Exception
*/
public List<InetSocketTransportAddress> getAllAddress(String ips)throws Exception {
List<InetSocketTransportAddress> addressList = new ArrayList<InetSocketTransportAddress>();
if(StringUtils.isNotBlank(ips)&&ips.contains(",")){
String[] ipaddr=ips.split(",");
for (int i=0;i<ipaddr.length;i++) {
addressList.add(new InetSocketTransportAddress(InetAddress.getByName(ipaddr[i]),configUtil.clusterPort));
}
}else{
addressList.add(new InetSocketTransportAddress(InetAddress.getByName(ips),configUtil.clusterPort));
}
return addressList;
}
/**
* 添加es客户端
* @param setting
* @param transportAddress
* @throws Exception
*/
/*TransportClient client = new PreBuiltTransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));*/
public void addClient(Settings setting, List<InetSocketTransportAddress> transportAddress) throws Exception{
TransportClient client = new PreBuiltTransportClient(setting);
//TransportClient client = TransportClient.builder().settings(setting).build();
for(int i=0;i<transportAddress.size();i++){
client.addTransportAddress(transportAddress.get(i));
}
clientMap.put(setting.get("cluster.name"), client);
}
public Client getClient(String clusterName) {
return clientMap.get(clusterName);
}
}
maven依赖:
<!-- elasticsearch package -->
<!-- <dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>5.2.2</version>
</dependency> -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>6.0.0</version>
</dependency>
测试代码:
import java.io.IOException;
import java.util.UUID;
import javax.annotation.Resource;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import com.ad.base.AlbumIndexField;
import com.ad.utils.ConfigUtil;
import com.ad.utils.ExceptionUtil;
import net.sf.json.JSONObject;
@Component
public class ElasticSaveServiceImpl implements ElasticSaveService {
private static final Logger logger = LoggerFactory.getLogger(ElasticSearchServiceImpl.class);
@Resource(type = ElasticSearchClient.class)
private ElasticSearchClient elasticSearchClient;
@Resource(type = ConfigUtil.class)
private ConfigUtil configUtil;
/**
* @return
*/
public Client getClient(String clusterName) {
try {
return elasticSearchClient.getClient(clusterName);
} catch (Exception e) {
logger.error("ES获取client失败 :" + ExceptionUtil.stackTrace(e));
return null;
}
}
@Override
public void executeSave(String clusterName, String json1) {
JSONObject json = JSONObject.fromObject(json1);
String documentId = (UUID.randomUUID().toString().replaceAll("-", ""));
IndexResponse response;
try {
response = this.getClient(clusterName).prepareIndex(configUtil.indexName, configUtil.indexType, documentId)
.setSource(XContentFactory.jsonBuilder()
.startObject()
.field(AlbumIndexField.FID, json.getString("fid"))
.endObject())
.get();
} catch (IOException e) {
logger.error("===AdInfoConsumer consumer is exception", e);
//e.printStackTrace();
}
}
}
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。