记录学习ElasticSearch的关键语法知识,有助于我理解Elastic stach整个框架。
其中有些知识只是需要知道可了解,比如查询语法,因为我们会介绍Kibana或elasticSearch-head来管理ElasticSearch里的索引,没必需自己一点点写url查询,但这些知识我们还是要知道,因为网上很多文章用到。
学习资料
ElasticSearch权威指南或者ElasticSearch权威指南
Elasticsearch 基础入门
全文搜索引擎 Elasticsearch 入门教程
关于网络请求,这里使用curl工具,当然也可以使用postman或小幺鸡。
关于curl,-d 用于指定发送的数据,-X 用于指定发送数据的方式,-H 指定发送的数据类型(比如json格式为-H “Content-Type: application/json”)
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,文档是具体的每条数据
参考资料
search API有两种表单:一种是“简易版”的查询字符串(query string)将所有参数通过查询字符串定义,另一种版本使用JSON完整的表示请求体(request body),这种富搜索语言叫做结构化查询语句(DSL)+
curl -X GET 'http://localhost:9200/_cat/indices?v'
curl -X GET localhost:9200/_mapping?pretty
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字段不会被美化,它的样子与我们输入的一致。
后面不再强调。
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" : "[email protected]",
"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=
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代替+前缀
这个字段很牛叉。学习路径
当你索引一个文档,Elasticsearch把所有字符串字段值连接起来放在一个大字符串中,它被索引为一个特殊的字段_all,若没有指定字段,查询字符串搜索(即q=xxx)使用_all字段搜索。
下面语句可直接复制到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和了
根据索引名称后面的日期,删除指定日期的索引
#!/bin/bash
time=$(date -d '-7 days' +'%Y.%m.%d')
curl -XDELETE -u elastic:changeme http://localhost:9200/*-${time}
根据索引名称后面的日期,删除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能更新是完成如下过程
比如
curl -H "Content-Type: application/json" -X PUT 'localhost:9200/bank/account/25' -d '
{
"city" : "666"
}'
查询与过滤
我们可以使用两种结构化语句: 结构化查询(Query DSL)和结构化过滤(Filter DSL)
过滤:一条过滤语句会询问每个文档的字段值是否包含着特定值
查询:查询语句会询问每个文档的字段值与特定值的匹配程度如何
原则上来说,使用查询语句做全文本搜索或其他需要进行相关性评分的时候,剩下的全部用过滤语句
对于准确值,你需要使用过滤器。过滤器的重要性在于它们非常的快。
理解查询和过滤,有助于我们使用Kibana。
分析器主要是对数据处理,将之分词后,再标记。
分析(analysis)是这样一个过程:
它包含3个功能,分别是字符过滤器,分词器,标记过滤,具体参考分析和分析器
映射,配置分析器
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" : "",
"position" : 0
},
{
"token" : "is",
"start_offset" : 5,
"end_offset" : 7,
"type" : "",
"position" : 1
},
{
"token" : "empty",
"start_offset" : 8,
"end_offset" : 13,
"type" : "",
"position" : 2
}
]
}
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
}
]
}