Elasticsearch【优化、案例】(八)-全面详解(学习总结---从入门到深化)

news2024/12/29 19:30:35

目录

Elasticsearch集群_测试集群状态

Elasticsearch集群_故障应对&水平扩容

Elasticsearch优化_磁盘选择

Elasticsearch优化_分片策略

Elasticsearch优化_内存设置

Elasticsearch案例_需求说明

Elasticsearch案例_ES自动补全 

 Elasticsearch案例_创建索引

Elasticsearch案例_准备数据

Elasticsearch案例_项目搭建

Elasticsearch案例_创建实体类

Elasticsearch案例_创建Repository接口

Elasticsearch案例_自动补全功能

Elasticsearch案例_搜索关键字功能

Elasticsearch案例_创建Controller类

Elasticsearch案例_前端页面


Elasticsearch集群_测试集群状态

1、在集群中创建一个索引 

PUT /product1
{
  "settings": {
    "number_of_shards": 5, // 分片数
    "number_of_replicas": 1 // 每个分片的副本数
 },
  "mappings": {
    "properties": {
      "id": {
        "type": "integer",
        "store": true,
        "index": true
     },
      "productName": {
        "type": "text",
        "store": true,
        "index": true
     },
      "productDesc": {
        "type": "text",
        "store": true,
        "index": true
     }
   }
 }
}

2、查看集群状态

# 查看集群健康状态
GET /_cat/health?v

# 查看索引状态
GET /_cat/indices?v

# 查看分片状态
GET /_cat/shards?v

实时学习反馈

1. 在Elasticsearch中,查看集群健康状态的请求路径为

A /_cat/nodes

B /_cat/health?v

C /_cat/indices?v

D /_cat/shards?v

2. 在Elasticsearch中,查看集群分片状态的请求路径为

A /_cat/nodes

B /_cat/health?v

C /_cat/indices?v

D /_cat/shards?v

Elasticsearch集群_故障应对&水平扩容

1 关闭一个节点,可以发现ES集群可以自动进行故障应对。

2 重新打开该节点,可以发现ES集群可以自动进行水平扩容。

3 分片数不能改变,但是可以改变每个分片的副本数: 

PUT /索引/_settings
{
    "number_of_replicas": 副本数
}

实时学习反馈

1. 关于Elasticsearch集群,以下说法正确的是

A ES集群不可以自动进行水平扩容

B ES集群分片数不能改变

C ES集群分片数可以改变

D ES集群副本数不能改变

Elasticsearch优化_磁盘选择

ES的优化即通过调整参数使得读写性能更快

磁盘通常是服务器的瓶颈。Elasticsearch重度使用磁盘,磁盘的效 率越高,Elasticsearch的执行效率就越高。这里有一些优化磁盘的技巧: 

1、使用SSD(固态硬盘),它比机械磁盘优秀多了。

2、使用RAID0模式(将连续的数据分散到多个硬盘存储,这样可以并行进行IO操作),代价是一块硬盘 发生故障就会引发系统故障。

3、不要使用远程挂载的存储。

实时学习反馈

1. 关于Elasticsearch磁盘优化,说法错误的是

A 机械磁盘比固态硬盘优秀

B 固态硬盘比机械磁盘优秀 

C RAID0模式可以并行进行IO操作

D 不要使用远程挂载的存储

Elasticsearch优化_分片策略

分片和副本数并不是越多越好。每个分片的底层都是一个Lucene索 引,会消耗一定的系统资源。且搜索请求需要命中索引中的所有分 片,分片数过多会降低搜索性能。索引的分片数需要架构师和技术 人员对业务的增长有预先的判断,一般来说我们遵循以下原则: 

1、每个分片占用的硬盘容量不超过ES的最大JVM的堆空间设置(一 般设置不超过32G)。比如:如果索引的总容量在500G左右, 那分片数量在16个左右即可。

2、分片数一般不超过节点数的3倍。比如:如果集群内有10个节 点,则分片数不超过30个。 

3、推迟分片分配:节点中断后集群会重新分配分片。但默认集群会 等待一分钟来查看节点是否重新加入。我们可以设置等待的时 长,减少重新分配的次数:

PUT  /索引/_settings
{
    "settings":{
        "index.unassianed.node_left.delayed_timeout":"5m"
   }
}

4、减少副本数量:进行写入操作时,需要把写入的数据都同步到副 本,副本越多写入的效率就越慢。我们进行大批量进行写入操作 时可以先设置副本数为0,写入完成后再修改回正常的状态。

