ElasticSearch 基础入门

89 阅读9分钟

1、ES中基本概念

1、接近实时(NRT Near Real Time )

Elasticsearch是一个接近实时的搜索平台。这意味着,从索引一个文档直到这个文档能够被搜索到有 一个轻微的延迟(通常是1秒内)

2、索引(index)

一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产 品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母的),并且 当我们要对这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。索引类似于 关系型数据库中Database 的概念。在一个集群中,如果你想,可以定义任意多的索引。

3、类型(type)

在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义 完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客 平台并且将你所有的数 据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客 数据定义另一个类型,当然,也可 以为评论数据定义另一个类型。类型类似于关系型数据库中Table的 概念。

4、映射(Mapping)

Mapping是ES中的一个很重要的内容,它类似于传统关系型数据中table的schema,用于定义一个索 引(index)中的类型(type)的数据的结构。 在ES中,我们可以手动创建type(相当于table)和mapping(相 关与schema),也可以采用默认创建方式。在默认配置下,ES可以根据插入的数据自动地创建type及其 mapping。 mapping中主要包括字段名、字段数据类型和字段索引类型

5、文档(document)

一个文档是一个可被索引的基础信息单元,类似于表中的一条记录。比如,你可以拥有某一个员工的文 档,也可以拥有某个商品的一个文档。文档以采用了轻量级的数据交换格式JSON(Javascript Object Notation)来表示。

6、概念关系图

image.png

2、Kibana的基本操作

1、索引(Index)的基本操作

