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

IM项目-----ElasticSearch

文章目录

  • 前言
  • 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.kler.cn/a/408771.html

相关文章:

  • c++ unordered_set和unordered_map
  • cangjie (仓颉) vscode环境搭建
  • Android Binder技术概览
  • 使用Notepad++工具去除重复行
  • 开源项目-如何更好的参与开源项目开发
  • Python操作neo4j库py2neo使用之创建和查询(二)
  • C++游戏《密室逃脱2.0》预告
  • 【云计算】CentOS7.9. LVM扩容实战小记
  • private static final long serialVersionUID = 1L
  • 基于微信小程序的教室预约系统+LW示例参考
  • leetcode:124二叉树中最大路径和
  • opencv细节
  • unity小:URP下shaderGraph管道流光效果(节奏速率可控)
  • 数据源的统一与拆分 apache calcite 的雄心与现实
  • Unity图形学之边缘检测
  • moduo之线程池ThreadPool
  • JavaScript中的箭头函数以及编写优化
  • Java安卓导航栏设计开发(实战篇)——第十一期
  • mysql-分析并解决mvcc更新丢失问题
  • shell完结
  • git标签和分支
  • 如何在WPF中嵌入其它程序
  • 数据结构--链表实现栈和队列
  • 构建功能完备的Flask Web应用
  • Flink转换算子——flatMap/map/filter/keyby/reduce综合案例
  • meterpreter常用命令 上