Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,同时是可扩展的数据存储和矢量数据库,能够应对日益增多的各种用例。作为 Elastic Stack 的核心,Elasticsearch 能够集中存储您的数据,实现闪电般的搜索速度、精细的相关性调整以及强大的分析能力,并且能够轻松地进行规模扩展。废话少说,开干
一、docker 部署ES
1、创建网络,让ES与Kibana容器互联
docker network create es-net
2、加载镜像
docker pull elasticsearch:7.13.4
docker pull kibana:7.13.4
3、运行ES容器
mkdir /home/elasticsearch
docker run -d --name elasticsearch -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" -e "discovery.type=single-node" -e "http.host=0.0.0.0" -v ./es-data:/home/elasticsearch/data -v ./es-plugins:/home/elasticsearch/plugins -v ./es-logs:/home/elasticsearch/logs --privileged --network es-net -p 9200:9200 -p 9300:9300 elasticsearch:7.13.4
4、 运行Kibana
docker run -d --name kibana -e ELASTICSEARCH_HOSTS=http://elasticsearch:9200 --network=es-net -p 5601:5601 kibana:7.13.4
5、安装IK分词器
#进入es容器
docker exec -it elasticsearch bash
#创建tmp
mkdir tmp
#进入tmp
cd tmp
#下载分词器
curl -L -o elasticsearch-analysis-ik-7.13.4.zip https://github.com/infinilabs/analysis-ik/releases/download/v7.13.4/elasticsearch-analysis-ik-7.13.4.zip
#解压
unzip elasticsearch-analysis-ik-7.13.4.zip -d ../plugins/ik
退出
exit
6、找到Kibana.yml
find / -name kibana.yml
#修改所有diff/usr/share/kibana/config/下有"http://elasticsearch:9200"的kibana.yml,改成http://服务器ip:9200
vim /var/lib/docker/overlay2/c74ccba0cb8f2bc0279b4a5489ec28bfdf113294cfd1e60f46aef3dea4df8ad0/diff/usr/share/kibana/config/kibana.yml
server.host: "0.0.0.0"
server.shutdownTimeout: "5s"
elasticsearch.hosts: [ "http://127.0.0.1:9200" ]
monitoring.ui.container.elasticsearch.enabled: true
i18n.locale: "zh-CN"
7、docker重启Kibana和 elasticsearch,浏览器打开 http://服务器ip:5601
找到dev tools
console输入下面这段代码
PUT app_info_article
{
"mappings":{
"properties":{
"id":{
"type":"text"
},
"publishTime":{
"type":"date"
},
"layout":{
"type":"short"
},
"images":{
"type":"text"
},
"authorId": {
"type": "integer"
},
"title":{
"type":"text",
"analyzer":"ik_smart"
},
"content":{
"type":"text",
"analyzer":"ik_smart"
}
}
}
}
显示下面,即成功连接
二、springCloud集成ES
1、在需要ES的服务中,pom引入依赖
<properties>
<elasticsearch.version>7.13.4</elasticsearch.version>
</properties>
<!--elasticsearch-->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
2、 在需要ES的服务中,添加application.yml配置文件
#在引入的服务中,自定义elasticsearch连接配置
elasticsearch:
host: 192.168.200.140
port: 9200
3、 添加配置类
/**
* @author 未知
* @date 2024/10/01 10:00
*/
@Getter
@Setter
@Configuration
@ConfigurationProperties(prefix = "elasticsearch")
public class ElasticConfiguretion {
private String host;
private Integer port;
@Bean
public RestHighLevelClient createElasticClient() {
System.out.println(host);
System.out.println(port);
return new RestHighLevelClient(
RestClient.builder(
new HttpHost(host, port, "http")
)
);
}
}
4、在需要ES的服务中,添加测试
/**
* @author 未知
* @date 2024/10/01 10:00
*/
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ContextConfiguration(classes = UserApplication.class)
@Slf4j
public class ElasticSearchTest {
@Autowired
private RestHighLevelClient restHighLevelClient;
@Test
public void test01() throws IOException {
for (int i = 0; i < 10; i++) {
String id = UUID.randomUUID().toString().substring(0, 3);
//构建想要存储的对象
Map<String, Object> map = new HashMap<>();
map.put("id", id);
map.put("publishTime", new Date());
map.put("layout", RandomUtil.randomInt(1000));
map.put("images", RandomUtil.randomNumbers(10).toString());
map.put("authorId", RandomUtil.randomInt(1000));
map.put("content", RandomUtil.randomNumbers(10).toString());
//指定要存入数据的库
IndexRequest indexRequest
= new IndexRequest("app_info_article").id(id).source(map);
//创建索引 并保存至es库中
restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
}
}
@Test
public void test02() throws IOException {
//构建搜索请求对象,需要指定索引库名称
SearchRequest searchRequest = new SearchRequest("app_info_article");
//条件构建器
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//布尔查询
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
//查询时间publishTime大于2021-09-21 15:00:00 的所有信息
RangeQueryBuilder rangeQueryBuilder = QueryBuilders
.rangeQuery("publishTime")
.gt(DateUtil.parse("2021-09-21 15:00:00").toJdkDate());
boolQueryBuilder.filter(rangeQueryBuilder);
searchSourceBuilder.query(boolQueryBuilder);
//分页
searchSourceBuilder.from(0);
searchSourceBuilder.size(10);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
List<Map> articleList = new ArrayList<>();
SearchHit[] hits = searchResponse.getHits().getHits();
for (SearchHit hit : hits) {
String sourceAsString = hit.getSourceAsString();
Map map = JSONUtil.toBean(sourceAsString, Map.class);
articleList.add(map);
}
System.out.println(articleList);
}
}