Java 操作 Es 查询操作

Java 操作 Es 查询操作

学习参考文章

  • Es 的核心查询操作: 检索查询,聚合查询
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
package com.demo;


import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.aggregations.AggregationBuilder;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.metrics.avg.Avg;
import org.elasticsearch.search.aggregations.metrics.max.Max;
import org.elasticsearch.search.aggregations.metrics.min.Min;
import org.elasticsearch.search.aggregations.metrics.sum.Sum;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.junit.Before;
import org.junit.Test;

import java.net.InetAddress;
import java.util.Map;

/**
* 参考文章:
* https://www.jianshu.com/p/a584848da515
*
* es 服务:
* http://localhost:9200/
* 来查看 : cluster.name
*
* kibana 服务:
* http://localhost:5601/app/kibana#/dev_tools/console?_g=()
* 来验证数据是否正确
*/

@Slf4j
public class QueryTest {


TransportClient transportClient = null;

private final static String hostName = "localhost";
private final static Integer port = 9300;
private final static Integer poolSize = 5;

private final static String index = "db-1";
private final static String type = "tab-1";




@Before
public void init() {
try {
// 配置信息
Settings esSetting = Settings.builder()
.put("cluster.name", "docker-cluster") //集群名字
// .put("client.transport.sniff", true)//增加嗅探机制,找到ES集群
.put("thread_pool.search.size", poolSize)//增加线程池个数,暂时设为5
.build();
//配置信息Settings自定义
transportClient = new PreBuiltTransportClient(esSetting);
TransportAddress transportAddress = new TransportAddress(InetAddress.getByName(hostName), port);
transportClient.addTransportAddresses(transportAddress);
} catch (Exception e) {
log.error("elasticsearch TransportClient create error!!", e);
}
}






/**
* 根据条件进行查询的操作
* match query 知道分词器的存在,会对filed进行分词操作,然后再查询
* match_all: 查询所有文档
* multi_match: 可以指定多个字段
* match_phrase: 短语匹配查询,ElasticSearch引擎首先分析(analyze)查询字符串,从分析后的文本中构建短语查询,这意味着必须匹配短语中的所有分词,并且保证各个分词的相对位置不变
*/
@Test
public void matchQuery() {


// 对 age = 28 匹配
QueryBuilder fieldQuery = QueryBuilders.matchQuery("age", 98);
log.info("对 age = 28 匹配");
mathquery(fieldQuery);
log.info("查询所有");
QueryBuilder allQuery = QueryBuilders.matchAllQuery();
mathquery(allQuery);
log.info("matchPhrase查询");
log.info("词语匹配短语 : 内容 -->");
QueryBuilder matchQuery = QueryBuilders.matchPhraseQuery("content", "内容 -->1");
mathquery(matchQuery);



}


/**
* term query会去倒排索引中寻找确切的term,它并不知道分词器的存在。这种查询适合keyword 、numeric、date
* term:查询某个字段里含有某个关键词的文档
* terms:查询某个字段里含有多个关键词的文档
*/
@Test
public void termTest() {

//content 字段有 "90" 字符
QueryBuilder oneTermBuilder = QueryBuilders.termQuery("content", "90");
mathquery(oneTermBuilder);

log.info("---------");

//contetn 字段有 "内容1" 或 "97" 字符
QueryBuilder termsBuilder = QueryBuilders.termsQuery("content", "内容1", "97");
mathquery(termsBuilder);

}


/**
* 聚合查询:
* 求最大值 最小值 平均值 和值
*/
@Test
public void jhTest() {

//最大值
String maxName = "ageMax";
AggregationBuilder max = AggregationBuilders.max(maxName).field("age");
log.info(" query DSL : {}", max.toString());
SearchResponse sr = transportClient.prepareSearch(index).addAggregation(max).get();
Max maxValue = sr.getAggregations().get(maxName);

log.info(" data : {}", maxValue.toString());
log.info(" max value : {}", maxValue.getValue());


//最小值
String minName = "ageMin";
AggregationBuilder min = AggregationBuilders.min(minName).field("age");
log.info(" query DSL : {}", min.toString());
SearchResponse mrep = transportClient.prepareSearch(index).addAggregation(min).get();
Min minValue = mrep.getAggregations().get(minName);

log.info(" data : {}", minValue.toString());
log.info(" min value : {}", minValue.getValue());


//平均值
String avgName = "avgName";
AggregationBuilder avg = AggregationBuilders.avg(avgName).field("age");
log.info(" query DSL : {}", avg.toString());
SearchResponse avgrep = transportClient.prepareSearch(index).addAggregation(avg).get();
Avg avgValue = avgrep.getAggregations().get(avgName);

log.info(" data : {}", avgValue.toString());
log.info(" avg value : {}", avgValue.getValue());



//求和
String sumName = "avgName";
AggregationBuilder sum = AggregationBuilders.sum(sumName).field("age");
log.info(" query DSL : {}", sum.toString());
SearchResponse sumrep = transportClient.prepareSearch(index).addAggregation(sum).get();
Sum sumValue = sumrep.getAggregations().get(sumName);

log.info(" data : {}", sumValue.toString());
log.info(" avg value : {}", sumValue.getValue());


/**
* 返回结果:
*
* 00:03:15.444 [main] INFO com.demo.QueryTest - query DSL : {"ageMax":{"max":{"field":"age"}}}
* 00:03:15.556 [main] INFO com.demo.QueryTest - data : {"ageMax":{"value":109.0}}
* 00:03:15.556 [main] INFO com.demo.QueryTest - max value : 109.0
* 00:03:15.556 [main] INFO com.demo.QueryTest - query DSL : {"ageMin":{"min":{"field":"age"}}}
* 00:03:15.572 [main] INFO com.demo.QueryTest - data : {"ageMin":{"value":10.0}}
* 00:03:15.572 [main] INFO com.demo.QueryTest - min value : 10.0
* 00:03:15.572 [main] INFO com.demo.QueryTest - query DSL : {"avgName":{"avg":{"field":"age"}}}
* 00:03:15.587 [main] INFO com.demo.QueryTest - data : {"avgName":{"value":67.77697841726619}}
* 00:03:15.587 [main] INFO com.demo.QueryTest - avg value : 67.77697841726619
* 00:03:15.588 [main] INFO com.demo.QueryTest - query DSL : {"avgName":{"sum":{"field":"age"}}}
* 00:03:15.607 [main] INFO com.demo.QueryTest - data : {"avgName":{"value":9421.0}}
* 00:03:15.607 [main] INFO com.demo.QueryTest - avg value : 9421.0
*/

}



private void mathquery(QueryBuilder fieldQuery) {
log.error(" query 语句 : {}", fieldQuery.toString());
SearchResponse response = transportClient.prepareSearch(index).setQuery(fieldQuery).get();
for(SearchHit hit:response.getHits()) {
Map<String, Object> map = hit.getSourceAsMap();
log.info("query data : {}", JSON.toJSONString(map));
}
}




}
感谢您的阅读,本文由 左之右 版权所有。如若转载,请注明出处:左之右(https://zuoyoulai.github.io/2020/01/31/java-es-02/
java 操作 Es 的 CURD 操作
Windows安装SecureCRT