ElasticSeach

2020-05-17  本文已影响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,只读索引

上一篇下一篇

猜你喜欢

热点阅读