实时学习反馈

1. 关于Elasticsearch分片策略,说法正确的是

A 每个分片占用的硬盘容量一般不超过32G

B 分片数一般不超过节点数的3倍

C 进行大批量进行写入操作时可以先设置副本数为0,写入完成后 再修改回正常状态

D 以上说法都正确 

Elasticsearch优化_内存设置

 ES默认占用内存是4GB,我们可以修改config/jvm.option设置ES的 堆内存大小,Xms表示堆内存的初始大小,Xmx表示可分配的最大内存。

1、Xmx和Xms的大小设置为相同的,可以减轻伸缩堆大小带来的压力。

2、Xmx和Xms不要超过物理内存的50%,因为ES内部的Lucene也要占据一部分物理内存。 3、Xmx和Xms不要超过32GB,由于Java语言的特性,堆内存超过32G会浪费大量系统资源,所以在内 存足够的情况下,最终我们都会采用设置为31G:

-Xms 31g
-Xmx 31g

例如:在一台128GB内存的机器中,我们可以创建两个节点,每个 节点分配31GB内存。

实时学习反馈

1. 关于Elasticsearch内存设置,说法正确的是

A Xmx和Xms的大小设置为相同的

B Xmx和Xms不要超过物理内存的50%

C Xmx和Xms不要超过32GB

D 以上说法都正确 

Elasticsearch案例_需求说明

接下来我们使用ES模仿百度搜索,即自动补全+搜索引擎效果:

Elasticsearch案例_ES自动补全 

es为我们提供了关键词的自动补全功能:

GET /索引/_search
{
    "suggest": {
        "prefix_suggestion": {// 自定义推荐名
            "prefix": "elastic",// 被补全的关键字
            "completion": {
                "field": "productName",// 查询的域
                "skip_duplicates": true, //忽略重复结果
                "size": 10 //最多查询到的结果数
           }
       }
   }
}

注:自动补全对性能要求极高,ES不是通过倒排索引来实现 的,所以需要将对应的查询字段类型设置为completion。

PUT /product2
{
    "mappings":{
        "properties":{
            "id":{
                "type":"integer",
                "store":true,
                "index":true
           },
            "productName":{
                "type":"completion"
           },
            "productDesc":{
                "type":"text",
                "store":true,
                "index":true
           }
       }
   }
}
POST /product2/_doc
{
    "id":1,
    "productName":"elasticsearch1",
    "productDesc":"elasticsearch1 is a goodsearch engine"
}
POST /product2/_doc
{
    "id":2,
    "productName":"elasticsearch2",
    "productDesc":"elasticsearch2 is a goodsearch engine"
}
POST /product2/_doc
{
    "id":3,
    "productName":"elasticsearch3",
    "productDesc":"elasticsearch3 is a goodsearch engine"
}

 Elasticsearch案例_创建索引

PUT /news
{
    "settings": {
        "number_of_shards": 5,
        "number_of_replicas": 1,
        "analysis": {
            "analyzer": {
                "ik_pinyin": {
                    "tokenizer": "ik_smart",
                    "filter":"pinyin_filter"
               },
                "tag_pinyin": {
                    "tokenizer": "keyword",
                    "filter":"pinyin_filter"
               }
           },
            "filter": {
                "pinyin_filter": {
                    "type": "pinyin",
                    "keep_joined_full_pinyin": true,
                    "keep_original": true,
                    "remove_duplicated_term": true
               }
           }
       }
   },
    "mappings": {
        "properties": {
            "id": {
                "type": "integer",
                "index": true
           },
            "title": {
                "type": "text",
                "index": true,
                "analyzer": "ik_pinyin",
                "search_analyzer":"ik_smart"
           },
            "content": {
                "type": "text",
                "index": true,
                "analyzer": "ik_pinyin",
                "search_analyzer":"ik_smart"
           },
            "url": {
                "type": "keyword",
                "index": true
           },
            "tags": {
                "type": "completion",
                "analyzer": "tag_pinyin",
                "search_analyzer":"tag_pinyin"
           }
       }
   }
}

Elasticsearch案例_准备数据

使用logstash工具可以将mysql数据同步到es中:

1、解压logstash-7.17.0-windows-x86_64.zip

logstash要和elastisearch版本一致

2、在解压路径下的/config中创建mysql.conf文件,文件写入以下 脚本内容: 

