ElasticSearch 7 安装及学习记录

从docker启动

ElasticSearch: https://hub.docker.com/_/elasticsearch?tab=description
Kibana: https://hub.docker.com/_/kibana?tab=description

// 创建一个network
docker network create es

// 创建ES
docker run -d --name elasticsearch --net es -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.8.1

// 创建KIBANA
docker run -d --name kibana --net es -p 5601:5601 kibana:7.8.1

// 启动
docker start elasticsearch kibana

// 停止
docker stop elasticsearch kibana

深入功能

逻辑设计

  • 文档 document
  • 类型 type
  • 索引 index

物理设计

一个ElasticSearch索引默认被shard成5份,每份一个backup,总计10份shard。一个分片是一个lucene索引。

索引过程

  1. 按照document id 做shard
  2. 发送到对应shard所在的节点
  3. 由主shard发送给back shard
  4. 索引完成

搜索过程

  1. ES cluster收到请求,分派给其中一个node
  2. 通过round-robin选中主shard和副shard,例如,shard0使用主,shard1和shard2使用备
  3. 向选中的shard分发搜索请求
  4. 由最初收到搜索请求的node,进行聚集
  5. 返回搜索结果

文档打分

参考:TF-IDF, term frequencey - inverse document frequencey

当使用一个term进行搜索时

  • 单个document中该term出现的频率越高,document分数越高
  • 整个index中,term越稀有,document分数越高

创建索引

当创建一个document的时候,es会自动创建索引,properties的type会自动判断并生成。

About Index Type
type is removed in ES 7

Search

URL

GET /{index}/_search?q={match字段}

返回特定的field

ES7中,需要使用 _source,参考 ES7 fields
http://localhost:9200/kibana_sample_data_ecommerce/_search?q=EUR&_source=currency,order_id

搜索结果

耗时

"took": 10,  // 花费时间,ms为单位
"timed_out": false,  // 是否超时,可以通过设置 timeout参数控制search API的时长

查询分片

"_shards": {
    "total": 1,  // 共计查询了多少shard
    "successful": 1,  // 成功查询到多少shard
    "skipped": 0,  // 跳过的shard
    "failed": 0  // 查询失败的shard,如果该shard没有backup,那么返回结果可能不完整
}

命中结果

"hits": {
  "total": {
      "value": 75,  // 共计命中了多少doc
      "relation": "eq"
  },
  "max_score": 10.095917,  // 最高得分,根据TF-IDF得分,hit默认按照打分结果倒序排列
  "hits": [
      {
        "_index": "kibana_sample_data_ecommerce",
        "_type": "_doc",
        "_id": "jFzZ0HMByChJljz5elUt",
        "_score": 10.095917,  // 文档打分
        "_source": {
            "currency": "EUR",
            "order_id": 564272
            }
        },
        {
            "_index": "kibana_sample_data_ecommerce",
            "_type": "_doc",
            "_id": "PlzZ0HMByChJljz5glt-",
            "_score": 10.095917,
            "_source": {
                "currency": "EUR",
                "order_id": 552806
            }
        },
        {
            "_index": "kibana_sample_data_ecommerce",
            "_type": "_doc",
            "_id": "_VzZ0HMByChJljz5cVBD",
            "_score": 5.6103525,  // 文档打分,低于第一个结果,可见该文档并未100%满足搜索结果
            "_source": {
                "currency": "EUR",
                "order_id": 576030
            }
        }
    ]
}

Query DSL

查看文档,Query DSL 以了解多种query DSL方式

  • query_string 从lucence继承而来的全文档搜索方式
  • term 直接进行单词匹配的搜索方式
  • filter 过滤,除了使用分数命中想搜的内容,也可以使用filter排除不想看的内容

使用ID搜索

当知道特定document的 _id 时,可以直接进行搜索,cost更低,速度比search快
http://localhost:9200/kibana_sample_data_ecommerce/_doc/jFzZ0HMByChJljz5elUt

搜索分片信息

http://localhost:9200/_cat/shards?v

映射

自动创建映射

当索引一篇文档的时候,ES会自动判断并创建映射关系

// 索引一个doc
PUT http://{{host}}/get-together-1/_doc/1
{
    "name": "Late Night with ElasticSearch",
    "date": "2019-10-25T19:00:00"
}

// 查询它的mapping
GET http://{{host}}/get-together-1/_mapping

添加新的映射

PUT http://{{host}}/get-together-1/_mapping
{
    "properties": {
        "host": {
            "type": "text",
            "fields": {
                "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                }
            }
        }
    }
}

修改映射

通常,我们无法修改现有字段的类型以及被索引的方式
可行的方案是,删除该索引下所有的数据,修改映射,重新索引数据

数据类型

四大核心类型

  • 字符串
  • 数值
  • 日期
  • 布尔

字符串

字符串有两种type,text和keyword

  • text可以进行模糊匹配,分词
  • keyword用于精准查询,不分词

see more strings-are-dead

// 分词
late night,会被拆解成late和night
latenight,会被认为一个单词,当搜索late是无法命中

