ELK集群核心概念、mapping、查询等介绍

网友投稿 721 2022-09-28

ELK集群核心概念、mapping、查询等介绍

ELK集群核心概念、mapping、查询等介绍

ELK: Elasticsearch + Logstash + Kibana

Elasticsearch: 是一个分布式的、实时全文搜索及分析引擎;检索性能高效是最大的特色。

Logstash: 是一个数据收集器,有丰富的插件(input/filter/output)。

Kibana: 是一个基于Elasticsearch的web展示平台。

Elasticsearch的基本概念

近实时(Near Realtime): 从一个doc被索引到能够查询到, 大约有1秒的间隔

index: 索引,类似SQL中的database, NoSQL中的database

type: 一个index下, 可以有多个type, 类似SQL中的table, NoSQL中的collection

document: 某index/type下的一条数据,以json的格式。类似SQL中的row,NoSQL中的document.

MySQL

database

table

row

mongodb

database

collection

document

ES

index

type

document

shard: 一个index可以有多个shards,默认是5。目的是,方便水平扩容和提高负载。一旦index被创建,shards的数量不能再改。每个shard,就是一个Lucene的index。一个Lucene的index能够容纳的documents的数量上限是2,147,483,519 (= Integer.MAX_VALUE - 128)

replica: 一个index的备份数,默认是1。目的是,提高可靠性,加快search的速度。replicas的数量可以随时修改。e.g.​​one or more nodes with same cluster name

Schemaless or not

在某种意义上,ES是schemaless的, 在索引doc的时候, 直接指定index/type就可以了,无需对index/type进行任何的设定。实际上, 在index/type被创建的时候,ES会去猜json里面的字段,然后自动生成一份mapping(mapping是对doc中, 各字段的类型的定义, 及索引方式等的解析)。

一旦有了mapping, 就变成schema的了,doc里面已有的字段类型 就不能随意更改了。

template and mapping

mapping:用来说明doc里面的各个字段的类型, 以及如何存储和索引。mapping依赖于index, 不同的type有不同的mapping。mapping中的字段类型, 一旦创建,不能修改,但可以新增字段。

template:在index被创建的时候, 提供index的setting以及需要的mapping,先于index存在,且只在index 被创建的时候生效,一旦索引被创建,修改template就不会对已经创建的index生效了。

ES的三个基本问题之写入数据

ES使用了2个端口9200和9300(默认)

9200负责HTTP的请求

e.g. curl -XPUT -d ‘{json_doc}’

9300是TCP端口,供ES nodes之间通信使用。

写数据到ES,所使用的clients分成2种,

第一是Java的,第二是其它。

先说其它的(Python​/Go/...等),都是用的是REST api的方式,即访问的是9200.

再说Java client,根据角色的不同, 用分成2种,

其一,节点client(node client)即,java client成为ES cluster中的一个节点,但不存储数据。

其二,传输client(transport client),即java client不加入ES cluster, 只是传输数据给ES cluster中的节点。JAVA client使用的都是9300端口, 使用的是Elasticsearch的传输 协议(native Elasticsearch transport protocol)。

Java 的客户端的版本号必须要与 Elasticsearch 节点所用的版本号一样,不然他们之间可能无法识别

ES的三个基本问题之读取数据

通过doc ID直接获取

e.g. curl -XGET xxxx/yyyy/AVQvYyK6aK8LxcWQ324fand the return{"_index":"xxxx”,"_type":"yyyy","_id":"AVQvYyK6aK8LxcWQ324f”,"_version":1,"found":true,"_source”:{json_doc}}

通过_search获取,size default 10

GET /index/type/_search?q=last_name:SmithGET /index/type/_search{"query" : { "match" : { "last_name" : "Smith" } }}

通过_scroll来获取大量数据,类似database的游标

一般用于reindex

ES的三个基本问题之性能优化

CPU/内存/SSD磁盘

除了官网上介绍的,ES_HEAP_SIZE/swap off/bootstrap.mlockall等

translog.durability:”async”,这个对写的性能影响巨大,

默认是request,即每当有增删改操作时, 就会触发flush/commit to Lucene(磁盘IO)

ES的字段类型及index

若没有mapping, ES会根据上面的规则去guess

若有mapping,ES会根据mapping对字段进行匹配及转换

e.g. 某字段在mapping中是number,而doc里面是 “123”,则会被自动转成123;“cde”则会报错

ES中, 不同类型的字段, ES的处理方式是不同的。对于非string字段, ES会原样索引;对于string类型的字段,index类型有:no/not_analyzed/analyzed

no

not_analyzed

analyzed(默认)

不索引,该字段无法search

不分析,原样索引

只对string字段,先分析(分词),然后索引

analyzer: 对于index:analyzed的string类型的字段, 使用哪种analyzer(when index and also search), 默认是standard,对于中文, 会切成单字,搜索中会使用IK

DSL介绍

1) match_all

