ElasticSearch语法和基础入门

ElasticSearch入门

文档Document

用户存储在es中的数据文档,是es存储数据的最小的一个单元。类似于关系型数据表中的一行数据。

每一个文档都有一个唯一的id标识:自行指定、es自动生成

Json Object,由字段(Field)组成,常见的数据类型如下:

  • 字符串:text(分词)、keyword(不分词)
  • 数字型:long、integer、short、byte、double、float、half_float、scaled_float
  • 布尔:boolean
  • 日期:date
  • 二进制:binary
  • 范围类型:integer_range、float_range、long_range、double_range、date_range

元数据

用于标注文档的相关信息

  • _index:文档所在的索引名
  • _type:文档所在的类型名
  • _id:文档唯一id
  • _uid:组合id,由_type和_id组成(6.x_type不再起作用,同_id一样)
  • _source:文档的原始Json数据,可以从这个获取每一个字段的内容
  • _all:整合所有字段的内容到该字段,默认禁用

索引Index

由具有相同字段的文档列表组成。类似于关系型数据库中的表,6.0版本。

索引中存储具有相同结构的文档(Document)。每个索引都有自己的mapping定义,用于定义字段名和类型

一个集群可以有多个索引。比如:

Nginx日志存储的时候可以按照日期每天生成一个索引存储

  • nginx-log-2017-01-01
  • nginx-log-2017-01-02
  • nginx-log-2017-01-03

节点Node

一个ElasticSearch的运行实例,是集群的构成单元。

集群Cluster

由一个或多个节点组成,对外提供服务

Rest API

ElasticSearch集群对外提供RESTful API

  • REST REpresentational State Transfer
  • URI指定资源,如Index、Document
  • Http Method指明资源操作类型,如GET、POST、PUT、DELTE等

交互方式:

  1. Curl命令行
  2. Kibana DevTools

索引API

es有专门的Index API,用户创建、更新、删除索引配置等

  • PUT /test_index --创建索引
  • GET _cat/indices --查看索引
  • DELETE /test_index --删除索引
  • POST /test_index/doc/1/_update --更新索引

文档Document API

es有专门的Document API /index/type/id

  • 创建文档

    • 指定ID:PUT /test_index/doc/1 {"username":"alfred","age":1} 创建文档时,如果索引不存在,es会自动创建index和type
    • 不指定ID:POST /test_index/doc {"username":"tom","age":20}
  • 查询文档

    • 指定ID:GET /test_index/doc/1
    • 搜索所有文档:GET /test_indes/doc/_search {"query":{"term":{"_id":1}}}
  • 批量创建

    • endpoint为_bulk POST _pulk action_tye:index、update、create、delete {"index":{"_index":"test_index","_type":"doc","_id":"3"}} {"username":"LZH","age":45} {"delete":{"_index":"test_index","_type":"doc","_id":"gg0mF2UBL7MW6CurOJYJ"}} {"update":{"_index":"test_index","_type":"doc","_id":1}} {"doc":{"age":11}}
  • 批量查询

    • endpoint为_mget GET _mget {"docs":[{"_index":"test_index","_type":"doc","_id":1},{"_index":"test_index","_type":"doc","_id":2},]}

倒排索引和分词

举例:在书中,目录页对应正排索引,索引页对应倒排索引

正排索引:可以通过文档的id到文档内容、单词(需要做分词处理)的关联关系

倒排索引:单词到文档id的关联关系

正排索引

文档ID到文档内容、单词的关联关系,类似于书的目录,类似如下表格,根据文档ID获取内容

文档ID 文档内容
1 ElasticSearch是最流行的搜索引擎
2 php是世界上最好的语言
3 ElasticSearch搜索引擎是如何诞生的

倒排索引

单词到文档ID的关联关系,类似书的索引页,类似如下表格,分词是倒排索引的一个前提条件,只有将文档内容进行分词以后才能进行倒排索引

单词 文档ID列表
ElasticSearch 1、3
流行 1
搜索引擎 1、3
php 2
世界 2
最好 2
语言 2
如何 3
诞生 3

