美文网首页
ElasticSeach

ElasticSeach

作者: 安申 | 来源:发表于2020-05-17 23:47 被阅读0次

    ES基本概念(ES是非关系型数据库)

    Index(索引-数据库):

    ES 数据管理的顶层单位就叫做 Index(索引),每个 Index (即数据库)的名字必须是小写。

    Type(类型-表):

    Document 可以分组,比如weather这个 Index 里面,可以按城市分组(北京和上海),也可以按气候分组(晴天和雨天)。这种分组就叫做 Type,它是虚拟的逻辑分组,用来过滤 Document。

    Elastic 6.x 版只允许每个 Index 包含一个 Type,7.x 版将会彻底移除 Type。所以现在的ES应移除了Type的概念,不需要了解太多了

    Document(文档-行):

    Index 里面单条的记录称为 Document(文档)。许多条 Document 构成了一个 Index。Document 使用 JSON 格式表示,同一个 Index 里面的 Document,不要求有相同的结构(schema),但是最好保持相同,这样有利于提高搜索效率,通常用Json数据结构表示

    Field(字段-列):

    就像Mysql中表每一行数据里面有好多字段,每个字段的数据内容

    Mapping(映射-约束):
    Mapping用来定义Document中每个字段的类型(像极了Mysql数据库中创建表结构一样,这里创建每个document的字段及字段类型),包括:数据类型、是否存储、是否分词等

     ElasticSearch存入数据和搜索数据机制

    ES的基本使用

    ES可以自动识别文档字段类型,从而降低用户使用成本

    (1)直接插入文档

    PUT /test_index/_doc/1        //因为使用的ES版本是6.3.1的,所以底层默认会有一个Type(默认是_doc),但是ES到了7.x之后,彻底移除了Type

    {

     "username":"alfred",

      "age":1,

    "birth":"1991-12-15"

    }

    (2)查看mapping

    GET/test_index/doc/_mapping

    {

      "test_index": {

        "mappings": {

          "doc": {

            "properties": {

              "age": {

                "type": "long"

              },

              "birth":{

                "type": "date"

              },

              "username": {

                "type": "text",

                "fields": {

                 "keyword": {

                   "type": "keyword",

                   "ignore_above": 256

                  }

                }

              }

            }

          }

        }

      }

    }

    age自动识别为long类型,username识别为text类型

    IK分词器

    1.为什么使用分词器

    分词器主要应用在中文上,在ES中字符串类型有keyword和text两种。keyword默认不进行分词,而text是将每一个汉字拆开称为独立的词,这两种都是不适用于生产环境,所以我们需要有其他的分词器帮助我们完成这些事情,其中IK分词器是应用最为广泛的一个分词器。

    2.IK分词器分类

    1)最少划分ik_smart

    get _analyze

    {

      "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" : 5,

                "type": "CN_WORD",

                "position" : 2

            }

        ]

    }

    2)最细切分ik_max_word

    get _analyze

    {

      "analyzer":"ik_max_word",

      "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" : 5,

                "type": "CN_WORD",

               "position" : 2

            },

            {

                "token" : "程序",

               "start_offset" : 2,

               "end_offset" : 4,

                "type" : "CN_WORD",

                "position" : 3

            },

            {

                "token": "员",

               "start_offset" : 4,

               "end_offset" : 5,

                "type" :"CN_CHAR",

               "position" : 4

            }

        ]

    }

    1.每次执行POST或者PUT接口,如果文档已存在,那么相应的版本就会自动加1,即_version,之前的版本抛弃。我们可以使用op_type=create端点接口来实现

    2.查询整个文档数据

    GET twitter/_doc/1/_source

    3.查询文档中的部分字段你

    GET twitter/_doc/1?_source=user,country

    3.同时请求多个id的文档数据

    GET twitter/_doc/_mget

    {

    "ids": ["1","2"]

    }

    4.检查文档是否存在

    HEAD twitter/_doc/1

    显示OK则表示存在.

    5.删除一个文档

    DELETE twitter/_doc/1

    6.删除一个index

    DELETE twitter

    当我们执行完这一条语句后,所有的在twitter中的所有的文档都将被删除。

    7.open/close Index

     关闭索引后,将阻止读/写操作。

    POST twitter/_close,这之后再GET的话就会报错

    GET twitter/_doc/1

    8.冻结索引

    Freeze/unfreeze index,只读索引

    相关文章

      网友评论

          本文标题:ElasticSeach

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