{ "match_all": {}} 匹配所有的, 当不给查询条件时,默认。

2) match

进行full text search或者exact value(非string字段或not_analyzed的字段),进行匹配

3) multi_match

同时对多个字段进行同样的match

{ "multi_match": { "query": "full text search", "fields": [ "title", "body" ] }}

4) range

对number或时间字段进行

{ "range": { "age": { "gte": 20, "lt": 30 } }}

5) term

对字段进行确切值(exact value)的查询,如数字、时间、bool、not_analyzed字段等。

{ "term": { "age": 26 }}{ "term": { "date": "2014-09-01" }}{ "term": { "public": true }}{ "term": { "tag": "full_text" }}

6) terms

和term一样, 不同的是,可以指定多个值来进行精确匹配

{ "terms": { "tag": [ "search", "full_text", "nosql" ] }}

7) exists/missing

用来查找某个字段是否有值, 类似SQL中的 not is_null/is_null

{ "exists": { "field": "title" }}

8) bool 用来连接一系列的查询子句:包括must/must_not/filter/should

{ "bool" : { "must" : { "term" : { "user" : "kimchy" } }, "filter": { "term" : { "tag" : "tech" } }, "must_not" : { "range" : { "age" : { "from" : 10, "to" : 20 } } }, "should" : [ { "term" : { "tag" : "wow" } }, { "term" : { "tag" : "elasticsearch" } } ] }}

query VS filter

除了需要匹配程度的查询(有_score的情况)使用query, 其余的查询都应该使用filter。(As a general rule, use query clauses forfull-text search or for any condition that should affect the relevance score, and use filters for everything else.)

filter的结果是会被ES缓存的, 以此来提高效率。

另外, filter由于不计算分数及排序, 所以, 速度较 query要快。

GET _search{ "query": { "bool": { "must": [ { "match": { "title": "Search" }}, { "match": { "content": "Elasticsearch" }} ], "filter": [ { "term": { "status": "published" }}, { "range": { "publish_date": { "gte": "2015-01-01" }}} ] } }}

script

ES支持使用script。(script fields, script score)

groovy default script language

script默认是被禁止的, 需要在config/elasticsearch.yml中打开

script.inline: true

script.indexed: true

script有4种:inline/file/indexed/plugin

1) inline

GET/_search{ "script_fields": { "my_field": { "script": { "inline":"1 + my_var", "params": { "my_var":2 } } } }}

2) file

存放的位置:config/scripts/my_script.groovy

GET /_search{ "script_fields":{ "my_field": {"script": {"file": "my_script","params": { "my_var": 2 }}}}}

3) indexed

将脚本存储在ES内, index as .script, 然后通过ID访问。

curl-XPOST localhost:9200/_scripts/groovy/indexedCalculateScore-d'{ "script":"log(_score * 2) + my_modifier"}'{ "script_score":{ "script":{ "id": "indexedCalculateScore", "lang": "groovy", "params":{ "my_modifier":8 } } }}

4) plugin

需要install到ES

{ "script_score":{ "script":{ "inline":"my_script", "lang":"native" } } }ssh://​​Git​​.wandoulabs.com:29418/es-search

es-search/es-score下有MyNativeScript*.java是个示例, 比较方便。

function_score

doc and source:

使用source可以访问doc的原值,但速度较慢(not loaded into memory), 访问时需要经历loaded -> parsed的过程。

doc可以访问not_analyzed的字段的值,e.g. doc[‘field_name’].value

速度的优化措施:

0) 使用doc, 不使用source,使用source慢得离谱了。因为doc已经在内存里了

1) 增加shards数及ES node数, 结果不是很明显

2) 使用size, 发现只是展示的doc的数量变化, 对于速度无影响

3) terminate_after: 在每个shards上, 只search前N个doc, 不实际,无法保证结果。

4) 增加filter, 使得进行二次打分的doc数量极大的降低, 来提高速度。

IK分词

对于string字段, 默认使用的analyzer是standard,对中文会分成单字,效果不好。

对于title等字段, 增加子字段, fields: title-, 使用"analyzer": "ik"进行分析。

"mappings":{ "my_type":{ "properties":{ "text":{ "type":"string", "fields":{ "english":{ "type": "string", "analyzer":"english" } } } } } }

查询的时候,可以使用多个字段

{ "query": { "multi_match": { "query":"quick brown foxes", "fields": [ "text", "text.english" ], "type":"most_fields" } }}

将-量大于100000的app_doc(不到6000个)的title放入字典, 提高分词的效果。

plugins

各种很有用的ES的插件以及辅助工具等。

kibana: ES的web 界面及自定义的dashboard

marvel: ES的性能实时监控数据及展示

head: ES索引及数据的浏览及管理

sense: json化的ES访问工具

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Cassandra 读写一致性(Consistency)详解
下一篇:备份管理
相关文章

 发表评论

暂时没有评论,来抢沙发吧~