ElasticSearch学习笔记四:基础操作(二)

时间:2024-11-20 21:10:53

一、前言

上一篇文章中我们学习了ES中的基础操作,包括索引和映射,同时也学习了ES中的基础数据类型,今天我们继续学习其他的数据类型。

二、复杂数据类型

1、数组(Array)

在ES中没有特别指定数据类型,换句话说任何类型的字段都可以组成数组。对于一个数组内所有数据的类型必须一致。例如 array1 [1,2,3,4,5] ,对于对象数组(数组内的元素是对象)有些特别,ES不支持独立的查询数组内的对象,如果想使用则使用 Nested(嵌套类型),这个放到后面学习。

案例:

PUT my-index-000001/_doc/1
{
  "message": "some arrays in this document...",
  "tags":  [ "elasticsearch", "wow" ], 
  "lists": [ 
    {
      "name": "prog_list",
      "description": "programming list"
    },
    {
      "name": "cool_list",
      "description": "cool stuff list"
    }
  ]
}

PUT my-index-000001/_doc/2 
{
  "message": "no arrays in this document...",
  "tags":  "elasticsearch",
  "lists": {
    "name": "prog_list",
    "description": "programming list"
  }
}

GET my-index-000001/_search
{
  "query": {
    "match": {
      "tags": "elasticsearch" 
    }
  }
}

这里可以看到文档2并没有数组,但是也可以正常写入,再解释一下上面说的无法单独查询数组内的对象,因为ES会把数组扁平化,所以我搜索“prog_list”,也会把“cool_list”带出来,因为他们在一个数组内,而不是单独的对象。

2、Object

对于JSON对象来说很多时候是分层的,也就是说有内部对象,此时就可以使用Object类型

案例:

PUT my-index-000001/_doc/1
{ 
  "region": "US",
  "manager": { 
    "age":     30,
    "name": { 
      "first": "John",
      "last":  "Smith"
    }
  }
}

当然也可以换一种方式创建
PUT my-index-000001
{
  "mappings": {
    "properties": { 
      "region": {
        "type": "keyword"
      },
      "manager": { 
        "properties": {
          "age":  { "type": "integer" },
          "name": { 
            "properties": {
              "first": { "type": "text" },
              "last":  { "type": "text" }
            }
          }
        }
      }
    }
  }
}

3、Nested

嵌套类型是对象数据类型的特殊版本,它允许以可以彼此独立查询的方式对对象数组进行索引。

案例

PUT my-index-000001
{
  "mappings": {
    "properties": {
      "user": {
        "type": "nested" 
      }
    }
  }
}

PUT my-index-000001/_doc/1
{
  "group" : "fans",
  "user" : [
    {
      "first" : "John",
      "last" :  "Smith"
    },
    {
      "first" : "Alice",
      "last" :  "White"
    }
  ]
}

GET my-index-000001/_search
{
  "query": {
    "nested": {
      "path": "user",
      "query": {
        "bool": {
          "must": [
            { "match": { "user.first": "Alice" }},
            { "match": { "user.last":  "Smith" }} 
          ]
        }
      }
    }
  }
}

GET my-index-000001/_search
{
  "query": {
    "nested": {
      "path": "user",
      "query": {
        "bool": {
          "must": [
            { "match": { "user.first": "Alice" }},
            { "match": { "user.last":  "White" }} 
          ]
        }
      },
      "inner_hits": { 
        "highlight": {
          "fields": {
            "user.first": {}
          }
        }
      }
    }
  }
}
与上面数组很像,不同的是Nested支持对数组内的数据单独进行搜索,这里不多赘述。
4、其他

ES中还有很多其他的数据类型,具体的可以参考 Field data types | Elasticsearch Guide [7.17] | Elastic

https://www.elastic.co/guide/en/elasticsearch/reference/7.17/mapping-types.html

三、文档操作

1、创建文档

语法:PUT /索引名/_doc/ID 或者 POST /索引名/_doc/ID

解释:ID可选,不一定要填写,如果不填写则由。

案例1:创建一个文档,不带ID

POST my-index-000001/_doc/
{
  "@timestamp": "2099-11-15T13:12:00",
  "message": "GET /search HTTP/1.1 200 1070000",
  "user": {
    "id": "kimchy"
  }
}

上面这个案例我们创建了一个文档,同时没有指定ID,由ES为我们自动创建文档ID。

案例2:创建文档并且自定义文档

POST my-index-000001/_doc/1
{
  "@timestamp": "2099-11-15T13:12:00",
  "message": "GET /search HTTP/1.1 200 1070000",
  "user": {
    "id": "hardy"
  }
}
这样我们就创建了一个自定义ID的文档
2、查询文档

查询是ES中最核心的功能,这部分内容后续将单独抽取出来,这里暂时不讲述

3、删除文档

1、根据ID删除

DELETE /索引名/ID

2、根据条件删除

根据条件删除和搜索是很类型的,这部分也放到后续学习搜索时一起讲

4、更新文档

1、根据ID更新

POST /<index>/_update/<_id>
{
  "doc": {
    "field1": "new_value1",
    "field2": "new_value2"
  }
}

2、根据条件更新

根据条件更新和搜索是很类型的,这部分也放到后续学习搜索时一起讲

四、结束语

今天学习了剩下的常见的数据类型,还有简单的文档操作。这些相对来说简单,ES中最复杂的是搜索,搜索会放到后面详细讲解,希望对你有所帮助。