input {
   jdbc {
       jdbc_driver_library => "E:\新课\Elasticsearch\软件\案例\mysql-connector-java-5.1.37-bin.jar"
       jdbc_driver_class => "com.mysql.jdbc.Driver"
       jdbc_connection_string => "jdbc:mysql:///news"
       jdbc_user => "root"
       jdbc_password => "root"
       schedule => "* * * * *"
       jdbc_default_timezone => "Asia/Shanghai"
       statement => "SELECT * FROM news;"
   }
}
filter {
 mutate {
     split => {"tags" => ","}
 }
}
output {
   elasticsearch {
 hosts =>
       ["192.168.0.187:9200","192.168.0.187:9201","192.168.0.187:9202"]
       index => "news"
       document_id => "%{id}"
   }
}

3、在解压路径下打开cmd黑窗口,运行命令:

bin\logstash -f config\mysql.conf

4、测试自动补齐

GET /news/_search
{
    "suggest": {
        "my_suggest": {
            "prefix": "li",
            "completion": {
                "field": "tags",
                "skip_duplicates": true,
                "size": 10
           }
       }
   }
}

Elasticsearch案例_项目搭建

创建Springboot项目,加入SpringDataElasticsearch和SpringMVC 的起步依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

写配置文件:

spring:
 elasticsearch:
 uris: 192.168.0.187:9200,192.168.0.187:9201,192.168.0.187:9202
logging:
 pattern:
 console: '%d{HH:mm:ss.SSS} %clr(%-5level) --- [%-15thread] %cyan(%-50logger{50}):%msg%n'

Elasticsearch案例_创建实体类

@Document(indexName = "news")
@Data
public class News {
    @Id
    @Field
    private Integer id;
    @Field
    private String title;
    @Field
    private String content;
    @Field
    private String url;
    @CompletionField
    @Transient
    private Completion tags;
}

Elasticsearch案例_创建Repository接口

public interface NewsRepository extends ElasticsearchRepository<News, Integer> {
    
}

Elasticsearch案例_自动补全功能

@Service
public class NewsService {
    @Autowired
    private ElasticsearchRestTemplate template;
    // 自动补齐
    public List<String> autoSuggest(String keyword) {
        // 1.创建补全请求
        SuggestBuilder suggestBuilder = new SuggestBuilder();
        // 2.构建补全条件
        SuggestionBuilder suggestionBuilder = SuggestBuilders
           .completionSuggestion("tags")
           .prefix(keyword)
           .skipDuplicates(true)
           .size(10);
       suggestBuilder.addSuggestion("prefix_suggestion", suggestionBuilder);
        // 3.发送请求
        SearchResponse response = template.suggest(suggestBuilder,IndexCoordinates.of("news"));
        // 4.处理结果
        List<String> result = response
           .getSuggest()
           .getSuggestion("prefix_suggestion")
           .getEntries()
           .get(0)
           .getOptions()
           .stream()
           .map(Suggest.Suggestion.Entry.Option::getText)
           .map(Text::toString)
           .collect(Collectors.toList());
        return result;
   }
}

Elasticsearch案例_搜索关键字功能

在repository接口中添加高亮搜索关键字方法

// 高亮搜索关键字
@Highlight(fields = {@HighlightField(name = "title"), @HighlightField(name = "content")})
List<SearchHit<News>> findByTitleMatchesOrContentMatches(String title, String content);

service类中调用该方法

// 查询关键字
public List<News> highLightSearch(String keyword){
    List<SearchHit<News>> result = repository.findByTitleMatchesOrContentMatches(keyword, keyword);
    // 处理结果,封装为News类型的集合
    List<News> newsList = new ArrayList();
    for (SearchHit<News> newsSearchHit : result) {
        News news = newsSearchHit.getContent();
        // 高亮字段
        Map<String, List<String>> highlightFields = newsSearchHit.getHighlightFields();
        if (highlightFields.get("title") != null){
            news.setTitle(highlightFields.get("title").get(0));
       }
        if (highlightFields.get("content") != null){
            news.setContent(highlightFields.get("content").get(0));
       }
        newsList.add(news);
   }
    return newsList;
}

Elasticsearch案例_创建Controller类

@RestController
public class NewsController {
    @Autowired
    private NewsService newsService;
    
    @GetMapping("/autoSuggest")
    public List<String> autoSuggest(String term){ // 前端使用jqueryUI,发送的参数默认名为term
        return newsService.autoSuggest(term);
   }
    
    @GetMapping("/highLightSearch")
    public List<News> highLightSearch(String term){
        return newsService.highLightSearch(term);
   }
}

