ELK-ElasticSearch笔记
文章目录
-
- 前言
-
- 语法
- 索引,文档和类型
- 文档元数据
- 检索索引里文档数据
- 查看当前节点的所有 Index
- 查看所有index的mapping(映射)
- 查看特定index的mapping
- 搜索全部文档
- 查询指定id文档
- 检索文档的一部分
- 查询字符串搜索
- 下面搜索city是city:Yardville的文档
- 多条件搜索,条件之间用+连接。
- 必选项多条件搜索
- _all字段
- 使用DSL(特定领域语言)模拟查询字符串搜索.
- 删除索引
- 删除指定索引
- 模糊匹配删除
- 删除所有的索引
- 删除7天前那天的索引
-
- 更新文档里数据
- 查询语句和过滤语句关系
- 分析器
- 功能
- 分析器被使用时搜索过程
- 设置使用的分析器
- 测试分词器
-
前言
记录学习ElasticSearch的关键语法知识,有助于我理解Elastic stach整个框架。
其中有些知识只是需要知道可了解,比如查询语法,因为我们会介绍Kibana或elasticSearch-head来管理ElasticSearch里的索引,没必需自己一点点写url查询,但这些知识我们还是要知道,因为网上很多文章用到。
学习资料
-
ElasticSearch权威指南或者ElasticSearch权威指南
-
Elasticsearch 基础入门
-
全文搜索引擎 Elasticsearch 入门教程
测试工具
关于网络请求,这里使用curl工具,当然也可以使用postman或小幺鸡。
关于curl,-d 用于指定发送的数据,-X 用于指定发送数据的方式,-H 指定发送的数据类型(比如json格式为-H “Content-Type: application/json”)
- get请求:curl -X GET www.baidu.com或者curl www.baidu.com
- put请求(下面内容可执行复制到linux上执行):
curl -H "Content-Type: application/json" -X PUT 'localhost:9200/accounts/person/1' -d '
{
"user": "张三",
"title": "工程师",
"desc": "数据库管理"
}'
语法
假如elaseticsearch里有个索引为bank,类型为account。
索引,文档和类型
索引:Elastic 数据管理的顶层单位就叫做 Index(索引)
文档:Index 里面单条的记录称为 Document(文档)。许多条 Document 构成了一个 Index。
类型:比如上面的account就是类型,是文档是分组。
再比如
{
"accounts" : {
"mappings" : {
"person" : {
"properties" : {
"desc" : {
"type" : "text",
"analyzer" : "ik_max_word"
},
"title" : {
"type" : "text",
"analyzer" : "ik_max_word"
},
"user" : {
"type" : "text",
"analyzer" : "ik_max_word"
}
}
}
}
}
}
索引是accounts,类型是person,文档是具体的每条数据
文档元数据
参考资料
- _index:文档存储的地方
- _type:文档代表的对象的类
- _id:文档的唯一标识
- _score:每个节点都有一个_score字段,这是相关性得分(relevance score),它衡量了文档与查询的匹配程度。
请记住_index、_type、_id三者唯一确定一个文档
检索索引里文档数据
search API有两种表单:一种是“简易版”的查询字符串(query string)将所有参数通过查询字符串定义,另一种版本使用JSON完整的表示请求体(request body),这种富搜索语言叫做结构化查询语句(DSL)+
查看当前节点的所有 Index
curl -X GET 'http://localhost:9200/_cat/indices?v'
查看所有index的mapping(映射)
curl -X GET localhost:9200/_mapping?pretty
查看特定index的mapping
curl -X GET localhost:9200/bank/account/_mapping?pretty
搜索全部文档
curl -X GET localhost:9200/bank/account/_search
或者
curl -X GET localhost:9200/bank/account/_search?pretty
在任意的查询字符串中增加pretty参数,会让Elasticsearch美化输出(pretty-print)JSON响应以便更加容易阅读。_source字段不会被美化,它的样子与我们输入的一致。
后面不再强调。
查询指定id文档
curl -X GET localhost:9200/bank/account/222?pretty
返回:
[root@localhost home]# curl -X GET localhost:9200/bank/account/222?pretty
{
"_index" : "bank",
"_type" : "account",
"_id" : "222",
"_version" : 1,
"found" : true,
"_source" : {
"account_number" : 222,
"balance" : 14764,
"firstname" : "Rachelle",
"lastname" : "Rice",
"age" : 36,
"gender" : "M",
"address" : "333 Narrows Avenue",
"employer" : "Enaut",
"email" : "rachellerice@enaut.com",
"city" : "Wright",
"state" : "AZ"
}
}
响应里有_source字段,它包含了在创建索引时我们发送给Elasticsearch的原始文档。
检索文档的一部分
通常,GET请求将返回文档的全部,存储在_source参数中。但是可能你感兴趣的字段只是title。请求个别字段可以使用_source参数。多个字段可以使用逗号分隔:
下面只显示_source里city字段内容
curl -X GET localhost:9200/bank/account/222?_source=city&pretty=true
查询字符串搜索
参考检索文档
我们在请求中依旧使用_search关键字,然后将查询语句传递给参数q=
下面搜索city是city:Yardville的文档
curl -X GET localhost:9200/bank/account/_search?q=city:Yardville
多条件搜索,条件之间用+连接。
curl -X GET localhost:9200/bank/account/_search?q=city:Yardville+employer:Asimiline
必选项多条件搜索
上面是两个条件是可选的。单独某项的city或employer都会被匹配,必选条件就是条件前加上+号。"+“前缀表示语句匹配条件必须被满足。类似的”-"前缀表示条件必须不被满足。所有条件如果没有+或-表示是可选的——匹配越多,相关的文档就越多。
curl -X GET localhost:9200/bank/account/_search?q=%2bcity:Yardville+%2bemployer:Asimiline
%2b是+号的url编辑,必需使用%2b代替+前缀
_all字段
这个字段很牛叉。学习路径
当你索引一个文档,Elasticsearch把所有字符串字段值连接起来放在一个大字符串中,它被索引为一个特殊的字段_all,若没有指定字段,查询字符串搜索(即q=xxx)使用_all字段搜索。
使用DSL(特定领域语言)模拟查询字符串搜索.
下面语句可直接复制到linux命令行执行。
curl -H "Content-Type: application/json" -X GET localhost:9200/bank/account/_search -d ' {
"query":
{"match":
{
"city":"Yardville"
}
}
}'
全文搜索,短语搜索,高亮我们的搜索可参考检索文档
删除索引
以索引dongli-2019-03-01到dongli-2019-03-15为例
删除指定索引
curl -XDELETE -u elastic:changeme http://localhost:9200/dongli-2019-03-02
删除多个指定索引,中间用逗号隔开
curl -XDELETE -u elastic:changeme http://localhost:9200/dongli-2019-03-02,dongli-2019-03-04
模糊匹配删除
curl -XDELETE -u elastic:changeme http://localhost:9200/dongli-*
删除所有的索引
curl -XDELETE http://localhost:9200/_all
或
curl -XDELETE http://localhost:9200/*
_all ,* 通配所有的索引
通常不建议使用通配符,误删了后果就很严重了,所有的index都被删除了
禁止通配符为了安全起见,可以在elasticsearch.yml配置文件中设置禁用_all和通配符
action.destructive_requires_name = true
这样就不能使用_all和了
删除7天前那天的索引
根据索引名称后面的日期,删除指定日期的索引
#!/bin/bash
time=$(date -d '-7 days' +'%Y.%m.%d')
curl -XDELETE -u elastic:changeme http://localhost:9200/*-${time}
删除10天前的所有索引
根据索引名称后面的日期,删除7天前的所有索引。
它和上面算法类型都是根据索引名称计算日期的,如果索引没日期,那么只有手动删除
#!/bin/bash
###################################
#删除早于十天的ES集群的索引
###################################
function delete_indices() {
comp_date=`date -d "10 day ago" +"%Y-%m-%d"`
date1="$1 00:00:00"
date2="$comp_date 00:00:00"
t1=`date -d "$date1" +%s`
t2=`date -d "$date2" +%s`
if [ $t1 -le $t2 ]; then
echo "$1时间早于$comp_date,进行索引删除"
#转换一下格式,将类似2017-10-01格式转化为2017.10.01
format_date=`echo $1| sed 's/-/\./g'`
curl -XDELETE http://localhost:9200/*$format_date
fi
}
curl -XGET http://localhost:9200/_cat/indices | awk -F" " '{print $3}' | awk -F"-" '{print $NF}' | egrep "[0-9]*\.[0-9]*\.[0-9]*" | sort | uniq | sed 's/\./-/g' | while read LINE
do
#调用索引删除函数
delete_indices $LINE
done
更新文档里数据
文档在Elasticsearch中是不可变的——我们不能修改他们。
在内部,Elasticsearch已经标记旧文档为删除并添加了一个完整的新文档。旧版本文档不会立即消失,但你也不能去访问它。Elasticsearch会在你继续索引更多数据时清理被删除的文档
通过api能更新是完成如下过程
- 从旧文档中检索JSON
- 修改它
- 删除旧文档
- 索引新文档
比如
curl -H "Content-Type: application/json" -X PUT 'localhost:9200/bank/account/25' -d '
{
"city" : "666"
}'
查询语句和过滤语句关系
查询与过滤
我们可以使用两种结构化语句: 结构化查询(Query DSL)和结构化过滤(Filter DSL)
过滤:一条过滤语句会询问每个文档的字段值是否包含着特定值
查询:查询语句会询问每个文档的字段值与特定值的匹配程度如何
原则上来说,使用查询语句做全文本搜索或其他需要进行相关性评分的时候,剩下的全部用过滤语句
对于准确值,你需要使用过滤器。过滤器的重要性在于它们非常的快。
理解查询和过滤,有助于我们使用Kibana。
分析器
功能
分析器主要是对数据处理,将之分词后,再标记。
分析(analysis)是这样一个过程:
- 首先,标记化一个文本块为适用于倒排索引单独的词(term)
- 然后标准化这些词为标准形式,提高它们的“可搜索性”或“查全率”
它包含3个功能,分别是字符过滤器,分词器,标记过滤,具体参考分析和分析器
分析器被使用时搜索过程
- 当你查询全文(full text)字段,查询将使用相同的分析器来分析查询字符串,以产生正确的词列表。
- 当你查询一个确切值(exact value)字段,查询将不分析查询字符串,但是你可以自己指定。
设置使用的分析器
映射,配置分析器
string类型的字段,默认的,考虑到包含全文本,它们的值在索引前要经过分析器分析,并且在全文搜索此字段前要把查询语句做分析处理。
对于string字段,两个最重要的映射参数是index和analyer。
测试分词器
在查询字符串参数中指定要使用的分析器,被分析的文本做为请求体
标准版本分词器
curl -H 'Content-Type: application/json' -X GET "localhost:9200/_analyze?pretty" -d'
{
"analyzer" : "standard",
"text" : "List is empty"
}'
结果如下
[root@localhost home]# curl -H 'Content-Type: application/json' -X GET "localhost:9200/_analyze?pretty" -d'
{
"analyzer" : "standard",
"text" : "List is empty"
}'
{
"tokens" : [
{
"token" : "list",
"start_offset" : 0,
"end_offset" : 4,
"type" : "<ALPHANUM>",
"position" : 0
},
{
"token" : "is",
"start_offset" : 5,
"end_offset" : 7,
"type" : "<ALPHANUM>",
"position" : 1
},
{
"token" : "empty",
"start_offset" : 8,
"end_offset" : 13,
"type" : "<ALPHANUM>",
"position" : 2
}
]
}
IK中文分词器
最大分词器ik_max_word
curl -H 'Content-Type: application/json' -X GET "localhost:9200/_analyze?pretty" -d'
{
"analyzer" : "ik_max_word",
"text" : "我是中国人"
}'
结果如下
[root@localhost home]# curl -H 'Content-Type: application/json' -X GET "localhost:9200/_analyze?pretty" -d'
> {
> "analyzer" : "ik_max_word",
> "text" : "我是中国人"
> }'
{
"tokens" : [
{
"token" : "我",
"start_offset" : 0,
"end_offset" : 1,
"type" : "CN_CHAR",
"position" : 0
},
{
"token" : "是",
"start_offset" : 1,
"end_offset" : 2,
"type" : "CN_CHAR",
"position" : 1
},
{
"token" : "中国人",
"start_offset" : 2,
"end_offset" : 5,
"type" : "CN_WORD",
"position" : 2
},
{
"token" : "中国",
"start_offset" : 2,
"end_offset" : 4,
"type" : "CN_WORD",
"position" : 3
},
{
"token" : "国人",
"start_offset" : 3,
"end_offset" : 5,
"type" : "CN_WORD",
"position" : 4
}
]
}
最小分词器
curl -H 'Content-Type: application/json' -X GET "localhost:9200/_analyze?pretty" -d'
{
"analyzer" : "ik_smart",
"text" : "我是中国人"
}'
结果如下ik_smart
[root@localhost home]# curl -H 'Content-Type: application/json' -X GET "localhost:9200/_analyze?pretty" -d'
> {
> "analyzer" : "ik_smart",
> "text" : "我是中国人"
> }'
{
"tokens" : [
{
"token" : "我",
"start_offset" : 0,
"end_offset" : 1,
"type" : "CN_CHAR",
"position" : 0
},
{
"token" : "是",
"start_offset" : 1,
"end_offset" : 2,
"type" : "CN_CHAR",
"position" : 1
},
{
"token" : "中国人",
"start_offset" : 2,
"end_offset" : 5,
"type" : "CN_WORD",
"position" : 2
}
]
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)