elasticsearch 7.9.1 docker安装 集成springBoot
本人学习es的过程记录
网址:
elasticsearch官网 https://www.elastic.co/cn/elasticsearch
docker hub https://hub.docker.com/
搭建环境
- docker下载 elasticsearch, elasticsearch-head, kibana三个镜像
docker pull elasticsearch:7.9.1
docker pull mobz/elasticsearch-head:5
docker pull kibana:7.9.1 - 运行镜像
复制的时候看清楚引号("")是英文输入法下的
docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e “discovery.type=single-node” elasticsearch:7.9.1
docker run -d --name kibana -e “I18N_LOCALE=zh-CN” --link=elasticsearch:elasticsearch --net somenetwork -p 5601:5601 kibana:7.9.1
docker run -d --name elasticsearch-head --net somenetwork -p 9100:9100 mobz/elasticsearch-head:5 - 配置跨域
运行起来后,进入elasticsearch容器, docker exec -it elasticsearch /bin/bash, 进入目录/usr/share/elasticsearch/config中, 修改配置文件elasticsearch.yml, (但是容器没有vi方法, 我是复制到主机docker cp 容器名:目录/文件 本地目录/ 修改好之后,再 复制到容器 docker cp 本地目录/文件 容器名:目录/) , 增加跨域配置: http.cors.enabled: true, http.cors.allow-origin: “*” - 安装ik分词器
在elasticsearch容器bin目录下, 运行 elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.9.1/elasticsearch-analysis-ik-7.9.1.zip, 安装完退出容器, 重启容器 - 连接报错
elasticsearch-head 连接elasticsearch报错406问题, 我的解决方法是 进入head容器(由于vi命令无法使用, 我也是复制到主机上修改好再复制到容器的), 编辑/usr/src/app/_site/vendor.js, 6886行和7574行 "application/x-www-form-urlencoded 改成 “application/json;charset=UTF-8” - 安全认证:
(补充安全认证,配置用户名密码参考)
挂载数据文件,插件和配置文件到本地, 运行命令如下(复制的时候看清楚引号("")是英文输入法下的)
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -v /home/es/data:/usr/share/elasticsearch/data -v /home/es/plugins:/usr/share/elasticsearch/plugins -v /home/es/config/es.yml:/usr/share/elasticsearch/config/elasticsearch.yml -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -e “discovery.type=single-node” --restart=always elasticsearch:7.9.1
docker run -d -it --restart=always --privileged=true --name=kibana -p 5601:5601 -v/home/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml kibana:7.9.1
一、kibana控制台操作
在上面进行crud操作, 这个就是restful + json发送指令
二、elasticsearch-head数据浏览
三、集成SpringBoot
参考文档:
- 引入maven
<properties>
<elasticsearch.version>7.9.1</elasticsearch.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.60</version>
</dependency>
</dependencies>
- 依赖注入RestHighLevelClient
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ElasticSearchClientConfig {
@Bean
public RestHighLevelClient restHighLevelClient() {
return new RestHighLevelClient(
RestClient.builder(
new HttpHost("192.168.110.159", 9200, "http")));
}
//需要用户名和密码的认证
@Bean
public RestHighLevelClient restHighLevelClient() {
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("elastic", "123456"));
RestClientBuilder restClientBuilder = RestClient.builder(new HttpHost("192.168.110.159", "9200", "http"))
.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
@Override
public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpAsyncClientBuilder) {
return httpAsyncClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
});
return new RestHighLevelClient(restClientBuilder);
}
}
- 测试crud创建索引和文档等
UserVo实体类自定义
import com.alibaba.fastjson.JSON;
import com.ph.entity.UserVo;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;
@SpringBootTest
class EsClientApplicationTests {
@Autowired
private RestHighLevelClient restHighLevelClient;
@Test
void testCreateIndex() throws IOException {
CreateIndexRequest request = new CreateIndexRequest("ph_index");
CreateIndexResponse response = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);
System.out.println(response);
}
@Test
void testGetIndex() throws IOException {
GetIndexRequest request = new GetIndexRequest("ph_index");
boolean response = restHighLevelClient.indices().exists(request, RequestOptions.DEFAULT);
System.out.println(response);
}
@Test
void testDeleteIndex() throws IOException {
DeleteIndexRequest request = new DeleteIndexRequest("match");
AcknowledgedResponse delete = restHighLevelClient.indices().delete(request, RequestOptions.DEFAULT);
System.out.println(delete.isAcknowledged());
}
@Test
void addDocument() throws IOException {
IndexRequest request = new IndexRequest("ph_index");
UserVo userVo = new UserVo();
userVo.setName("酸梅膏2");
userVo.setAge(19);
userVo.setBirthday(new Date());
request.id("1");
request.source(JSON.toJSONString(userVo), XContentType.JSON);
IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT);
System.out.println(response.toString());
System.out.println(response.status());
}
@Test
void getIsExists() throws IOException {
GetRequest request = new GetRequest("ph_index", "JJxLbHQBSLYVMtZRYQtQ");
request.fetchSourceContext(new FetchSourceContext(false));
request.storedFields("_none_");
boolean exists = restHighLevelClient.exists(request, RequestOptions.DEFAULT);
System.out.println(exists);
}
@Test
void getGetDocument() throws IOException {
GetRequest request = new GetRequest("ph_index", "1");
GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT);
System.out.println(response.getSourceAsString());
System.out.println(response);
}
@Test
void getUpdateDocument() throws IOException {
UpdateRequest request = new UpdateRequest("ph_index", "1");
UserVo userVo = new UserVo();
userVo.setName("绿豆汤");
request.doc(JSON.toJSONString(userVo), XContentType.JSON);
UpdateResponse response = restHighLevelClient.update(request, RequestOptions.DEFAULT);
System.out.println(response.toString());
System.out.println(response.status());
}
@Test
void getDeleteDocument() throws IOException {
DeleteRequest request = new DeleteRequest("ph_index", "JJxLbHQBSLYVMtZRYQtQ");
request.timeout("1s");
DeleteResponse response = restHighLevelClient.delete(request, RequestOptions.DEFAULT);
System.out.println(response.status());
}
@Test
void bulkDocument() throws IOException {
BulkRequest request = new BulkRequest();
List<UserVo> list = new ArrayList<>();
list.add(new UserVo("xiao按", 13, new Date()));
list.add(new UserVo("xiao按2", 11, new Date()));
list.add(new UserVo("xiao按3", 15, new Date()));
list.add(new UserVo("xiao按4", 16, new Date()));
for (int i = 0; i < list.size(); i++) {
request.add(new IndexRequest("ph_index")
.id("" + (i + 1)).source(JSON.toJSONString(list.get(i)), XContentType.JSON));
}
BulkResponse response = restHighLevelClient.bulk(request, RequestOptions.DEFAULT);
System.out.println(response.toString());
System.out.println(response.status());
}
@Test
void searchDocument() throws IOException {
SearchRequest searchRequest = new SearchRequest("ph_index");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.highlighter(new HighlightBuilder().field("name"));
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name", "xiao按");
sourceBuilder.query(matchQueryBuilder);
sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
searchRequest.source(sourceBuilder);
SearchResponse response = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
System.out.println(JSON.toJSONString(response));
for (SearchHit hit : response.getHits().getHits()) {
System.out.println(hit.getSourceAsMap());
}
}
/**
* 更新索引文档的对象数组里面的一项数据, 如果存在则更新, 不存在则新增
* lotteryVo 参数, 更新的对象数据
* ctx._source.lotterys 文档数组对象字段
* @throws IOException
*/
@Test
void testScriptUpdateDocument() throws IOException {
String scriptString = "if (ctx._source.lotterys == null) {\n" +
" ctx._source.lotterys = [params.tag];\n" +
" } else {\n" +
" boolean t = true;\n" +
" for(int i = 0; i < ctx._source.lotterys.length; i++) {\n" +
" if (ctx._source.lotterys[i].id == params.tag.id) {\n" +
" ctx._source.lotterys[i].lotteryType = params.tag.lotteryType;\n" +
" ctx._source.lotterys[i].showIssueNum = params.tag.showIssueNum;\n" +
" t = false;\n" +
" }\n" +
" }\n" +
" if (t) {\n" +
" ctx._source.lotterys.add(params.tag);\n" +
" }\n" +
" }";
Map<String, Object> params = new HashMap<>();
params.put("tag", JSON.parseObject(JSON.toJSONString(lotteryVo)));
Script script = new Script(ScriptType.INLINE, "painless", scriptString, params);
UpdateRequest request = new UpdateRequest("index", "id");
request.script(script);
UpdateResponse response = restHighLevelClient.update(request, RequestOptions.DEFAULT);
}
/**
* eventVo 更新的数据
*/
@Test
void testUpdateByQueryDocument() throws IOException {
try {
String scriptString = "ctx._source.eventJson = params.eventJson";
Map<String, Object> params = new HashMap<>();
params.put("eventJson", JSON.parseObject(JSON.toJSONString(eventVo)));
Script script = new Script(ScriptType.INLINE, "painless", scriptString, params);
UpdateByQueryRequest request = new UpdateByQueryRequest("index");
request.setScript(script);
request.setQuery(QueryBuilders.termQuery("event_id", eventVo.getId()));
BulkByScrollResponse response = restHighLevelClient.updateByQuery(request, RequestOptions.DEFAULT);
} catch (Exception e) {
e.printStackTrace();
}
}
总结
每天多一点点的努力,不为别的,只为了日后能够多一些选择,选择淡看云卷云舒的小日子,选择自己喜欢的人,自己想要的东西,要么奋力直追,要么干脆放弃。别总是逢人就喋喋不休的表决心或者哀怨不断,做别人茶余饭后的笑点。
版权声明:本文为qq_33638256原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。