数字

同样分浮点数和整数类型,默认整数类型分配long型索引,浮点数分配double型索引

日期

  • ES解析date类型并存储为long型(1970-1-1至今)
  • 日期格式默认使用 ISO 8601
  • 可以在mapping内自定义日期格式

数组

ES没有特殊的数组类型,所有数据类型默认支持单个或者数组。

// 可以索引一个数组类型的date
{
    "name": "Late Night with ElasticSearch",
    "date": ["2015-10-25T19:00:00", "2015-10-26T19:00:00"],
    "tags": ["first", "initial"]
}
// 也可以索引一个单值的date
{
    "name": "Late Night with ElasticSearch",
    "date": "2015-10-26T19:00:00",
    "tags": ["first", "initial"]
}
// 对应date的mapping只是普通的date
"date": {
    "type": "date"
}

更新

Update API

// create a document
{
    "name": "Late Night with ElasticSearch",
    "date": "2015-10-26T19:00:00"
}

// update
// use script to add a field to _source
POST http://{{host}}/get-together-1/_update/Sbi15HMBtUE9uNYxz816/
{
    "script": {
        "source": "ctx._source.tags = \"first\""
    }
}

// use doc to update the fields
POST http://{{host}}/get-together-1/_update/Sbi15HMBtUE9uNYxz816/
{
    "doc": {
        "tags": "2nd"
    }
}

版本控制

使用_version字段实现乐观锁机制的版本控制

删除

删除文档
DELETE http://{{host}}/get-together-1/_doc/Sbi15HMBtUE9uNYxz816

同样,整个索引也可以删除
DELETE http://{{host}}/get-together-2

再次进行搜索,会得到报错

{
    "type": "index_not_found_exception",
    "reason": "no such index [get-together-2]",
    "resource.type": "index_or_alias",
    "resource.id": "get-together-2",
    "index_uuid": "_na_",
    "index": "get-together-2"
}

关闭索引

对于暂时不想用的索引,可以使用关闭操作,关闭后无法写入文档和检索

// close
POST http://{{host}}/get-together-2/_close

{
    "acknowledged": true,
    "shards_acknowledged": true,
    "indices": {
        "get-together-2": {
            "closed": true
        }
    }
}

// re-open
POST http://{{host}}/get-together-2/_open

搜索

URL based search

基于URL的搜索提供了基本的功能,方便配合CURL命令

POST or GET
/_search  // find all documents
/{{index}}/_search  // find the documents of indicated index
/{{index}}/_search?size=10  // only return at most 10 documents of index
/{{index}}/_search?sort={{field}}:asc  // sort by field in ascend
/{{index}}/_search?sort={{field}}:desc  // sort by field in descend
/{{index}}/_search?_source={{field1}},{{field2}}  // only return field1 & field2 of found documents
/{{index}}/_search?q={{field}}:{{value}}  // filter, only find the document within field = value

Request body based search

基于请求体的搜索提供了高级功能

GET kibana_sample_data_ecommerce/_search
{
  "query": {
    "match_all": {}
  },
  "size": 2,
  "_source": ["order_id", "order_date", "currency"],
  "sort": [
    {
      "order_date": {
        "order": "desc"
      }
    }
  ]
}

基础查询

  • 使用query DSL
  • 查询与过滤的区别,查询会对文档进行打分,根据打分结果返回最匹配的;而过滤只需要确定文档是否符合查询条件,所以更快

match

// match, same as include
// to find document within currency = EUR
"match": {
    "currency":"EUR"
}

__match_all__

it matches all documents

__query_string__

// 非常强大的查询方式,可以提供AND,OR的条件连接
// 由于过去强大,使得查询表达式在条件过多时难以阅读
"query": {
    "query_string": {
      "default_field": "category",
      "query": "Men*"
    }
}

term & terms

// term, 词条匹配一个期望值
"query": {
    "term": {
      "customer_last_name.keyword": {
        "value": "Smith"
      }
    }
}
// terms, 词条匹配多个期望值
"query": {
    "terms": {
      "customer_last_name.keyword": [
        "Smith",
        "Jensen"
      ]
    }
}

复合查询 bool

see Boolean query DSL

// use bool query to find document matches all criterias
"query": {
    "bool": {
        "must_not": [
            {"term": {
                "currency": {
                "value": "USD"
                }
            }}
        ]
    }
}

其他查询

// range, query the document within the filed match the value range
// range can be lt, lte, gt, gte
"query": {
    "range": {
      "taxful_total_price": {
        "gt": 100,
        "lt": 200
      }
    }
}
// exists, the field must exist in document
"query": {
    "exists": {
      "field": "currency"
    }
}

版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/04/01/elasticsearch-7-installation-and-learning-record/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
海报
ElasticSearch 7 安装及学习记录
从docker启动 ElasticSearch: https://hub.docker.com/_/elasticsearch?tab=description Kibana: https://hub.docker.com/_/kibana?tab=description // 创建……
<<上一篇
下一篇>>
文章目录
关闭
目 录