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
索引。
索引过程
- 按照document id 做shard
- 发送到对应shard所在的节点
- 由主shard发送给back shard
- 索引完成
搜索过程
- ES cluster收到请求,分派给其中一个node
- 通过round-robin选中主shard和副shard,例如,shard0使用主,shard1和shard2使用备
- 向选中的shard分发搜索请求
- 由最初收到搜索请求的node,进行聚集
- 返回搜索结果
文档打分
参考: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"
}
更新
// 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
// 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全栈技术分享
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论