ElasticSearch-Rest-Client
Java使用ElasticSearch
1)、9300,TCP
spring-data-elasticsearch:transport-apl.jar;
spfingboot版本不同,transport-api.jar不同,不能适配es版本
7.x已经不建议使用,8以后就要废弃
2)、9200.HTTP
JestClient:非官方,更新慢
Resttemplate: 模拟发HTTP请求,ES很多操作需要自己封装,麻烦
Httpclent:同上
ElasticSearch-Rest-Client:官方RestClient,封装了ES操作,API层次分明,上手简单
最终选择 ElasticSearch-Rest-Clent(elasticSearch-rest-high-level-client)
官方文档
开始整合
1)、创建SpringBoot ES 搜索服务 导入依赖
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.4.2</version>
</dependency>
ElasticSearch-Rest-Client Java High Level REST Client的版本必须小于等于你的elasticsearch版本,建议版本一致
springboot有管理es版本,所以得手动改成当前es版本
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200509224515416.png)
<properties>
<java.version>1.8</java.version>
<elasticsearch.version>7.4.2</elasticsearch.version>
</properties>
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200509224621292.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0RfQV9JX0hfQV9P,size_16,color_FFFFFF,t_70)
2)、注册到nacos
可见 nacos得注册与发现
3)、编写配置,将客户端注入spring容器
/**
* @program: MyMall
* @description: ES配置类
* @author: DAIHAO
* @created: 2020/05/09 22:53
*/
@Configuration
public class EsConfig {
<span class="token annotation punctuation">@Bean</span>
<span class="token keyword">public</span> RestHighLevelClient <span class="token function">esRestClient</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
RestClientBuilder builder <span class="token operator">=</span> null<span class="token punctuation">;</span>
HttpHost host <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">HttpHost</span><span class="token punctuation">(</span><span class="token string">"192.168.175.130"</span><span class="token punctuation">,</span><span class="token number">9200</span><span class="token punctuation">,</span><span class="token string">"http"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
builder <span class="token operator">=</span> RestClient<span class="token punctuation">.</span><span class="token function">builder</span><span class="token punctuation">(</span>host<span class="token punctuation">)</span><span class="token punctuation">;</span>
RestHighLevelClient client <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">RestHighLevelClient</span><span class="token punctuation">(</span>builder<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> client<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
4)、测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class MallSearchApplicationTests {
<span class="token annotation punctuation">@Autowired</span>
RestHighLevelClient client<span class="token punctuation">;</span>
<span class="token annotation punctuation">@Test</span>
<span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">contextLoads</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>client<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">//org.elasticsearch.client.RestHighLevelClient@f438904 </span>
<span class="token punctuation">}</span>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
5)、使用单实例RestHighLevelClient
RestHighLevelClient中的所有API都接受一个RequestOptions,您可以使用它们以不会改变Elasticsearch执行请求的方式自定义请求。例如,在这里您可以指定NodeSelector来控制哪个节点接收请求
public static final RequestOptions COMMON_OPTIONS;
<span class="token keyword">static</span> <span class="token punctuation">{</span>
RequestOptions<span class="token punctuation">.</span>Builder builder <span class="token operator">=</span> RequestOptions<span class="token punctuation">.</span><span class="token constant">DEFAULT</span><span class="token punctuation">.</span><span class="token function">toBuilder</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
//暂时不使用
// builder.addHeader(“Authorization”, "Bearer " + TOKEN);
// builder.setHttpAsyncResponseConsumerFactory(
// new HttpAsyncResponseConsumerFactory
// .HeapBufferedResponseConsumerFactory(30 * 1024 * 1024 * 1024));
COMMON_OPTIONS = builder.build();
}
存储数据到ES
/**
* 测试存储数据到es
*/
@Test
public void index() throws IOException {
//指定索引
IndexRequest indexRequest = new IndexRequest("users");
//指定ID 如果不设置自动生成
indexRequest.id("1");
//1、使用kv结构
//index.source("userName","daihao","age","18");
<span class="token comment">//2、使用json</span>
User user <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">User</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
user<span class="token punctuation">.</span><span class="token function">setName</span><span class="token punctuation">(</span><span class="token string">"DAIHAO"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
user<span class="token punctuation">.</span><span class="token function">setAge</span><span class="token punctuation">(</span><span class="token number">18</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
user<span class="token punctuation">.</span><span class="token function">setGender</span><span class="token punctuation">(</span><span class="token string">"男"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
String json <span class="token operator">=</span> JSON<span class="token punctuation">.</span><span class="token function">toJSONString</span><span class="token punctuation">(</span>user<span class="token punctuation">)</span><span class="token punctuation">;</span>
indexRequest<span class="token punctuation">.</span><span class="token function">source</span><span class="token punctuation">(</span>json<span class="token punctuation">,</span> XContentType<span class="token punctuation">.</span>JSON<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">//执行同步存储 RequestOptions.DEFAULT:请求设置项</span>
IndexResponse index <span class="token operator">=</span> client<span class="token punctuation">.</span><span class="token function">index</span><span class="token punctuation">(</span>indexRequest<span class="token punctuation">,</span> RequestOptions<span class="token punctuation">.</span>DEFAULT<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">//提取有用得响应数据</span>
System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>index<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">//IndexResponse[index=users,type=_doc,id=1,version=1,result=created,seqNo=0,primaryTerm=1,shards={"total":2,"successful":1,"failed":0}]</span>
<span class="token comment">//java.lang.IllegalArgumentException: The number of object passed must be even but was [1]</span>
<span class="token comment">//错误 没有设置传递的内容格式 XContentType.JSON</span>
<span class="token punctuation">}</span>
<span class="token annotation punctuation">@Data</span>
<span class="token keyword">class</span> <span class="token class-name">User</span> <span class="token punctuation">{</span>
<span class="token keyword">private</span> String name<span class="token punctuation">;</span>
<span class="token keyword">private</span> String gender<span class="token punctuation">;</span>
<span class="token keyword">private</span> Integer age<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
- 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
从ES检索数据
/**
* 复杂查询
*/
@Test
public void searchData() throws IOException {
<span class="token comment">//创建检索请求</span>
SearchRequest searchRequest <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">SearchRequest</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">//指定索引</span>
searchRequest<span class="token punctuation">.</span><span class="token function">indices</span><span class="token punctuation">(</span><span class="token string">"bank"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">//指定DSL,检索条件</span>
SearchSourceBuilder sourceBuilder <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">SearchSourceBuilder</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
sourceBuilder<span class="token punctuation">.</span><span class="token function">query</span><span class="token punctuation">(</span>QueryBuilders<span class="token punctuation">.</span><span class="token function">matchQuery</span><span class="token punctuation">(</span><span class="token string">"address"</span><span class="token punctuation">,</span> <span class="token string">"mill"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">//按照年龄的值分布聚合</span>
TermsAggregationBuilder ageAgg <span class="token operator">=</span> AggregationBuilders<span class="token punctuation">.</span><span class="token function">terms</span><span class="token punctuation">(</span><span class="token string">"ageAgg"</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">field</span><span class="token punctuation">(</span><span class="token string">"age"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
sourceBuilder<span class="token punctuation">.</span><span class="token function">aggregation</span><span class="token punctuation">(</span>ageAgg<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">//计算平均薪资</span>
AvgAggregationBuilder balanceVag <span class="token operator">=</span> AggregationBuilders<span class="token punctuation">.</span><span class="token function">avg</span><span class="token punctuation">(</span><span class="token string">"balanceVag"</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">field</span><span class="token punctuation">(</span><span class="token string">"balance"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
sourceBuilder<span class="token punctuation">.</span><span class="token function">aggregation</span><span class="token punctuation">(</span>balanceVag<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">//System.out.println(sourceBuilder.toString());</span>
searchRequest<span class="token punctuation">.</span><span class="token function">source</span><span class="token punctuation">(</span>sourceBuilder<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">//执行</span>
SearchResponse searchResponse <span class="token operator">=</span> client<span class="token punctuation">.</span><span class="token function">search</span><span class="token punctuation">(</span>searchRequest<span class="token punctuation">,</span> EsConfig<span class="token punctuation">.</span>COMMON_OPTIONS<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">//获取命中数据</span>
SearchHits searchHits <span class="token operator">=</span> searchResponse<span class="token punctuation">.</span><span class="token function">getHits</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
SearchHit<span class="token punctuation">[</span><span class="token punctuation">]</span> hits <span class="token operator">=</span> searchHits<span class="token punctuation">.</span><span class="token function">getHits</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span>SearchHit hit <span class="token operator">:</span> hits<span class="token punctuation">)</span> <span class="token punctuation">{</span>
String str <span class="token operator">=</span> hit<span class="token punctuation">.</span><span class="token function">getSourceAsString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
Account account <span class="token operator">=</span> JSON<span class="token punctuation">.</span><span class="token function">parseObject</span><span class="token punctuation">(</span>str<span class="token punctuation">,</span> Account<span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"account:"</span> <span class="token operator">+</span> account<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">//account_number=970, balance=19648, firstname=Forbes, lastname=Wallace, age=28, gender=M,</span>
<span class="token comment">//address=990 Mill Road, employer=Pheast, email=forbeswallace@pheast.com, city=Lopezo, state=AK)</span>
<span class="token punctuation">}</span>
<span class="token comment">//获取这次检索的到的分析信息</span>
Aggregations aggregations <span class="token operator">=</span> searchResponse<span class="token punctuation">.</span><span class="token function">getAggregations</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span>Aggregation aggregation <span class="token operator">:</span> aggregations<span class="token punctuation">.</span><span class="token function">asList</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"当前聚合:"</span> <span class="token operator">+</span> aggregation<span class="token punctuation">.</span><span class="token function">getName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">//当前聚合:ageAgg</span>
<span class="token comment">//当前聚合:balanceVag</span>
<span class="token punctuation">}</span>
Terms ageAgg1 <span class="token operator">=</span> aggregations<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">"ageAgg"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span>Terms<span class="token punctuation">.</span>Bucket bucket <span class="token operator">:</span> ageAgg1<span class="token punctuation">.</span><span class="token function">getBuckets</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
String str <span class="token operator">=</span> bucket<span class="token punctuation">.</span><span class="token function">getKeyAsString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"年龄:"</span> <span class="token operator">+</span> str <span class="token operator">+</span> <span class="token string">"===>"</span> <span class="token operator">+</span> bucket<span class="token punctuation">.</span><span class="token function">getDocCount</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
// 年龄:38===>2
// 年龄:28===>1
// 年龄:32===>1
}
Avg balanceVag1 <span class="token operator">=</span> aggregations<span class="token punctuation">.</span><span class="token function">get</span><span class="token punctuation">(</span><span class="token string">"balanceVag"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"平均薪资:"</span> <span class="token operator">+</span> balanceVag1<span class="token punctuation">.</span><span class="token function">getValueAsString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">//平均薪资:25208.0</span>
<span class="token punctuation">}</span>
<span class="token annotation punctuation">@ToString</span>
<span class="token annotation punctuation">@Data</span>
<span class="token keyword">static</span> <span class="token keyword">class</span> <span class="token class-name">Account</span> <span class="token punctuation">{</span>
<span class="token keyword">private</span> <span class="token keyword">int</span> account_number<span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token keyword">int</span> balance<span class="token punctuation">;</span>
<span class="token keyword">private</span> String firstname<span class="token punctuation">;</span>
<span class="token keyword">private</span> String lastname<span class="token punctuation">;</span>
<span class="token keyword">private</span> <span class="token keyword">int</span> age<span class="token punctuation">;</span>
<span class="token keyword">private</span> String gender<span class="token punctuation">;</span>
<span class="token keyword">private</span> String address<span class="token punctuation">;</span>
<span class="token keyword">private</span> String employer<span class="token punctuation">;</span>
<span class="token keyword">private</span> String email<span class="token punctuation">;</span>
<span class="token keyword">private</span> String city<span class="token punctuation">;</span>
<span class="token keyword">private</span> String state<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
- 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
项目使用ES
1、 提供按关键字查询的全文搜索功能。
2、 著名的ELK框架(ElasticSearch,Logstash,Kibana),实现企业海量日志的处理分析的解决方案。大数据领域的重要一份子
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200510165307581.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0RfQV9JX0hfQV9P,size_16,color_FFFFFF,t_70)
</div>
<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-60ecaf1f42.css" rel="stylesheet">
</div>