穀粒商城–分散式高級篇P102~P128

穀粒商城–分散式高級篇P102~P128

由於學習的時間也比較少,只有周六周末才有時間出來學習總結,所以一篇一篇慢慢更新吧,本次總結內容為Elasticsearch(相關內容:kibana,es,nginx,ik分詞器)

csdn
csdn
csdn
csdn
csdn

【穀粒商城–分散式基礎篇P1~P27】: //blog.csdn.net/Empire_ing/article/details/118860147

【穀粒商城–分散式基礎篇P28~P101】//mp.weixin.qq.com/s/5kvXjLNyVn-GBhNMWyJdpg


@

🔥1.ElasticSearch與kibana

​ 內容概況:es、kibana、ik相關軟體於centos中docker的下載與配置使用。本次安裝最大感悟就是docker太好用了,真的好強。

​ 之前也寫過一篇關於es文章實例:

​ SpringBoot整合es實現高亮搜索://www.cnblogs.com/meditation5201314/p/14801585.html

1.1.基本概念

​ 索引index:類似於資料庫

​ 類型type:類似於庫中的表

​ 文檔document:類似於表的每一行

​ 方法/屬性:類似於每一行的欄位

img

1.2 安裝es與kibana

​ 1. ES訪問地址://公網IP:9200/

# 1、下載包
docker pull elasticsearch:7.4.2


# 2、配置es文件映射
# 將docker里的目錄掛載到linux的/mydata目錄中
# 修改/mydata就可以改掉docker里的
mkdir -p /mydata/elasticsearch/config
mkdir -p /mydata/elasticsearch/data
# es可以被遠程任何機器訪問
echo "http.host: 0.0.0.0" >/mydata/elasticsearch/config/elasticsearch.yml
# 遞歸更改許可權,es需要訪問
chmod -R 777 /mydata/elasticsearch/

# 3、啟動es
# 9200是用戶交互埠 9300是集群心跳埠  -e指定是單階段運行  -e指定佔用的記憶體大小,生產時可以設置32G
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e  "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx512m" \
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-v  /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.4.2 

# 4、設置開機啟動elasticsearch
docker update elasticsearch --restart=always

請添加圖片描述

  1. kibana下載、配置、啟動

Kibana訪問地址://公網IP:5601/

# 1、下載包
docker pull kibana:7.4.2

# 2、啟動es(這裡填自己的IP地址)
docker run --name kibana -e ELASTICSEARCH_HOSTS=//公網IP:9200 -p 5601:5601 -d kibana:7.4.2 

# 3、設置開機啟動kibana
docker update kibana  --restart=always

請添加圖片描述

​ 訪問地址:

查看es的node節點://公網IP:9200/_cat/nodes

查看es的helth健康狀態://公網IP:9200/_cat/health

查看es的master主節點://公網IP:9200/_cat/master

查看es的索引主節點://公網IP:9200/_cat/indices

1.3 Nginx安裝
docker run -p80:80 --name nginx -d nginx:1.10   

mkdir -p /mydata/nginx/html
mkdir -p /mydata/nginx/logs
mkdir -p /mydata/nginx/conf
docker container cp nginx:/etc/nginx/*  /mydata/nginx/conf/ 
#由於拷貝完成後會在config中存在一個nginx文件夾,所以需要將它的內容移動到conf中
mv /mydata/nginx/conf/nginx/* /mydata/nginx/conf/
rm -rf /mydata/nginx/conf/nginx

docker stop nginx
docker rm nginx
docker run -p 80:80 --name nginx \
 -v /mydata/nginx/html:/usr/share/nginx/html \
 -v /mydata/nginx/logs:/var/log/nginx \
 -v /mydata/nginx/conf/:/etc/nginx \
 -d nginx:1.10
docker update nginx --restart=always
1.4 Ik中文分詞器

​ 在elasticsearch/plugins目錄下下載解壓ik分詞器後重啟即可

#下載ik分詞器
wget //github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-analysis-ik-7.4.2.zip
#解壓並重命名ik
unzip elasticsearch-analysis-ik-7.4.2.zip -d ik

chmod -R 777 plugins/ik
rm -rf elasticsearch-analysis-ik-7.4.2.zip  #這裡要保證plugins目錄下純凈,否則啟動會報錯
docker restart elasticsearch

🔥2.SpringBoot整合Es

2.1.環境配置
  • ELK版本對應並去掉springboot中自帶的es包
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.4.2</version>
</dependency>

<properties>
    <java.version>1.8</java.version>
    <elasticsearch.version>7.4.2</elasticsearch.version>
</properties>

  • Config配置
package com.empirefree.gulimall.search.config;

import org.apache.http.HttpHost;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @program: gulimall-search
 * @description:
 * @author: huyuqiao
 * @create: 2021/08/01 13:54
*/


