首页   快速返回

ELKstack中文指南之elasticsearch接口使用     所属分类 elasticsearch
根据原文整理
https://elkguide.elasticsearch.cn/elasticsearch/api/CRUD.html


增删改查crud
搜索请求
painless脚本
reindex接口



文档型 NoSQL 数据库

基于 json的 RESTful 接口

写入数据 
curl -XPOST http://127.0.0.1:9200/logstash-2015.06.21/testlog -d '{
    "date" : "1434966686000",
    "user" : "chenlin7",
    "mesg" : "first message into Elasticsearch"
}'

不提供_id ,会自动生成并返回
{"_index":"logstash-2015.06.21","_type":"testlog","_id":"AU4ew3h2nBE6n0qcyVJK","_version":1,"created":true}

根据 _id 读取数据
curl -XGET http://127.0.0.1:9200/logstash-2015.06.21/testlog/AU4ew3h2nBE6n0qcyVJK

{"_index":"logstash-2015.06.21","_type":"testlog","_id":"AU4ew3h2nBE6n0qcyVJK","_version":1,"found":true,"_source":{
    "date" : "1434966686000",
    "user" : "chenlin7",
    "mesg" : "first message into Elasticsearch"
}}


只获取 _source
curl -XGET http://127.0.0.1:9200/logstash-2015.06.21/testlog/AU4ew3h2nBE6n0qcyVJK/_source

http://127.0.0.1:9200/bank/account/1
{
    "_index": "bank",
    "_type": "account",
    "_id": "1",
    "_version": 1,
    "found": true,
    "_source": {
        "account_number": 1,
        "balance": 39225,
        "firstname": "Amber",
        "lastname": "Duke",
        "age": 32,
        "gender": "M",
        "address": "880 Holmes Lane",
        "employer": "Pyrami",
        "email": "amberduke@pyrami.com",
        "city": "Brogan",
        "state": "IL"
    }
}
http://127.0.0.1:9200/bank/account/1/_source

{
    "account_number": 1,
    "balance": 39225,
    "firstname": "Amber",
    "lastname": "Duke",
    "age": 32,
    "gender": "M",
    "address": "880 Holmes Lane",
    "employer": "Pyrami",
    "email": "amberduke@pyrami.com",
    "city": "Brogan",
    "state": "IL"
}

只获取部分字段
http://127.0.0.1:9200/bank/account/1?_source=firstname,age

{
    "_index": "bank",
    "_type": "account",
    "_id": "1",
    "_version": 1,
    "found": true,
    "_source": {
        "firstname": "Amber",
        "age": 32
    }
}

删除数据
curl -XDELETE http://127.0.0.1:9200/logstash-2015.06.21/testlog/AU4ew3h2nBE6n0qcyVJK

数据更新
全量更新 局部更新

全量更新 
curl -XPOST http://127.0.0.1:9200/logstash-2015.06.21/testlog/AU4ew3h2nBE6n0qcyVJK -d '{
    "date" : "1434966686000",
    "user" : "chenlin7",
    "mesg" " "first message into Elasticsearch but version 2"
}'

curl -X POST http://127.0.0.1:9200/bank/account/1 -d '{"doc":{"newfield1":"value"}}'


{
    "_index": "bank",
    "_type": "account",
    "_id": "1",
    "_version": 2,
    "found": true,
    "_source": {
        "doc": {
            "newfield1": "value"
        }
    }
}


局部更新1

curl -XPOST 'http://127.0.0.1:9200/logstash-2015.06.21/testlog/AU4ew3h2nBE6n0qcyVJK/_update' -d '{
    "doc" : {
        "user" : "someone"
    }
}'

curl -X POST http://127.0.0.1:9200/bank/account/2/_update -d '{"doc":{"newfield1":"value"}}'

{
    "_index": "bank",
    "_type": "account",
    "_id": "2",
    "_version": 2,
    "found": true,
    "_source": {
        "account_number": 2,
        "balance": 28838,
        "firstname": "Roberta",
        "lastname": "Bender",
        "age": 22,
        "gender": "F",
        "address": "560 Kingsway Place",
        "employer": "Chillium",
        "email": "robertabender@chillium.com",
        "city": "Bennett",
        "state": "LA",
        "newfield1": "value"
    }
}


更新已有字段
curl -X POST http://127.0.0.1:9200/bank/account/2/_update -d '{"doc":{"age":"99"}}'


局部更新2

curl -XPOST 'http://127.0.0.1:9200/logstash-2015.06.21/testlog/AU4ew3h2nBE6n0qcyVJK/_update' -d '{
    "script" : "ctx._source.user = \"someone\""
}'


