安装和简单操作: windows下操作elasticsearch(一)
聚合查询后分组分页的问题
sql中条件查询后分组再取前几条数据很简单,但是elasticsearch相对来说复杂一点。
比如:select * from user where address like ‘%上海%’ group by name limit 10
下面是elasticsearch的写法:
SearchRequestBuilder requestBuilder = client.prepareSearch("user");
requestBuilder.setQuery(QueryBuilders.matchPhraseQuery("address", "李"));
requestBuilder.addAggregation(AggregationBuilders.terms("user_id").field("user_id.keyword").size(20));
//requestBuilder.setFrom(0);
//requestBuilder.setSize(20);
SearchResponse response = requestBuilder.execute().actionGet();
注:
requestBuilder.addAggregation:添加分组的字段
user_id:字段别名
user_id.keyword:分组的字段
requestBuilder.setSize(20):聚合查询后的分页,在分组的前面
size(20):分组后取前20条
集群
1、修改配置文件:config\elasticsearch.yml,最下面添加:
cluster.name: elasticsearch_6.6.1
node.name: master
network.host: 0.0.0.0
http.port: 9200
http.cors.enabled: true
http.cors.allow-origin: "*"
node.master: true
node.data: true
discovery.zen.ping.unicast.hosts: ["192.0.0.64","192.0.0.77"]
discovery.zen.minimum_master_nodes: 1
2、把elasticsearch安装文件夹复制后修改文件夹名称为:slave
修改文件:slave\config\elasticsearch.yml
node.name: slave
参数说明:
cluster.name:集群名称
node.name:节点名称
network.host:访问ip
http.cors.allow-origin:跨域
node.master:是否主节点。主节点挂点后在子节点中选一个当主节点(为true时)
node.data:是否数据节点
discovery.zen.ping.unicast.hosts:节点ip
discovery.zen.minimum_master_nodes:福主节点个数
3、防火墙问题
生产环境中,由于防火墙是开启状态,需要节点服务器开放9200、9300端口
4、java客户端调整
TransportClient client = null;
try {
Settings settings = Settings.builder().put("cluster.name", "elasticsearch_6.6.1").put("client.transport.sniff", true).build();
client = new PreBuiltTransportClient(settings)
.addTransportAddress(new TransportAddress(InetAddress.getByName("192.0.0.77"), 9300))
.addTransportAddress(new TransportAddress(InetAddress.getByName("192.0.0.64"), 9300));
} catch (Exception e) {
e.printStackTrace();
}
注:
client.transport.sniff:找到集群的全部ip
addTransportAddress:配置节点ip和端口,添加集群各个节点,防止单点故障