@Configuration
public class GulimallElasticSearchConfig {
    public static final RequestOptions COMMON_OPTIONS;

    static {
        RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
//		builder.addHeader("Authorization", "Bearer " + TOKEN);
//		builder.setHttpAsyncResponseConsumerFactory(
//				new HttpAsyncResponseConsumerFactory
//						.HeapBufferedResponseConsumerFactory(30 * 1024 * 1024 * 1024));
        COMMON_OPTIONS = builder.build();
    }



    @Bean
    public RestHighLevelClient restHighLevelClient(){
        RestClientBuilder restClientBuilder = null;
        restClientBuilder = RestClient.builder(new HttpHost("公網IP", 9200, "http"));

        RestHighLevelClient client = new RestHighLevelClient(restClientBuilder);
        return client;
    }
}

2.2.搜索實現

​ 用過兩款,一種是狂神的整合es高亮,一種是現在的,做的一些平均值,有點難理解,但是還是先貼出來

       @Test
    public void testEs() throws IOException {
        SearchRequest searchRequest = new SearchRequest();

        // 指定索引
        searchRequest.indices("newbank");

        // 1.指定檢索條件 DSL
        SearchSourceBuilder builder = new SearchSourceBuilder();
        // 1.1 構造檢索條件
        builder.query(QueryBuilders.matchQuery("address","mill"));

        // 1.2 按照年齡值聚合
        TermsAggregationBuilder ageAgg = AggregationBuilders.terms("ageAgg").field("age").size(10);
        builder.aggregation(ageAgg);
        // 1.3 計算平均薪資
        AvgAggregationBuilder balanceAvg = AggregationBuilders.avg("balanceAvg").field("balance");
        builder.aggregation(balanceAvg);

        System.out.println("檢索條件:" + builder.toString());
        searchRequest.source(builder);

        // 2.執行檢索
        SearchResponse search = restHighLevelClient.search(searchRequest, GulimallElasticSearchConfig.COMMON_OPTIONS);

        // 3.分析結果
//		Map map = JSON.parseObject(search.toString(), Map.class);
//		System.out.println(map);
        // 3.1 索取所有記錄
        SearchHits hits = search.getHits();
        // 詳細記錄
        SearchHit[] searchHits = hits.getHits();
        for (SearchHit hit : searchHits) {
//			String index = hit.getIndex();
//			String id = hit.getId();
            String source = hit.getSourceAsString();
            Account account = JSON.parseObject(source, Account.class);
            System.out.println(account);
        }
        // 獲取分析數據
        Aggregations aggregations = search.getAggregations();
//		List<Aggregation> list = aggregations.asList();
//		for (Aggregation aggregation : list) {
//			Terms agg = aggregations.get(aggregation.getName());
//			System.out.println(agg.getBuckets());
//		}
        Terms agg = aggregations.get("ageAgg");
        for (Terms.Bucket bucket : agg.getBuckets()) {
            System.out.println("年齡: " + bucket.getKeyAsString() + "-->" + bucket.getDocCount() + "人");
        }

        Avg avg = aggregations.get("balanceAvg");
        System.out.println("平均薪資: " + avg.getValue());
    }

書山有路勤為徑,學海無涯苦作舟。程式設計師不僅要懂程式碼,更要懂生活,關注我,一起進步。
請添加圖片描述