Elasticsearch入门 1

Elasticsearch入门系列

  • Elasticsearch入门 1
  • Elasticsearch入门2
  • 全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选。

    它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、Github 都采用它。

    Elastic 的底层是开源库 Lucene。但是,你没法直接用 Lucene,必须自己写代码去调用它的接口。Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用。

    环境配置

    基础概念

    • Node 与 Cluster

      Elastic本质是分布式集群数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elastic 实例。

    • Index (数据库的同义词)

      索引实际上是指向一个或者多个物理 分片逻辑命名空间

      名字必须小写,不能以下划线开头,不能包含逗号

      Elastic 会索引所有字段,经过处理后写入一个反向索引(Inverted Index)。查找数据的时候,直接查找该索引。

      1
      http://localhost:9200/_cat/indices?v
    • Type (表-分组)

      是虚拟的逻辑分组,用来过滤 Document。

      命名可以是大写或者小写,但是不能以下划线或者句号开头,不应该包含逗号, 并且长度限制为256个字符

      不同的 Type 应该有相似的结构(schema),举例来说,id字段不能在这个组是字符串,在另一个组是数值。这是与关系型数据库的表的一个区别

      1
      http://localhost:9200/_mapping?pretty=true
    • Document (记录)

      Index 里面单条的记录称为 Document(文档)。许多条 Document 构成了一个 Index。

      默认的,一个文档中的每一个属性都是 被索引 的(有一个倒排索引)和可搜索的

      • 文档元数据

        _index:文档在哪存放

        _type:文档表示的对象类别

        _id:文档唯一标识

    交互

    客户端都是通过 9300 端口并使用 Elasticsearch 的原生 传输 协议和集群交互。集群中的节点通过端口 9300 彼此通信。如果这个端口没有打开,节点将无法形成一个集群。

    • 节点客户端

    ​ 不存储数据, 只存储数据在集群中的哪个节点中

    • 传输客户端

    ​ 将请求发送到远程集群,可以将请求转发到集群中的一个节点上。

    • RESTful API

      使用 RESTful API 通过端口 9200 和 Elasticsearch 进行通信

    基础操作

    创建索引

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    PUT请求
    http://127.0.0.1:9200/索引名
    ---------------------------------
    {
    "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
    },
    "mappings": {
    "Type名": {
    "properties": {
    "字段名": {
    "type": "integer"
    },
    }
    }
    }
    }

    // number_of_shards: 分片数
    // number_of_replicas: 分片备份

    数据插入

    插入时索引不存在默认创建索引和类型

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # 指定文档id(相同id更新整个文档)
    PUT请求
    http://127.0.0.1:9200/索引名/类型名/id
    ---------------------------------
    {
    "字段名": "字段值",
    }

    # 自动产生文档id
    POST请求
    http://127.0.0.1:9200/索引名/类型名
    ---------------------------------
    {
    "字段名": "字段值",
    }

    数据修改

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    # 文档修改
    POST请求
    http://127.0.0.1:9200/索引名/类型名/id/_update
    {
    "doc": {
    "字段名": "修改后字段值"
    }
    }

    # 脚本修改
    POST请求
    http://127.0.0.1:9200/索引名/类型名/id/_update
    {
    "script": {
    "lang": "painless",
    "inline": "ctx._source.字段名 += 字段值",
    "params": {
    "字段名": "字段值"
    }
    }
    }
    // lang: 使用什么脚本语言(painless)为es内部脚步语言
    // inline: 脚本
    // ctx: 为上下文
    // _source: 表示该文档
    // params: 通过参数的方式,在脚本中可通过 params.字段名 获得

    在集群环境下, 同时更新同一条文档, 出现冲突,Elasticsearch使用乐观并发控制更新将会失败。应用程序接下来将决定该如何解决冲突。

    数据删除

    1
    2
    3
    4
    5
    6
    # 删除文档
    DELETE请求
    http://127.0.0.1:9200/索引名/类型名/id

    # 删除索引
    http://127.0.0.1:9200/索引名

    数据查询

    Elasticsearch 默认按照相关性得分排序,即每个文档跟查询的匹配程度。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    GET请求
    http://127.0.0.1:9200/索引名[/类型名]/_search[?q=字段名:查询信息] # 返回所有记录

    POST请求
    http://127.0.0.1:9200/索引名/_search

    # 条件查询
    {
    "query:{
    "mathc_all" : {},
    "match": { "字段名": "查询信息" },
    "match_phrase": { "字段名": "查询信息" },
    "multi_match": {
    "query": "查询信息",
    "fields": ["字段名", "字段名"]
    },
    "query_string": {
    "query": "查询语法",
    "fields": ["字段名", "字段名"]
    },
    "term": { },
    "range": {
    "字段名": {
    "gte": "大于",
    "lte": "小于"
    }
    },
    "bool": {
    }
    },
    "from": 1,
    "size": 1,
    "sort": {
    "字段名": { "order": "DESC" }
    }
    }
    // query: 查询语句
    //- match_all查询所有
    //- match根据条件查询
    && 会对查询信息进行分词查询(找到包含查询信息中的关键词)
    //- match_phrase 句匹配(精准)
    && 不会对查询结果进行分词
    //- multi_match 多条件
    && 可对多个字段进行查询(match or match)
    //- query_string 语法查询
    && 使用es的查询语法[(查询 OR 查询) AND 查询]进行查询(可进行多字段查询)
    //- term 查找精确值
    //- range 查询范围
    // from: 从哪里开始查询(limit)
    // size: 查询大小(limit) 默认10条
    // sort: 排序

    # 聚合查询
    {
    "aggs": {
    "聚合名": {
    "terms": {
    "field": "聚合字段"
    },
    "stats":{
    "field": "聚合字段"
    }
    }
    }
    }
    // aggs: 聚合查询
    // terms: 进行聚合
    // stats: 字段统计
    查询结果
    • took: 操作的耗时(单位为毫秒)
    • hits: 命中的记录
      • total:返回记录数
      • max_score:最高的匹配程度
      • hits:返回的记录组成的数组

    参考:

    阮一峰-入门教程

    Elasticsearch: 权威指南

     上一篇

    Elastic 搜索