美文网首页
全文搜索之MySQL与ElasticSearch搜索引擎

全文搜索之MySQL与ElasticSearch搜索引擎

作者: 江月照我眠 | 来源:发表于2022-02-01 12:06 被阅读0次

    一、MySQL自带全文搜索

    MySQL支持全文索引和搜索功能。在MySQL中可以在CHAR、VARCHAR或TEXT列使用FULLTETXT来创建全文索引。
    FULLTEXT索引主要用MATCH()...AGAINST语法来实现搜索:

    SELECT * FROM user WHERE MATCH(username) AGAINST('bruce');
    

    MySQL的全文搜索存在以下局限:

    • 不区分大小写(与实际使用的字符集相关)
    • 默认不支持中文索引
    • 无法查询长度小于3和大于84个字母的词
    • 无法查询存储引擎的停止词

    通常来说MySQL自带的全文搜索使用起来局限性比较大,性能和功能都不太成熟,主要适用于小项目,大项目还是建议使用elasticsearch来做全文搜索。

    二、ElasticSearch搜索引擎

    1、ES到底是什么

    ElasticSearch是一个分布式的开源搜索和分析引擎,适用于所有类型的数据,包括文本、数字、地理空间、结构化和非结构化数据,以下简称ES。

    Elasticsearch 在 Apache Lucene 的基础上开发而成,Elasticsearch 以其简单的 REST 风格 API、分布式特性、速度和可扩展性而闻名,是 Elastic Stack 的核心组件。Elastic Stack 是适用于数据采集、充实、存储、分析和可视化的一组开源工具。

    2、ES的应用场景

    • 应用程序搜索
    • 网站搜索
    • 企业搜索
    • 日志处理和分析
    • 基础设施指标和容器监测
    • 应用程序性能监测
    • 地理空间数据分析和可视化
    • 安全分析
    • 业务分析

    3、ES的特点

    • 速度快:一般可在1s内获取到查询结果、
    • 分布式:存储的文档分布在不同的容器中,这些容器称为分片,可以进行复制以提供数据冗余副本,以防发生硬件故障。分布式的特点也使得ES可以很方便地扩展,并处理 PB 量级的数据。
    • 强大的内置功能:如数据汇总和索引生命周期管理等等。
    • 简化数据采集、可视化和报告过程:不仅数据提供实时可视化,同时还提供 UI 以便用户快速访问应用程序性能监测 (APM)、日志和基础设施指标等数据。

    4、ES的使用

    Elasticsearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elasticsearch 数据中心,再通过分词控制器去将对应的数据分词,将其权重和分词结果一并存入数据,当用户搜索数据时候,再根据权重将结果排名,打分,再将返回结果呈现给用户。

    由于ES是基于RESTfull Web接口的,因此我们直接按照惯例传递JSON参数调用接口即可实现增删改查,并且不需要我们做额外的管理操作就可以直接索引文档,ES已经内置了所有的缺省操作,可以自动帮我们定义类型。

    1)新增(PUT)
    PUT /megacorp/employee/1
    {
        "first_name":  "张",
        "last_name":  "白菜",
        "age": 18,
        "about": "一颗大白菜",
        "insterests": ["打篮球", "看书"]
    }
    
    2)删除(DELETE)
    DELETE /megacorp/employee/1
    
    3)修改(PUT)

    再次执行PUT,会对库中已有的id为1的数据进行覆盖,每修改一次_version字段的版本号就会加1。

    PUT /megacorp/employee/1
    {
        "first_name":  "张",
        "last_name":  "白菜",
        "age": 19,
        "about": "一颗大白菜呀",
        "insterests": ["打篮球", "看书"]
    }
    
    4)查询(GET)
    4.1) 默认搜索

    默认搜索会返回前10个结果:

    GET /megacorp/employee/_search
    

    返回的几个关键词:

    • took:查询花费的时间,单位ms。
    • hits:搜索的结果,total是全部满足文档的数目,hits是返回的实际数目(默认10)。
    • max_source:搜索的匹配度,最大为1,越大说明匹配度越高。
    4.2) 轻量搜索

    查询字符串搜索,可以像传递URL参数一样传递查询语句。

    GET /megacorp/employee/_search?q=白菜
    
    4.3) 高级搜索

    精确查询:

    GET /megacorp/employee/_search
    {
        "query": {
            "filtered":  {
                "filter": {
                    "range": {
                        "age": {
                            "gt": 25
                        }
                    }
                },
                "query": {
                    "match": {
                        "last_name": "白菜"
                    }
                }
            }
        }
    }
    

    全文搜索:

    GET /megacorp/employee/_search
    {
        "query": {
            "match": {
                "about": "大白菜"
            }
        }
    }
    

    三、将MySQL数据导入ElasticSearch

      1. 通过MySQL的binlog将MySQL的数据同步给ES。可以按照MySQL的replication协议,自己写一个客户端,模拟成MySQL slave,注册给MySQL master就可以了。这样就能将MySQL的数据更新通过binlog event实时同步给slave。
      1. 直接通过ES提供的REST API,通过HTTP的方式导入数据。

    以上两种方法都需要考虑数据更改后如何与ES进行同步。

    相关文章

      网友评论

          本文标题:全文搜索之MySQL与ElasticSearch搜索引擎

          本文链接:https://www.haomeiwen.com/subject/uvykkrtx.html