ElasticSearch的简单使用

本文是基于es6.6的版本, 前面有一篇文章是关于安装的: //www.greatytc.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,后续我工作中用到的比较经典的场景,我会继续记录

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。