Elasticsearch精学笔记(二)

三、ES数据操作

  • 1. ES的数据体
    • ES中的文档存储的是序列化后的JSON数据;
    • ES都基于JSON结构体进行请求和响应。

    我们可以认为对象(object)和文档(document)是等价相通的。不过,他们还是有所差别:对象(Object)是一个JSON结构体——类似于哈希、hashmap、字典或者关联数组;对象(Object)中还可能包含其他对象(Object)。 在Elasticsearch中,文档(document)这个术语有着特殊含义。它特指最顶层结构或者根对象(root object)序列化成的JSON数据(以唯一ID标识并存储于Elasticsearch中)。

  • 2. 关于ES提供的操作有哪些?

    首先提一点,文档在Elasticsearch中是不可变的,ES内部没有更新操作(而是做了一系列操作),但API提供了封装的update操作;

    • 索引(创建)文档:文档通过index API被索引——使数据可以被存储和搜索,此方法是post请求;
    • 检索文档:此方法与索引文档使用同样的_index、_type、_id三个必要参数,不过此方法是get请求;
    • 检查文档:如果你只想检查文档是否存在,那么将检索文档的get请求改为head请求,返回200/404;
    • 更新文档:无论更新还是局部更新都遵循此步骤:从旧文档中检索JSON —— 修改此文档信息 —— 删除旧文档 —— 索引全新文档
    • 删除文档:删除文档的语法模式与前面几个基本一致,只不过要使用delete请求。删除一个文档不会立即从磁盘上移除,它只是被标记成已删除。Elasticsearch将会在你之后添加更多索引的时候才会在后台进行删除内容的清理。
  • 3. 如何操作?

    接下来的操作中,我会提供两种代码:通用的 和 Python的

    1. 创建一个ES索引
    上一章没有讲如何创建ES的索引,这节补充一下:
    让我们在集群中唯一一个空节点上创建一个叫做esdatabase的索引。默认情况下,一个索引被分配5个主分片,每个主分片对应一个复制分片。

    官方代码:
    PUT /esdatabase
    {
       "settings" : {
           "number_of_shards" : 5,
           "number_of_replicas" : 1
       }
    }
    
    Python创建索引:
    es = Elasticsearch(hosts='127.0.0.1:9200', http_compress=True)
    settings = {
        'settings': {
            'number_of_shards': 3,  # 主分片默认5设置为3
            'number_of_replicas': 1  # 复制分片倍数默认1设置为1
        }
    }
    result = es.indices.create(index='esdatabase', body=settings, ignore=400)
    print(result)
    

    2. 索引一个文档

    文档通过其_index、_type、_id唯一确定。我们可以自己提供一个_id,或者可以让Elasticsearch自动为我们生成。
    自动生成的ID有22个字符长,URL-safe, Base64-encoded string universally unique identifiers, 或者叫 UUIDs。

    2.1. 使用自己的ID
    如果你的文档有自然的标识符(例如user_account字段或者其他值表示文档),你就可以提供自己的_id,使用这种形式的index API:

    PUT /{index}/{type}/{id}
    {
      "field": "value",
      ...
    }
    
    body = {
        'name': 'chonger',
        'age': '23'
    }
    result = es.index(index='esdatabase', body=body, doc_type='UserName',
                      id='123', ignore=400)
    print(result)
    

    **2.2. 使用生成的ID
    自增ID不用指定ID参数即可,ES会帮你生成一个UUIDs。

    3. 获取和创建一个文档

    4. 检查一个文档是否存在

    5. 更新一个文档

    6. 删除一个文档

    7. 版本控制

    8. 局部更新

    9. 批量获取Mget

    10. 批量操作Bulk

    body = [
        {"delete": {"_index": "website", "_type": "blog", "_id": "123"}},
        {'create': {'_index': 'website', '_type': 'blog', '_id': '123'}},
        {'title': 'My first blog post'},
        {'update': {'_index': 'website', '_type': 'blog', '_id': '123'}},
        {'doc': {'title': 'My first blog post1'}}
    ]
    bulk = es.bulk(body=body)
    print(bulk)
    
  • 附录:基本ES元数据表(metadata)
*三个必须得元数据:
"_index":它是我们存储和索引关联数据的地方
"_type":文档代表的对象的类,也就是添加数据得类型
"_id":唯一标识一个文档的ID

*其他:
"_version":文档的版本号(用途请查看上面的版本控制操作)
"found":获取文档操作响应体中出现,标识是否找到文档(true or false)
"_source":获取(检索)文档操作且找到文档时返回的文档内容
"created":es5.x版本前用来标识是否是新创建,已移除
"result":es5.x版本后用来标识当前操作类型(create、index、update、delete)
"_shards":
"status":
"_seq_no":
"_primary_term":
"doc":请求更新时提供的局部更新元操作

近期持续更新中。。。。
更新日期:2019年7月14日16点33分

上一章:Elasticsearch精学笔记(一)

你可能感兴趣的:(Elasticsearch精学笔记(二))