ELKstack中文指南之elasticsearch接口使用
所属分类 elasticsearch
浏览量 1482
根据原文整理
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简单介绍