查询实例步骤

  1. 通过倒排索引查询获得"搜索引擎"的对应的内容的ID有1和3
  2. 通过正排索引查询1和3,获取完整的内容
  3. 返回用户最终结果

ElasticSearch语法

_search查询数据
查询该索引下所有数据
bash 复制代码
GET /aaa/_search
根据条件查询
match
json 复制代码
{
  "query": {
    "match": {
      "name": "张三"
    }
  }
}

该语法是查询索引数据中带有"张三"的数据,但是es采用的是倒排索引,也就是拆词,索引name中带有"张三"的数据,会被查出来 备注 如果要精准查询,可以在字段加个keyword

bash 复制代码
GET /aaa/_search
{
  "query": {
    "match": {
      "name.keyword": "张三"
    }
  }
}

查询结果为

must

must子句:文档必须匹配must查询条件

bash 复制代码
GET /aaa/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "张三"
          }
        }
      ]
    }
  }
}
must_not

文档不能匹配must_not查询条件; 语法为

bash 复制代码
GET /aaa/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "张三"
          }
        }
      ],
      "must_not": [
        {
          "match": {
            "title": "bar"
          }
        }
      ]
    }
  }
}
should

should子句:查询一个或多个; 语法为

bash 复制代码
bash
复制代码
GET /aaa/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "name": "张三"
          }
        },
         {
          "match": {
            "name": "asds"
          }
        }
      ]
    }
  }
}

可以理解为查询name包含张三或者asds,查询结果为

filter

根据类型过滤,如根据年龄过滤

bash 复制代码
GET /aaa/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "range": {
            "age": {
              "gte": 10,
              "lte": 20
            }
          }
        }
      ]
    }
  }
}
根据id查询

(1)根据id查询单个

bash 复制代码
GET /aaa/_doc/1

(2)根据多个id取回多个文档

bash 复制代码
GET /_mget
{
   "docs" : [
      {
         "_index" : "aaa",
         "_id" :    20
      },
      {
         "_index" : "aaa",
         "_id" :    1
      }
   ]
}
保存数据

(1)指定主键

bash 复制代码
PUT /aaa/_doc/20
{
  "id": 20,
  "name": "John",
  "age": 20
}

指定文档的id为20

(2)随机生成主键id

bash 复制代码
POST /aaa/_doc
{
  "id": 20,
  "name": "Joh1n",
  "age": 20
}
更新数据
bash 复制代码
PUT /aaa/_doc/20
{
  "id": 20,
  "name": "John20",
  "age": 20
}

如果id=20存在就更新

总结

es查询语法同级分为 must(等于并且等于的条件查询) must_not(不等于的条件查询) should(等于或者等于的条件查询) filter(数据过滤,范围查询,大于小于的条件查询)

相关推荐
刘大辉在路上3 小时前
突发!!!GitLab停止为中国大陆、港澳地区提供服务,60天内需迁移账号否则将被删除
git·后端·gitlab·版本管理·源代码管理
追逐时光者5 小时前
免费、简单、直观的数据库设计工具和 SQL 生成器
后端·mysql
初晴~6 小时前
【Redis分布式锁】高并发场景下秒杀业务的实现思路(集群模式)
java·数据库·redis·分布式·后端·spring·
盖世英雄酱581366 小时前
InnoDB 的页分裂和页合并
数据库·后端
小_太_阳6 小时前
Scala_【2】变量和数据类型
开发语言·后端·scala·intellij-idea
直裾6 小时前
scala借阅图书保存记录(三)
开发语言·后端·scala
星就前端叭7 小时前
【开源】一款基于Vue3 + WebRTC + Node + SRS + FFmpeg搭建的直播间项目
前端·后端·开源·webrtc
小林coding8 小时前
阿里云 Java 后端一面,什么难度?
java·后端·mysql·spring·阿里云
AI理性派思考者8 小时前
【保姆教程】手把手教你在Linux系统搭建早期alpha项目cysic的验证者&证明者
后端·github·gpu