美文网首页
后端存储6(ES)

后端存储6(ES)

作者: 兮兮码字的地方 | 来源:发表于2020-10-02 14:57 被阅读0次

    如何用 ES(Elasticsearch) 构建一个搜索系统

    首先数据库不适合做搜索。搜索的核心需求是全文匹配,对于全文匹配,数据库的索引是根本派不上用场的,这个速度就更慢了。所以,使用数据来做搜索,性能上完全没法满足要求。

    倒排索引

     ES通过倒排索引可以做到快速搜索,ES 的存储引擎存储倒排索引时,它的物理存储结构和 MySQL 的 InnoDB 的索引是差不多的,都是一颗查找树。

    如何在 ES 中构建商品的索引

    ES 里面的一些概念,基本上都可以在关系数据库中找到对应的名词:

    在 ES 里面,数据的逻辑结构类似于 MongoDB,每条数据称为一个 DOCUMENT,简称 DOC。DOC 就是一个 JSON 对象,DOC 中的每个 JSON 字段,在 ES 中称为 FIELD,把一组具有相同字段的 DOC 存放在一起,存放它们的逻辑容器叫 INDEX,这些 DOC 的 JSON 结构称为 MAPPING。这个 INDEX,它实际上类似于 MySQL 中表的概念,而不是我们通常理解的用于查找数据的索引。

    操作:首先安装 ES 并启动服务,然后创建一个 INDEX,定义 MAPPING,写入数据后,执行查询并返回查询结果。

    实例

    参照ES 的官方文档先把 ES 安装好。

    执行下面的命令自动下载并安装中文分词插件 IK:

    $elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.6.0/elasticsearch-analysis-ik-7.6.0.zip

    安装完成后,需要重启 ES,验证一下是否安装成功:

    curl -X POST "localhost:9200/_analyze?pretty" -H 'Content-Type: application/json' -d '{ "analyzer": "ik_smart", "text": "极客时间" }'

    {

      "tokens" : [

        {

          "token" : "极",

          "start_offset" : 0,

          "end_offset" : 1,

          "type" : "CN_CHAR",

          "position" : 0

        },

        {

          "token" : "客",

          "start_offset" : 1,

          "end_offset" : 2,

          "type" : "CN_CHAR",

          "position" : 1

        },

        {

          "token" : "时间",

          "start_offset" : 2,

          "end_offset" : 4,

          "type" : "CN_WORD",

          "position" : 2

        }

      ]

    }

    定义存放在 ES 中商品的数据结构,也就是 MAPPING。

    使用这个 MAPPING 创建 INDEX,类似于 MySQL 中创建一个表:

    curl -X PUT "localhost:9200/sku" -H 'Content-Type: application/json' -d '{

            "mappings": {

                    "properties": {

                            "sku_id": {

                                    "type": "long"

                            },

                            "title": {

                                    "type": "text",

                                    "analyzer": "ik_max_word",

                                    "search_analyzer": "ik_max_word"

                            }

                    }

            }

    }'

    {"acknowledged":true,"shards_acknowledged":true,"index":"sku"}

    使用 PUT 方法创建一个 INDEX,INDEX 的名称是“sku”,直接写在请求的 URL 中。请求的 BODY 是一个 JSON 对象,内容就是我们上面定义的 MAPPING,也就是数据结构。由于我们要在 title 这个字段上进行全文搜索,所以我们把数据类型定义为 text,并指定使用我们刚刚安装的中文分词插件 IK 作为这个字段的分词器。创建好 INDEX 之后,就可以往 INDEX 中写入商品数据,插入数据需要使用 HTTP POST 方法:

    curl -X POST "localhost:9200/sku/_doc/" -H 'Content-Type: application/json' -d '{

            "sku_id": 100002860826,

            "title": "烟台红富士苹果 5kg 一级铂金大果 单果230g以上 新鲜水果"

    }'

    {"_index":"sku","_type":"_doc","_id":"yxQVSHABiy2kuAJG8ilW","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":0,"_primary_term":1}

    curl -X POST "localhost:9200/sku/_doc/" -H 'Content-Type: application/json' -d '{

            "sku_id": 100000177760,

            "title": "苹果 Apple iPhone XS Max (A2104) 256GB 金色 移动联通电信4G手机 双卡双待"

    }'

    {"_index":"sku","_type":"_doc","_id":"zBQWSHABiy2kuAJGgim1","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":1,"_primary_term":1}

    然后就可以直接进行商品搜索了,搜索使用 HTTP GET 方法。

    curl -X GET 'localhost:9200/sku/_search?pretty' -H 'Content-Type: application/json' -d '{

      "query" : { "match" : { "title" : "苹果手机" }}

    }'

    相关文章

      网友评论

          本文标题:后端存储6(ES)

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