1. 首页
  2. 后端

ElasticSearch语法和基础入门

  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查询数据
查询该索引下所有数据
GET /aaa/_search
根据条件查询
match
{
  "query": {
    "match": {
      "name": "张三"
    }
  }
}

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

GET /aaa/_search
{
  "query": {
    "match": {
      "name.keyword": "张三"
    }
  }
}

查询结果为

image.png

image.png

must

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

GET /aaa/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "张三"
          }
        }
      ]
    }
  }
}
must_not

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

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

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

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

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

image.png

filter

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

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

(1)根据id查询单个

GET /aaa/_doc/1

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

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

(1)指定主键

PUT /aaa/_doc/20
{
  "id": 20,
  "name": "John",
  "age": 20
}

指定文档的id为20

(2)随机生成主键id

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

如果id=20存在就更新

总结

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

原文链接: https://juejin.cn/post/7350654839520149538

文章收集整理于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除,如若转载,请注明出处:http://www.cxyroad.com/17268.html

QR code