Elasticsearch案例_前端页面

我们使用jqueryUI中的autocomplete插件完成项目的前端实现。

<script>
    $("#newsTag").autocomplete({
        source: "/autoSuggest", // 请求路径
        delay: 100, //请求延迟
        minLength: 1 //最少输入多少字符像服务器发送请求
   })
    function search() {
        var term = $("#newsTag").val();
        $.get("/highLightSearch", {term:term}, function (data) {
            var str = "";
            for (var i = 0; i < data.length;i++) {
                var document = data[i];
                str += "<li>" +
                    "       <h4>" +
                    "           <a href='" +document.url + "' target='_blank'>" +document.title + "</a>" +
                    "       </h4> " +
                    "       <p>" +document.content + "</p>" +
                    "   </li>";
           }
            $("#news").html(str);
       })
   }
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/734775.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多元分类预测 | Matlab 鲸鱼算法(WOA)优化xgboost的分类预测模型,多特征输入模型,WOA-xgboost分类预测

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元分类预测 | Matlab 鲸鱼算法(WOA)优化xgboost的分类预测模型,多特征输入模型,WOA-xgboost分类预测 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab,程序可…

MySQL查询作业

一、单表查询练习 1、查询出部门编号为30的所有员工 2、所有销售员的姓名、编号和部门编号。 3、找出奖金高于工资的员工。 4、找出奖金高于工资60%的员工。 5、找出部门编号为10中所有经理&#xff0c;和部门编号为20中所有销售员的详细资料。 6、找出部门编号为10中…

【三】部署zabbix-proxy代理服务器和高可用,以及监控windows系统和java应用

zabbix代理服务器和高可用 1.部署zabbix代理服务器1.1 代理端zabbix-proxy配置1.2 客户端zabbix-agent配置1.3 zabbix-proxy总结 2. 部署Zabbix高可用集群2.1 主节点zabbix-server配置2.2 备节点zabbix-server配置2.3 客户端zabbix_agent配置2.4 Zabbix高可用集群总结 3.Zabbix…

JavaScript异步编程:(回调函数、Promise、async/await、Generator)

文章目录 前言1. 回调函数1.1. 回调函数的基本概念和使用方法1.2. 回调函数的优缺点和注意事项1.3. 回调地狱和如何避免 2. Promise2.1. Promise 的基本概念和使用方法2.2. Promise 的状态和状态转换2.3. Promise 的链式调用和错误处理2.4. Promise.all 和 Promise.race 的使用…

MySQL数据库中对表进行创建,插入数据并对数据进行选择

目录 1.根据此图进行建表并插入数据 2.对表进行以下操作 a:显示所有职工的基本信息 b:查询所有职工所属部门的部门号&#xff0c;不显示重复的部门号 c:求出所有职工的人数 d:列出最高工和最低工资 e:列出职工的平均工资和总工资 f:创建一个只有职工号、姓名和参加工作的…

123.HTML5+CSS3完结_使用Netlify收取表单

Netlify也可以做表单接受&#xff1a; 我们启动一下 修改下表单 ● 接着在我们的网站输入并提交表单 ● 之后会有一个提示&#xff0c;提示我们提交成功 然后就能在Netlify接受到用户的表单 ● 当然这个表单只能接受100个&#xff0c;但是作为实验也够用了 到此&a…

文字磨练课程:提高编辑和校对效率的方法

提高编辑和校对效率&#xff0c;可以使你更有效地完成写作任务&#xff0c;提升文章质量。以下是一些方法&#xff0c;可以帮助你在编辑和校对过程中提高效率。 1.设定目标和计划 在开始编辑和校对前&#xff0c;设定明确的目标和计划。这可以帮助你集中注意力&#xff0c;提…

【SQL应知应会】表分区(一)• MySQL版

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习&#xff0c;有基础也有进阶&#xff0c;有MySQL也有Oracle 分区表 • MySQL版 一、分区表1.非分区表2.分区表2…

整齐有序!统一命名文件,高效管理数据轻松实现!

在数字化时代&#xff0c;我们每天都与大量文件打交道&#xff0c;文件名杂乱无章、难以辨识的情况是司空见惯的。这不仅浪费我们宝贵的时间&#xff0c;还可能导致信息混乱和数据丢失。但是&#xff0c;抛开这一切困扰吧&#xff01;现在&#xff0c;我们向您介绍一个简单却强…

C++—string类

