本文是基于es6.6的版本, 前面有一篇文章是关于安装的: https://www.jianshu.com/p/1d2ddb92f6fb,文中出现的翻译可能不太准确,更多请参考官方文档https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
索引模板
定义
官网定义
大概翻译
索引模板允许您定义在创建新索引时自动应用的模板.模板包括settings和mappings以及一个简单的模式模板(用于控制是否应将模板应用于新索引)
注意: 模板仅仅在索引创建的时候应用.修改模板时不会影响已经存在的索引.使用"create index API"创建索引时,模板中定义的settings和mappings会被索引继承,但是索引中自定义的相同部分会覆盖模板的设置(这是我自己的理解)
我的理解
模板就好比我们写代码的时候的父类,在父类中定义了一些公共的方法,子类(索引)可以直接使用这些方法,也可以自己重写这些方法实现自己特定的功能.一般适用于创建多个类似索引的时候,避免很多重复工作,方便索引为维护.
其实ES默认就会自带很多模板,我们可以在es-head直接查看到
创建
下面创建一个名字为article_template的模板,该模板匹配article*类的全部索引(比如article_1,article_2),匹配到此模板的索引,在"yyyy-MM-dd HH:mm:ss","yyyy-MM-dd", "yyyy/MM/dd"默认将这几种格式的数据映射成date类型,默认映射的字段created_at和updated_at为date类型,用动态模板把所有字符串映射成text和keyword类型并使用ik_smart分词
{
"index_patterns": ["article*"], //匹配索引的,数组的形式,证明可以多个
"settings": { //基本设置
"number_of_shards": 1, //主分片数
"number_of_replicas": 0 //备份数
},
"mappings": { //映射
"_doc": { //这个其实就是es的type,在es6.*的版本中,一个index只能存储一种type(7的版本会删除type),所以写成_doc(文档),你可以自己随便定义,反正最终展现形式就是type
"_source": { "enabled": true }, //是否存储所有源数据,建议设置成true,如果只需要设置部分数据,可以在具体字段中使用store
"dynamic_date_formats": ["yyyy-MM-dd HH:mm:ss","yyyy-MM-dd", "yyyy/MM/dd"], //只有满足设定条件的字段会映射成date类型,不过多个类型只会存在一种,也就是第一次插入的是yyyy-MM-dd这种格式,后面也就必须全是这种格式,所以建议这个设置一个就好
"properties": { //具体设置字段
"created_at": { "type": "date" }, //将created_at字段设置成date类型
"updated_at": { "type": "date" } //将updated_at字段设置成date类型
},
"dynamic_templates": [ //动态模板设置,前面properties中默认只设置了两个字段,如果新添加没有设置的字段,es默认会自己完成映射,但是你需要自己来设置这些映射规则没救要使用动态模板.下面一整段的意思就是把字符串映射成自定义的规则
{ "strings":
{
"match_mapping_type": "string", //匹配本来es要映射成字符串的字段
"mapping":{
"type": "text", //匹配的字段映射成text类型
"analyzer": "ik_smart", //使用ik_smart分词
"fields": {
"keyword": {
"type": "keyword", //同时映射keyword类型
"ignore_above": 256 //忽略超过256字节的字段
} } } } } ] } }}
//批注: 在5之后的版本,string的类型不存在了,用text取而代之,字符串将默认被同时映射成text和keyword类型,意味着可以在字符串字段(title)上进行全文搜索, 也可以通过字符串字段.keyword(title.keyword)字段实现关键词搜索及数据聚合.
模板使用的时候,你还可以设置order(索引匹配多个模板,数字大的优先级越高),version和aliases等属性,还有删除模板,查询模板等api,这些比较简单,具体查看官网地址:https://www.elastic.co/guide/en/elasticsearch/reference/6.6/indices-templates.html
索引
索引名字限制
1. 英文字母必须只是小写
2. 不能包含这些特殊字符: \, /, *, ?, ", <, >, |, ` ` (空格), ,, #
3. 7.0之前的索引可以包含冒号(:),但已被弃用,7.0+不支持
4. 不能以 - ,_,+开头
5. 不能是 . 或者 ..
6. 不最长能超过255个字节(注意这里说的是字节)
创建索引
上面创建了一个名字为article_test的索引,按照前面模板的定义规则,他会使用到前面定义的article_template模板,他的具体定义就会继承模板中定义的相关设置,加上自己定义的设置
插入文档
键入的数据,包含了提前映射好的字段,然后也有没有定义好的,比如字符串类型的,这个理论上就应该使用动态模板映射,下面看看具体映射情况
可以看到,id字段是es默认映射成了long类型,而title和content这类字符串字段,就是使用了前面动态模板设置的映射
插入的文档
ps: 后面的一系列操作都是基于这几条数据的
修改文档
其实全数据的修改,可以把请求方式改成PUT,然后给一份新的文档就修改了,还有一种修改方式是使用脚本的方式,具体请参考官网文档
删除文档
可以看到文档ID为1的数据已经被删除了
查询文档
简单查询
条件查询
查询全部数据
限制数据条数
查询排序
关键字查询
聚合查询
单个分组聚合
多个分组聚合
其他聚合类函数的使用
上面用到的函数关键之是"stats",同样的count,min,max,avg,sum都可以使用,比如下面
子条件查询
定义: 以特定字段查询所指特定值
Query Context
在查询过程中,除了判断文档是否满足查询条件外,ES还会计算一个_score来标示匹配程度,旨在判断目标文档和查询条件匹配得有多好
1. 全文本查询: 针对文本类型的数据
模糊匹配(也即是前面的关键字匹配)
短语匹配
在常规的关键字查询中,是按照设定的分词器分词后,查询出包含各个分词的数据,查询"elasticsearch安装",会查询出包含"elasticsearch"和"安装"的全部结果(如上图),如果使用短语匹配的话,就只会包含"elasticsearch安装"的结果
多条件查询
语法查询
使用query_string + AND、OR关键字
上面在query中出现的AND、OR可以单个或者多个出现,fields是制定查具体的字段,也可以不指定
2. 字段级别的查询: 针对结构化数据,如数字、日期等
范围查询 (对数字、日期属性)
可以使用 gt(大于),lt(小于),gte(大于等于),lte(小于等于)
使用term关键字查询
前面都是使用的match进行查询,他的查询本身的关键字就会被分词,比如搜索一个 [elasticsearch安装与配置介绍],他会把这句话分解成[elasticsearch],[安装],[与],[配置],[介绍]这几个短语,然后在整个文档中(也是被分词的结构)去匹配这几个短语,是分开匹配多个的
使用term的时候,他会把 [elasticsearch安装与配置介绍] 这句话按照一个整体去匹配的,而文档使用了分词,所以通常是匹配不到的
要查询到数据,除非是你要搜索的数据已经是分词的最小单位了,比如只查询一个"安装"
或者就直接查询文档不分词的字段,比如keyword类型的字段
前面已经说了,es6之后已经默认把字符串类型的字段映射成了text和keyword两种类型了,所以字符串text类型的字段,你也可以使用不分词的形式
Filter Context
在查询的过程中只判断该文档是个满足条件,只有Yes或No(最直接体现就是查询的结果score这一项都是0,没有计算),而且filter会自动被缓存,所以他的效率比前面说的match要高.filter必须结合bool使用
符合条件查询
定义: 以一定的逻辑组合的子条件查询
固定分数查询
布尔查询
must: 返回的文档必须满足must子句的条件,并且参与计算分值
must_not: 和must相反.必须不的意思
filter: 返回的文档必须满足filter子句的条件,结果不会计算分数,例子就是上面的 Filter Context
should: 返回的文档可能满足should子句的条件。
ps: 在一个Bool查询中,如果没有must或者filter,有一个或者多个should子句,那么只要满足一个就可以返回。minimum_should_match参数定义了至少满足几个子句。
上面的查询还可以组合使用
总结
好记性不如烂笔头,本文主要是在学习的时候的一些简单记录,方便以后使用的时候查询.ES的功能非常的强大,详细的还是需要参考官网的文档https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html.学以致用,最重要的是要能在自己工作中的业务场景灵活使用,我工作主要使用的语言是PHP,这里有我简单的记录了一篇Laravel中使用ElasticSearch,后续我工作中用到的比较经典的场景,我会继续记录