ElasticSearch的简单使用

本文是基于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,后续我工作中用到的比较经典的场景,我会继续记录

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343