搜索请求


在 5.0 之前版本中,数据获取和数据搜索甚至有极大的区别:
刚写入的数据,可以通过 translog 立刻获取;但是却要等到 refresh 成为一个 segment 后,才能被搜索到。

从 5.0 版本开始,ES 不再维护 doc-id 到 translog offset 的映射关系,
一旦 GET 请求到这个还不能搜到的数据,就强制 refresh 出来 segment,这样就可以搜索了。
这个改动降低了数据获取的性能,但是节省了不少内存,减少了 young GC 次数,对写入性能的提升是很有好处的。



http://127.0.0.1:9200/bank/account/_search

全文检索
http://127.0.0.1:9200/bank/account/_search?q=Roberta

http://127.0.0.1:9200/bank/account/_search?q=firstname:Roberta

http://127.0.0.1:9200/bank/account/_search?q=firstname:"Roberta"

querystring 语法

全文检索:直接写要搜索的单词,例如 q=first
单字段的全文检索 q=mesg:first
单字段的精确检索 搜索单词加双引号 q=user:"tiger"
多个检索条件的组合 
   可以使用 NOT, AND 和 OR 来组合检索,注意必须是大写。 
   q=user:("chenlin7" OR "chenlin") AND NOT mesg:first

字段是否存在
   _exists_:user 表示要求 user 字段存在
   _missing_:user 表示要求 user 字段不存在
   
   
通配符  ? 表示单字母,* 表示任意个字母。 fir?t mess*

正则  注意 ES 中正则性能很差,而且支持的功能也不是特别强大,尽量不要使用
ES 支持的正则语法 https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-regexp-query.html#regexp-syntax

近似搜索 用 ~ 表示搜索单词可能有一两个字母写的不对,按照相似度返回结果。比如 frist~

范围搜索 对数值和时间使用范围搜索, 
  比如 rtt:>300,date:["now-6h" TO "now"} 
  [] 包含  {} 不包含
  
  
完整语法

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-queries.html


term query 的写法,q=user:"tiger"
 
curl -XGET http://127.0.0.1:9200/_search -d '
{
  "query": {
    "term": {
      "user": "tiger" 
    }
  }
}'


聚合

在检索范围确定之后,支持对结果集做聚合查询,返回更直接的聚合统计结果。
1.0 版本之前,这个接口叫 Facet,1.0 版本之后,这个接口改为 Aggregation。
Aggregation 是 Facet 接口的强化升级版本



1.x 系列中,aggregation 分为 bucket 和 metric 两种,分别用作词元划分和数值计算。
bucket aggregation,支持在自身结果集的基础上,叠加新的 aggregation

2.x 中,新增了 pipeline aggregation 类型
可以在已有 aggregation 返回的数组数据之后,再对这组数值做一次运算。最常见的,就是对时序数据求移动平均值。

aggregation 堆叠层级关系
 
支持的聚合请求列表
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html

search 请求参数
from 默认0
size 默认30

给 coordinate node 返回 shards number * (from + size) 条数据,然后在单机上进行排序,最后给客户端返回这个 size 大小的数据的。
谨慎使用 from 和 size 参数

2.x 新增了一个索引级别的动态控制配置项:index.max_result_window,默认为 10000。
即 from + size 大于 10000 的话,直接拒绝请求,以保护节点。

2.x 还提供了一个小优化:当设置 size=0 时,自动改变 search_type 为 count。跳过搜索过程的 fetch 阶段。

timeout
coordinate node 等待超时时间。到达该阈值后,coordinate node 直接把当前收到的数据返回给客户端,不再继续等待 data node 后续的返回了。

terminate_after
各 data node 上,扫描单个分片时,找到多少条记录后,就认为足够了。
request_cache


script

使用自定义脚本扩展功能,包括评分、过滤函数和聚合字段等
内置脚本引擎 MVEL、Groovy、Lucene expression 
5.0版本实现了专用的脚本引擎 Painless

ES 进程默认每分钟扫描一次 /etc/elasticsearch/scripts/ 目录,并尝试加载该目录下所有文件作为 script。

支持通过插件方式,扩展脚本语言的支持,目前默认自带的语言包括:
painless
lucene expression
groovy
mustache



reindex

curl -XPOST http://localhost:9200/_reindex -d '
{
  "source": {
    "index": "logstash-2016.10.29"
  },
  "dest": {
    "index": "logstash-new-2016.10.29"
  }
}'

上一篇     下一篇
kafka副本机制

网络杠精定律

ELKstack中文指南之elasticsearch架构原理

时区知识点整理

YAML简单介绍

kibana简单介绍