当前位置: 首页 > news >正文

分布式搜索(Elasticsearch)深入用法

目录

数据聚合

聚合的种类

DSL实现聚合

桶聚合

度量聚合

RestAPI实现聚合

多条件聚合

自动补全

拼音分词器

自定义分词器

自动补全查询

实现搜索框自动补全

数据同步

数据同步思路分析

实现elasticsearch与数据库数据同步

集群

搭建ES集群

集群脑裂问题

集群故障转移

集群分布式存储

集群分布式查询


数据聚合

聚合的种类

聚合可以实现对文档数据的统计、分析、运算。聚合常见的有三类:

桶聚合:用来对文档做分组

           TermAggregation:按照文档字段值分组

           Date Histogram:按照日期阶梯分组,例如一周为一组,或者一月为一组

度量聚合:用以计算一些值,比如:最大值、最小值、平均值等

           Avg:求平均值

          Max:求最大值

          Min:求最小值

          Stats:同时求max、min、avg、sun等

管道聚合:其它聚合结果为基础做聚合

参与聚合的字段类型必须是:

keyword

数值

日期

布尔

DSL实现聚合

桶聚合

默认情况下,桶聚合会统计桶内的文档数量,记为_count,并且按照_count 降序排序。我们可以修改结果排序方式:

 默认情况下,桶聚合是对索引库的所有文档做聚合,我们可以限定要聚合的文档范围,只要添加query条件即可:

度量聚合

例如,我们要求获取每个品牌的用户评分的min、max、avg等值.

RestAPI实现聚合

聚合请求的构造

聚合结果的解析

多条件聚合

多条件聚合构建

结果解析

自动补全

拼音分词器

使用拼音分词

要实现根据字母做补全,就必须对文档按照拼音分词。插件:infinilabs/analysis-pinyin: 🛵 This Pinyin Analysis plugin is used to do conversion between Chinese characters and Pinyin.

下载完将压缩包解压到es的plugins目录即可

自定义分词器

Elasticsearch 中分词器(Analyzer)的组成包含三部分:

  1. Character Filters(字符过滤器)

    • 在 Tokenizer 之前对原始文本进行预处理。

    • 例如:删除特殊字符、替换字符(如将 & 替换为 and)。

  2. Tokenizer(分词器)

    • 将文本按照特定规则切割成词条(Term)。

    • 例如:

      • keyword:不分词,将整个文本作为一个词条。

      • ik_smart:智能切分(粗粒度分词)。

  3. Token Filters(词条过滤器)

    • 对 Tokenizer 输出的词条进行进一步处理。

    • 例如:大小写转换、同义词处理、拼音处理等。

我们可以在创建索引库时,通过setting来配置自定义的analyzer(分词器):

自定义分词器配置

拼音分词器适合在创建倒排索引的时候使用,但不能在搜索的时候使用。

因此字段在创建倒排索引时应该用my_analyzer分词器;字段在搜索时应该使用ik__smart分词器;

自动补全查询

es提供了Completion Suggerter查询来实现自动补全功能。这个查询会匹配以用户输入内容开头的词条并返回。为了提高补全查询的效率,对于文档中字段的类型有一些约束:

  参与补全查询的字段必须是completion类型。

  

字段的内容一般是用来补全的多个词条形成的数组

查询语法

实现搜索框自动补全

1.修改索引库,设置自定义拼音分词器

2.修改索引库的name、all字段,使用自定义分词器

3.索引库添加一个新字段suggestion,类型为completion 字段,使用自定义分词器

4.给实体类添加suggestion字段,内容包含所需要补词的内容

5.重新导入数据

RestAPI实现自动补全

结果解析

数据同步

数据同步问题分析

es中酒店数据来自于mysql数据库,因此mysql数据发生改变时,es也必须跟着改变,这个就是es与mysql之间的数据同步。

数据同步思路分析

方案一:同步调用

优点:实现简单,粗暴

缺点:耦合度高

方案二:异步通知

优点:低耦合,实现难度一般

缺点:依赖mq的可靠性

方案三:监听binlog

优点:完全接触服务间耦合

缺点:开启binlog增加数据库负担、实现复杂度高

实现elasticsearch与数据库数据同步

利用MQ实现mysql与es数据同步

步骤:

导入数据

声明exchange、queue、RoutingKey

完成数据库中增、删、改业务并完成消息发送

完成消息监听并且更新es中数据

导入MQ依赖

配置MQ

集群

ES集群结构

单机的es做数据存储,必然面临两个问题:海量的数据存储问题、单点故障问题。

海量数据存储问题:将索引库从逻辑上拆分为N个分片,存储到多个节点

单点故障问题:将分片数据在不同节点备份

搭建ES集群

利用docker容器模拟3个es的节点。

集群脑裂问题

集群故障转移

集群分布式存储

集群分布式查询

http://www.dtcms.com/a/339659.html

相关文章:

  • git 创用操作
  • java快速接入mcp以及结合mysql动态管理
  • 【SQL优化案例】统计信息缺失
  • 前端使用koa实现调取deepseekapi实现ai聊天
  • RabbitMQ:SpringAMQP Fanout Exchange(扇型交换机)
  • Apache ECharts 6.0.0 版本-探究自定义动态注册机制(二)
  • HTML5视频加密播放的主要优势
  • 本地存储(Local Storage)与Cookie的深度对比
  • RWA在DeFi中的应用
  • 行业分析---领跑汽车2025第二季度财报
  • EasyExcel 合并单元格最佳实践:基于注解的自动合并与样式控制
  • 大模型如何通过人工指标来评估效果?有哪些常用的人工指标?
  • FGF21对牛磺胆酸钠诱导的急性胰腺损伤的应答
  • DAY48 随机函数与广播机制
  • 补偿电流控制的APF并联型有源电力滤波器simulink
  • 2025年09月计算机二级MySQL选择题每日一练——第一期
  • 《深入源码理解webpack构建流程》
  • springboot 项目正常启动后自动结束
  • 当硅基生命遇见碳基萌宠:Deepoc具身智能如何重新定义“宠物监护者”
  • 【QT入门到晋级】进程间通信(IPC)-socket(包含性能优化案例)
  • UX 设计入门第二课:如何洞察人心?用户研究方法论导览
  • elementplus组件文本框设置前缀
  • 07复杂度分析实战习题集
  • PG靶机 - Pebbles
  • 无人机/航测/三维建模领域常见的“航线规划或建模方式
  • 基于单片机智能拐杖/导盲杖/老人防摔倒设计
  • python-林粒粒的视频笔记1
  • 网络数据包
  • 用relation-graph构建关系图谱 vue版
  • 单片 、物联网、51单片机、软硬件之基于STM32与蓝牙的仓储管控系统的设计与实现/基于物联网的仓库管理系统