PUT /dangdang/ 创建索引 
DELETE /dangdang 删除索引 
DELETE /* 删除所有索引 
GET /_cat/indices?v 查看索引信息

2、 类型(type)的基本操作

创建类型

1.创建/dangdang索引并创建(product)类型
PUT /dangdang
{
    "mappings": {
        "product": {
            "properties": {
                "title": {
                    "type": "text"
                },
                "name": {
                    "type": "text"
                },
                "age": {
                    "type": "integer"
                },
                "created": {
                    "type": "date"
                }
            }
        }
    }
}
注意: 这种方式创建类型要求索引不能存在

查看类型

GET /dangdang/mapping/product # 语法:GET /索引名/mapping/类型名

3、文档(document)的基本操作

1、添加文档

PUT /ems/emp/1 #/索引/类型/id
{
    "name": "赵小六",
    "age": 23,
    "bir": "2012-12-12",
    "content": "这是一个好一点的员工"
}

2、查询文档

GET /ems/emp/1
返回结果:
{
    "_index": "ems",
    "_type": "emp",
    "_id": "1",
    "_version": 1,
    "found": true,
    "_source": {
        "name": "赵小六",
        "age": 23,
        "bir": "2012-12-12",
        "content": "这是一个好一点的员工"
    }
}

3、删除文档

DELETE /ems/emp/1

{
    "_index": "ems",
    "_type": "emp",
    "_id": "1",
    "_version": 2,
    "result": "deleted", #删除成功
"_shards": {
        "total": 2,
        "successful": 1,
        "failed": 0
    },
    "_seq_no": 1,
    "_primary_term": 1
}

4、更新文档

1.第一种方式 更新原有的数据,数据完全改变

POST /dangdang/emp/1/_update
{
    "doc": {
        "name": "xiaohei"
    }
}

2.第二种方式 添加新的数据,这种更新,如果没有这个字段,就会添加上这个字段。

POST /ems/emp/1/_update
{
    "doc": {
        "name": "xiaohei",
        "age": 11,
        "dpet": "你好部门"
    }
}

3.第三种方式 在原来数据基础上更新

POST /ems/emp/1/_update
{
    "script": "ctx._source.age += 5"
}

ES的使用语法风格为: /// REST操作 /索引/类型/文档id

5、批量操作

  1. 批量索引两个文档
PUT /dangdang/emp/_bulk
{
    "index": {
        "_id": "1"
    }
}
{
    "name": "John Doe",
    "age": 23,
    "bir": "2012-12-12"
}
{
    "index": {
        "_id": "2"
    }
}
{
    "name": "Jane Doe",
    "age": 23,
    "bir": "2012-12-12"
}

2. 更新文档同时删除文档

POST /dangdang/emp/_bulk
{
    "update": {
        "_id": "1"
    }
}
{
    "doc": {
        "name": "lisi"
    }
}
{
    "delete": {
        "_id": 2
    }
}
{
    "index": {}
}
{
    "name": "xxx",
    "age": 23
}

注意:批量时不会因为一个失败而全部失败,而是继续执行后续操作,批量在返回时按照执行的状态开始返回

3、ES中高级检索(Query)

1、检索方式 _search

ES官方提供了两中检索方式:一种是通过 URL 参数进行搜索,另一种是通过 DSL(Domain Specified Language) 进行搜索。官方更推荐使用第二种方式第二种方式是基于传递JSON作为请求体(request body)格式与ES进行交互,这种方式更强大,更简洁。

image.png

  • 使用语法

URL查询: GET /索引/类型/_search?参数 DSL查询: GET /索引/类型/_search {}

2、测试数据

1.删除索引 

DELETE /ems

2.创建索引并指定类型
PUT /ems
{
    "mappings": {
        "emp": {
            "properties": {
                "name": {
                    "type": "text"
                },
                "age": {
                    "type": "integer"
                },
                "bir": {
                    "type": "date"
                },
                "content": {
                    "type": "text"
                },
                "address": {
                    "type": "keyword"
                }
            }
        }
    }
}

3、插入测试数据

PUT /ems/emp/_bulk
{
    "index": {}
}
{
    "name": "小黑",
    "age": 23,
    "bir": "2012-12-12",
    "content":"为开发团队选择一款优秀的MVC框
架是件难事儿,在众多可行的方案中决择需要很高的经验和水平","address":"北京"}
{
        "index": {}
    }
{
        "name": "王小黑",
        "age": 24,
        "bir": "2012-12-12",
        "content":"Spring 框架是一个分层架
构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理
bean 的方式","address":"上海"}
{
            "index": {}
        }
{
            "name": "张小五",
            "age": 8,
            "bir": "2012-12-12",
            "content":"Spring Cloud 作为Java 语
言的微服务框架,它依赖于Spring Boot,有快速开发、持续交付和容易部署等特点。Spring Cloud 的组
件非常多,涉及微服务的方方面面,井在开源社区Spring 和Netflix 、Pivotal 两大公司的推动下越来
越完善","address":"无锡"}
{
                "index": {}
            }
{
                "name": "win7",
                "age": 9,
                "bir": "2012-12-12",
                "content":"Spring的目标是致力于全方位的
简化Java开发。 这势必引出更多的解释, Spring是如何简化Java开发的?","address":"南京"}
{
                    "index": {}
                }
{
                    "name": "梅超风",
                    "age": 43,
                    "bir": "2012-12-12",
                    "content":"Redis是一个开源的使用ANSI
C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的
API","address":"杭州"}
{
                        "index": {}
                    }
{
                        "name": "张无忌",
                        "age": 59,
                        "bir": "2012-12-12",
                        "content":"ElasticSearch是一个基于
Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接
口","address":"北京"}

3、URL 检索

GET /ems/emp/_search?q=*&sort=age:asc

_search 搜索的API 
q=* 匹配所有文档 
sort 以结果中的指定字段排序

GET /ems/emp/search?q=*&sort=age:desc&size=5&from=0&source=name,age,bir

4、DSL检索

GET /ems/emp/_search
{
    "query": {
        "match_all": {}
    },
    "sort": [
        {
            "age": {
                "order": "desc"
            }
        }
    ]
}

4、DSL高级检索(Query)

1、查询所有(match_all)

match_all关键字: 返回索引中的全部文档

GET /ems/emp/_search
{
    "query": {
        "match_all": {}
    }
}

2、查询结果中返回指定条数(size)

size 关键字: 指定查询结果中返回指定条数。 默认返回值10条

GET /ems/emp/_search
{
    "query": {
        "match_all": {}
    },
    "size": 1
}

3、分页查询(from)

from 关键字: 用来指定起始返回位置,和size关键字连用可实现分页效果

GET /ems/emp/_search
{
    "query": {
        "match_all": {}
    },
    "sort": [
        {
            "age": {
                "order": "desc"
            }
        }
    ],
    "size": 2,
    "from": 1
}

4、查询结果中返回指定字段(_source)

_source 关键字: 是一个数组,在数组中用来指定展示那些字段

GET /ems/emp/_search
{
    "query": {
        "match_all": {}
    },
    "_source": [
        "account_number",
        "balance"
    ]
}

5、关键词查询(term)

term 关键字: 用来使用关键词查询

GET /ems/emp/_search
{
    "query": {
        "term": {
            "address": {
                "value": "北京"
            }
        }
    }
}
  • NOTE1: 通过使用term查询得知ES中默认使用分词器为标准分词器(StandardAnalyzer),标准分词器 对于英文单词分词,对于中文单字分词。
  • NOTE2: 通过使用term查询得知,在ES的Mapping Type 中 keyword , date ,integer, long , double , boolean or ip 这些类型不分词,只有text类型分词。

6、范围查询(range)

range 关键字: 用来指定查询指定范围内的文档

GET /ems/emp/_search
{
    "query": {
        "range": {
            "age": {
                "gte": 8,
                "lte": 30
            }
        }
    }
}

7、前缀查询(prefix)

prefix 关键字: 用来检索含有指定前缀的关键词的相关文档

GET /ems/emp/_search
{
    "query": {
        "prefix": {
            "content": {
                "value": "redis"
            }
        }
    }
}

8、通配符查询(wildcard)

wildcard 关键字: 通配符查询 ? 用来匹配一个任意字符 * 用来匹配多个任意字符

GET /ems/emp/_search
{
    "query": {
        "wildcard": {
            "content": {
                "value": "re*"
            }
        }
    }
}

9、多id查询(ids)

ids 关键字 : 值为数组类型,用来根据一组id获取多个对应的文档

GET /ems/emp/_search
{
    "query": {
        "ids": {
            "values": [
                "lg5HwWkBxH7z6xax7W3_",
                "lQ5HwWkBxH7z6xax7W3_"
            ]
        }
    }
}

10、模糊查询(fuzzy)

fuzzy 关键字: 用来模糊查询含有指定关键字的文档

GET /ems/emp/_search
{
    "query": {
        "fuzzy": {
            "content": "spring"
        }
    }
}

fuzzy 模糊查询 最大模糊错误 必须在0-2之间 
# 搜索关键词长度为 2 不允许存在模糊 0 
# 搜索关键词长度为3-5 允许一次模糊 0 1 
# 搜索关键词长度大于5 允许最大2模糊

11、布尔查询(bool)

bool 关键字: 用来组合多个条件实现复杂查询 must: 相当于&& 同时成立 should: 相当于|| 成立一个就行 must_not: 相当于! 不能满足任何一个

GET /ems/emp/_search
   {
   "query": {
       "bool": {
           "must": [
               {
                   "range": {
                       "age": {
                           "gte": 0,
                           "lte": 30
                       }
                   }
               }
           ],
           "must_not": [
               {
                   "wildcard": {
                       "content": {
                           "value": "redi?"
                       }
                   }
               }
           ]
       }
   },
   "sort": [
       {
           "age": {
               "order": "desc"
           }
       }
   ]
}

12、高亮查询(highlight)

highlight 关键字: 可以让符合条件的文档中的关键词高亮

GET /ems/emp/_search
{
  "query": {
      "term": {
          "content": {
              "value": "redis"
          }
      }
  },
  "highlight": {
      "fields": {
          "*": {}
      }
  }
}

自定义高亮html标签: 可以在highlight中使用 pre_tags 和 post_tag

GET /ems/emp/_search
{
  "query": {
      "term": {
          "content": "框架"
      }
  },
  "highlight": {
      "pre_tags": [
          "<span style='color:red'>"
      ],
      "post_tags": [
          "</span>"
      ],
      "fields": {
          "*": {}
      }
  }
}

多字段高亮 使用 require_field_match 开启多个字段高亮

GET /ems/emp/_search
{
  "query": {
      "term": {
          "content": "框架"
      }
  },
  "highlight": {
      "pre_tags": [
          "<span style='color:red'>"
      ],
      "post_tags": [
          "</span>"
      ],
      "require_field_match": false,
      "fields": {
          "*": {}
      }
  }
}

13、多字段查询(multi_match)

GET /ems/emp/_search
{
  "query": {
      "multi_match": {
          "query": "中国",
          "fields": [
              "name",
              "content"
          ] #这里写要检索的指定字段
      }
  }
}

14、多字段分词查询(query_string)

GET /dangdang/book/_search
{
  "query": {
      "query_string": {
          "query": "中国声音",
          "analyzer": "ik_max_word",
          "fields": [
              "name",
              "content"
          ]
      }
  }
}