本期我们来学习C的string&#xff0c;本期内容相当的多&#xff0c;且有一定难度&#xff0c;需要大家静下心来看 目录 1.标准库中的string 1.1string类的介绍 1.2 string类的常用接口 构造函数、析构函数、赋值、拷贝构造 npos push_back append operator[ ] size …

什么是ASPICE认证

ASPICE&#xff1a; “AutomotiveSoftware ProcessImprovement and CapacityDetermination”&#xff0c;即汽车软件过程改进及能力评定。它是一个过程模型&#xff0c;由过程和能力度两个维度构成&#xff0c;用于评价汽车行业软件设计开发的能力水平。 ASPICE的6个级别&…

基于simulink进行场景变化检测(附源码)

一、前言 此示例演示如何及时分割视频。此示例中的算法可用于检测视频流中的重大变化&#xff0c;例如广告开始和结束的时间。场景变换在广告和营销中被广泛应用。通过改变场景&#xff0c;可以吸引消费者的注意力&#xff0c;传达产品或服务的特点和优势。例如&#xff0c;将…

包揽七项葵花奖 参编多项标准 萤石领跑智能家居+物联网云平台行业

7月9日&#xff0c;2023第七届“葵花奖”智能家居评选颁奖盛典在广交会展馆举行&#xff0c;萤石网络一举斩获7项重磅奖项。同时&#xff0c;萤石作为参编单位&#xff0c;受邀参与了《智能门锁测评标准》发布仪式及《智能开关测评标准》启动会&#xff0c;再次彰显了其在智能家…

【一些随笔】浅析 Linux和Windows:系统介绍、操作差异与使用技巧解析

一些随笔 文章内容1️⃣ 那些在Linux上顺理成章&#xff0c;换到Windows上就可能令人费解的事2️⃣ Linux系统介绍及使用技巧3️⃣ Windows系统介绍及使用技巧 文章内容 Linux和Windows系统的操作差异&#xff1b;Linux系统介绍、系统监控和优化技巧、Shell脚本编程技巧、一些…

掌握Python文件操作的绝招:打造数据之径,揭开文件操作的神秘面纱

文章目录 前言文件的基本操作打开文件操作关闭文件操作对文件进行操作1&#xff09;只读文件操作read()readlines()readline()seek() 2&#xff09;只写文件操作3&#xff09;文件追加操作读写、追加读写操作1. r 模式打开文件2. w 模式打开文件3. a 模式打开文件 以二进制的形…

走向 Native 化:SpringDubbo AOT 技术示例与原理讲解

作者&#xff1a;刘军 Java 应用在云计算时代面临“冷启动”慢、内存占用高、预热时间长等问题&#xff0c;无法很好的适应 Serverless 等云上部署模式&#xff0c;GraalVM 通过静态编译、打包等技术在很大程度上解决了这些问题&#xff0c;同时针对 GraalVM 的一些使用限制&a…

用了国产接口管理神器 Apifox 之后,我果断从 Postman “脱坑”了

在当前行业发展背景下&#xff0c;绝大部分项目都是基于前后端分离的架构进行的&#xff0c;由前后端、测试、运维等不同的团队共同开发&#xff0c;那么团队之间能否很好的 协同合作 无疑直接决定着项目的最终效果。 但是在实际开发流程中&#xff0c;团队之间的协同是很低效…

网络编程5——TCP协议的五大效率机制:滑动窗口+流量控制+拥塞控制+延时应答+捎带应答

文章目录 前言一、TCP协议段与机制TCP协议的特点TCP报头结构TCP协议的机制与特性 二、TCP协议的 滑动窗口机制 三、TCP协议的 流量控制机制 四、TCP协议的 拥塞控制机制 五、TCP协议的 延时应答机制 六、TCP协议的 捎带应答机制 总结 前言 本人是一个普通程序猿!分享一点自己的…

c语言进阶-printf的用法拓展

Printf函数打印方法拓展&#xff1a; 字符串赋值给指针&#xff0c;相当于把h的地址赋值给p了。 printf函数直接放字符串也是把首地址给printf&#xff0c;然后printf从首地址打印到\0。 打印时可以直接传p地址

IDEA使用教程

1. 查看代码历史版本 若要查看特定 Java 类的代码历史版本&#xff0c;请执行以下操作&#xff1a; 鼠标右键点击所需查看的 Java 类。 在弹出菜单中选择 "Local History"&#xff08;本地历史&#xff09; >> "Show History"&#xff08;显示历史…