1、基本概念
1.1 文档
Elasticsearch 是面向文档的,文档会被序列化成 JSON 格式,保存在 Elasticseach 中。
文档的元数据,用于标注文档的相关信息。如_index,_type,_id,_source,_version,_score。
#查看索引的文档总数
GET kibana_sample_data_ecommerce/_count
#查看具体的字段
GET /_cat/indices/kibana*?pri&v&h=health,index,pri,rep,docs.count,mt
#How much memory is used per index
GET /_cat/indices?v&h=i,tm&s=tm:desc
1.2 索引
Index 是文档的容器。Index 提现逻辑空间概念;Shard 体现物理空间概念,索引中的数据分散在 Shard 中。
索引中的 Mapping 定义文档字段的类型。
索引中的 Setting 定义不同的数据分布。
#查看indices
GET /_cat/indices/kibana*?v&s=index
1.3 节点
节点是一个Elasticsearch 实例
每个节点启动后,默认是一个 Master eligible 节点
Master-eligible 节点可以参加选主流程,成为 Master 节点
每个节点都保存了集群的状态,只有 Master 节点才能修改集群的状态信息
- Data Node
可以保存数据的节点。负责保存分片数据。 - Coordinating Node
负责接受Client的请求,讲请求分发到合适的节点,最终把结果汇聚到一起
每个节点默认都起到Coordinating Node的职责 - 其它节点(Hot & Warm Node、Machine Learning Node)
GET /_cat/nodes?v
GET /_cat/nodes?v&h=id,ip,port,v,m
1.4 分片
- 主分片
可以将数据分布到集群内的所有节点之上
主分片数再索引创建时锁定,后续不允许修改,除非Reindex,解决数据水平扩展的问题。 - 副本
主分片的拷贝,可以动态调整,解决数据高可用的问题。
GET _cat/shards
GET _cat/shards?h=index,shard,prirep,state,unassigned.reason
PUT /blogs
{
"settings": {
"number_of_shards": 3, "number_of_replicas": 1
}
}
1.5 倒排序
单词到文档Id的关系
倒排序包含两个部分:单词词典,倒排列表-由倒排索引项组成
倒排索引项包含:文档ID,词频TF,位置,偏移
POST _analyze
{
"analyzer": "standard",
"text": "Elasticsearch Server"
}
resp:
{
"tokens" : [
{
"token" : "elasticsearch",
"start_offset" : 0,
"end_offset" : 13,
"type" : "<ALPHANUM>",
"position" : 0
},
{
"token" : "server",
"start_offset" : 14,
"end_offset" : 20,
"type" : "<ALPHANUM>",
"position" : 1
}
]
}
1.6 Mapping
-
什么是Mapping?
定义索引中的字段的名称、数据类型、字段,倒排序的相关配置
会把JSON 文档映射成Lucene所需的数据格式。 -
什么是Dynamic Mapping?
无需手动定义Mapping,ES会自动根据文档信息,推算出字段的类型。
#写入文档,查看 Mapping
PUT mapping_test/_doc/1
{
"firstName":"Chan",
"lastName": "Jackie",
"loginDate":"2018-07-24T10:29:48.103Z"
}
#查看 Mapping文件
GET mapping_test/_mapping
#Delete index
DELETE mapping_test
#dynamic mapping,推断字段的类型
PUT mapping_test/_doc/1
{
"uid" : "123",
"isVip" : false,
"isAdmin": "true",
"age":19,
"heigh":180
}
#查看 Dynamic
GET mapping_test/_mapping
#默认Mapping支持dynamic,写入的文档中加入新的字段
PUT dynamic_mapping_test/_doc/1
{
"newField":"someValue"
}
#该字段可以被搜索,数据也在_source中出现
POST dynamic_mapping_test/_search
{
"query":{
"match":{
"newField":"someValue"
}
}
}
#修改为dynamic false
PUT dynamic_mapping_test/_mapping
{
"dynamic": false
}
#新增 anotherField
PUT dynamic_mapping_test/_doc/10
{
"anotherField":"someValue"
}
#该字段不可以被搜索,因为dynamic已经被设置为false
POST dynamic_mapping_test/_search
{
"query":{
"match":{
"anotherField":"someValue"
}
}
}
get dynamic_mapping_test/_doc/10
#修改为strict
PUT dynamic_mapping_test/_mapping
{
"dynamic": "strict"
}
#写入数据出错,HTTP Code 400
PUT dynamic_mapping_test/_doc/12
{
"lastField":"value"
}
DELETE dynamic_mapping_test
1.7 Index Tempplate
帮助你设定 Mappings 和 Settings,并按照一定的规则,自动匹配到新创建的索引上
2、文档 CRUD
3、通过分析器进行分词
3.1 什么是 Analysis
分词,就是将文本转换为一系列单词的过程
#使用char filter进行替换
POST _analyze
{
"tokenizer": "standard",
"char_filter": [
{
"type" : "mapping",
"mappings" : [ "- => _"]
}
],
"text": "123-456, I-test! test-990 650-555-1234"
}
https://www.elastic.co/guide/en/elasticsearch/reference/7.1/indices-analyze.html
3.2 Analyzer 组成和工作机制
分词器是专门处理分词的组件,由三部分组成。Character Filters(针对原始文本处理),Tokenizer(按照规则切分单词),Token Filter(将切分的单词进行加工,小写,删除 stopwords, 增加同义词)
3.3 ES 内置的一些分词器
- Standard Analyzer 默认分词器,按词切分,小写处理
- Simple Analyzer 按照非字母切分,小写处理
- Stop Analyzer
- Whitespace Analyzer
- Keyword Analyzer 不分词,直接将输入当作输出
- Patter Analyzer
- Language 提供了30多种常见语言的分词器
- Customer Analyzer
ICU Analyzer
需要按照plugin Elasticsearch-plugin install analysis-icu,提供了Unicode的支持,更好的支持亚洲语言
IK 中文分词器
4、Search API
#URI Query
GET kibana_sample_data_ecommerce/_search?q=customer_first_name:Eddie
#REQUEST Body
POST kibana_sample_data_ecommerce/_search
{
"profile": true,
"_source":["order_date"],
"query":{
"match_all": {}
}
}
#脚本字段
GET kibana_sample_data_ecommerce/_search
{
"script_fields": {
"new_field": {
"script": {
"lang": "painless",
"source": "doc['order_date'].value+'hello'"
}
}
},
"query": {
"match_all": {}
}
}
https://www.elastic.co/guide/en/elasticsearch/reference/7.1/search-uri-request.html
https://www.elastic.co/guide/en/elasticsearch/reference/7.1/search-request-body.html
5、聚合分析
#按照目的地进行分桶统计
GET kibana_sample_data_flights/_search
{
"size": 0,
"aggs":{
"flight_dest":{
"terms":{
"field":"DestCountry"
}
}
}
}
#查看航班目的地的统计信息,增加平均,最高最低价格
GET kibana_sample_data_flights/_search
{
"size": 0,
"aggs":{
"flight_dest":{
"terms":{
"field":"DestCountry"
},
"aggs":{
"avg_price":{
"avg":{
"field":"AvgTicketPrice"
}
},
"max_price":{
"max":{
"field":"AvgTicketPrice"
}
},
"min_price":{
"min":{
"field":"AvgTicketPrice"
}
}
}
}
}
}
#价格统计信息+天气信息
GET kibana_sample_data_flights/_search
{
"size": 0,
"aggs":{
"flight_dest":{
"terms":{
"field":"DestCountry"
},
"aggs":{
"stats_price":{
"stats":{
"field":"AvgTicketPrice"
}
},
"wather":{
"terms": {
"field": "DestWeather",
"size": 5
}
}
}
}
}
}
https://www.elastic.co/guide/en/elasticsearch/reference/7.1/search-aggregations.html