IM项目-----ElasticSearch

ops/2024/11/28 1:49:32/

文章目录

  • 前言
  • ES介绍
  • 建立索引
      • 创建索引
  • 新增文档
  • 删除文档
  • 修改文档
  • 查询文档
  • ES和Mysql数据如何保证一致


前言


ES介绍

在IM项目中通过引入ES,支持了用户搜索和历史消息的搜索。传统的关系型数据库主要是用于事务的复杂操作,对于这种需要模糊匹配的查询语句,索引会失效,进而进行全表扫描,对于数据量大的表效率是极其差的。
ES通过建立倒排索引的方式,根据用户搜索的词条进行模糊查询效率较高。ES是基于文档进行存储的。文档就相当于MYsql中的一行数据,里面存储的是通过Json序列化后的数据。
ES中有几个关键的概念:

  1. 索引, 相当于Mysql中的表
  2. 文档,MYsql中的一行记录
  3. 映射,MYsql中的表结构和约束
  4. Field,MYsql中的字段
  5. DSL,ES通过基于Json的DSL语句进行操作。

建立索引

建立索引就是建立"数据库表",那么就需要建立索引库映射
其中映射有几个关键的属性:

  1. 字段名
  2. 类型,项目中用到了text,keyword,long三种类型
  3. 是否建立索引,根据业务来定,就是是否参与搜索
  4. 分词器,默认选择ik_max_word就行,更细粒度的划分。

创建索引

使用kiban编写DSL语句,创建索引使用PUT /索引库名称。

PUT /索引库名称
{"mappings": {"properties": {"user_id":{"type": "keyword","index": "true","analyzer": "starnd"},"nickname":{"type": "text","index": "true","analyzer": "ik_max_word"},"phone_number":{"type": "keyword","index": "true","analyzer": "starnd"}},// ...略}}
}

新增文档

项目中通过user_id和message_id作为文档ID。
_doc是早期ES版本遗留下的概念,现在已经不使用了,但是默认加上。

POST /索引库名/_doc/文档id
{"字段1": "值1","字段2": "值2",// ...
}

删除文档

删除使用DELETE ,和Http比较像,我们使用的客户端elasticlient也是通过http协议与ES通信的。

DELETE /{索引库名}/_doc/id值

修改文档

修改分为全量修改和部分修改,项目中只使用到了部分修改。

POST /{索引库名}/_update/文档id
{"doc": {"字段名": "新的值",}
}

查询文档

查询文档的基本语法。

GET /indexName/_search
{"query": {"match": {"FIELD": "TEXT"}}
}

但是在项目中我们需要给查询加一些约束,在用户搜索中,我们需要添加must_not字段来屏蔽掉我们的好友,已经是好友的不能被搜索到,使用should字段表示可以匹配的条件。使用 “minimum_should_match”: 1,要求至少需要有一个should字段被匹配。
在这里插入图片描述

在搜索历史消息时,我们需要添加must字段来约束chat_session_id必须匹配,使用should字段来匹配用户输入的关键字。

ES和Mysql数据如何保证一致

在项目中主要是通过代码层面的同步保持一致,在插入mysql后,会同步插入ES。但是这样业务侵入性太强了。且容易造成数据不一致(写入mysql后ES的写入失败)。

其他方案:

  1. 引入MQ,在写入mysql后发送一条消息到MQ,使用一个线程消费消息。通过MQ的重复消费可以确保数据的一致,但是引入MQ系统的复杂度上升,且引入一个组件,可用性也需要对齐进行保证。
  2. 使用阿里的canal组件,订阅binlog,cancl客户端通过TCP长连接或监听MQ来同步至ES。

http://www.ppmy.cn/ops/137231.html

相关文章

Java 对象头、Mark Word、monitor与synchronized关联关系以及synchronized锁优化

1. 对象在内存中的布局分为三块区域: (1)对象头(Mark Word、元数据指针和数组长度) 对象头:在32位虚拟机中,1个机器码等于4字节,也就是32bit,在64位虚拟机中&#xff0…

跨子网通信的具体流程

TCP/IP 数据包的封装(发送方): TCP 封装:应用程序的数据被 TCP 协议封装为一个 TCP 数据段,包含序列号等信息。IP 封装:TCP 数据段被 IP 协议封装为一个 IP 数据包,包含源 IP 和目标 IP 地址。M…

在Linux中备份msyql数据库和表的详细操作

目录 前情提要 一、备份mysql数据库 原库展示 (一)新建一个数据库 (二)在linux根目录下找个位置暂时存放 (三)临时sql还原真正存放到库中 (四)查看是否备份成功 备份库成功展示 二、备份表的操作 ​编辑 原表emp展示 (一)快速新建一个原结构相同的表 (二)原表所…

一文详细了解websocket应用以及连接断开的解决方案

文章目录 websocketvite 热启动探索websocket -心跳websocket 事件监听应用过程中问题总结 websocket Websocket简介 定义和工作原理 Websocket是一种在单个TCP连接上进行全双工通信的协议。与传统的HTTP请求 - 响应模式不同,它允许服务器主动向客户端推送数据。例…

pytest 通过实例讲清单元测试、集成测试、测试覆盖率

1. 单元测试 概念 定义: 单元测试是对代码中最小功能单元的测试,通常是函数或类的方法。目标: 验证单个功能是否按照预期工作,而不依赖其他模块或外部资源。特点: 快速、独立,通常是开发者最先编写的测试。 示例:pytest 实现单…

网络知识1-TCP/IP模型

从用户端到服务端,tcp/ip模型可分为应用层、传输层、网络层、网络接口层 以下使用寄快递为例进行解释 应用层职责: 只关注与为用户提供应用功能,如HTTP、FTP、telnet、DNS、SMTP等 ,应用层的职责就像我们寄快递时将快递给快递员…

CMake Qt Debug/Release可执行文件增加图标

将logo.ico复制到CMakeLists.txt的同级目录下,然后新建logo.rc文件,里边输入如下代码 IDI_ICON1 ICON DISCARDABLE "logo.ico"CMakeLists.txt修改此处 ADD_EXECUTABLE(${ModuleName} ${KIT_SRCS} ${QRC_SRCS} ${UISrcs} ${MOC_OUTPUT} logo.…

2062:【例1.3】电影票(http://ybt.ssoier.cn:8088/problem_show.php?pid=2062)

时间限制: 1000 ms 内存限制: 65536 KB 【题目描述】 已知一位小朋友的电影票价是10元,计算x位小朋友的总票价是多少? 【输入】 输入x。 【输出】 人数和电影票总价,中间用一个空格隔开。 【输入样例】 2 【输出样例】 2 20 提交…