es版本发布相当快,从1.x到2.x,再直接到5.x,6.x

索引这个词在es中有多重意思:

索引(名词):一个索引类似于传统数据库中的一个表,用于存储关系型文档。索引的复数为indexes或indices。

索引(动词):索引一个文档就是存储一个文档到一个索引中以便它可以被检索和查询到,相当于SQL中的upsert。

倒排索引:关系型数据库通过增加一个索引比如B-tree索引到指定列上,以便提升数据检索速度。es使用了一个叫做倒排索引的结构来达到相同的目的。默认情况下,一个文档中的每一个属性都是被索引的(有一个倒排索引的)和可搜索的。一个没有倒排索引的属性是不能被搜索到的。

es是利用分片将数据分发到集群各处的。分片是数据的容器,文档保存在分片内,分片又被分配到集群内的各个节点里。当集群扩容时,es会自动在各节点中迁移分片,使得数据依然均匀分布在集群里。一个分片可以是主分片或者副本分片。副本分片是主分片的拷贝。技术上说,一个主分片最多能够存储Integer.MAX_VALUE - 128个文档。在索引建立时需要指定主分片数(number_of_shards,默认5个主分片),索引创建好后,主分片数就不能修改了,因为es是按照hash(routing)/number_of_shards进行路由文档的,number_of_shards假如有变动的话,那么存进去的数据就查不到了。如果想扩容分片,那么只能reindex。routing默认是文档的id,也可以显式指定。副本分片数(number_of_replicas)可以随时修改。

在es中每个文档都有一个版本号,当每次对文档进行修改时(包括删除),_version 的值都会递增。

本次学习的是es6.3.1版本,看的是6.3版本的官方文档。

新建一个没有任何setting和mapping的索引:

put /website

新建一个3个分片、1个副本的索引:

put /website
{
    "settings":{
        "number_of_shards":3,
        "number_of_replicas":1
    }
}

新建一个3个分片、1个副本,且有一个keyword类型的id字段的索引:

put /website
{
    "settings":{
        "number_of_shards":3,
        "number_of_replicas":1
    },
    "mappings":{
        "blog":{
            "properties":{
                "id":{
                    "type":"keyword"
                }
            }
        }
    }
}

blog是索引的type。properties是关键字。

查看索引的aliases、settings、mappings:

get /website

更改索引的副本数:

put /website/_settings
{
    "settings":{
        "number_of_replicas":0
    }
}

给索引添加新映射:

put /website/_mapping/blog
{
    "properties":{
        "age":{
            "type":"integer"
        }
    }
}

查看某index的alias:

get /${index}/_alias

如 get /posts/_alias

往某索引添加数据,指定id,put、post都可以:

put /website/blog/1
{
    "id":"1",
    "name":"zhangsan"
}

往某索引添加数据,不指定id,只能用post:

post /website/blog
{
    "name":"lisi",
    "password":"lisi"
}

返回文档的一部分:

get /website/blog/1?_source=id,name

只返回_source数据,不要_index、_type、_id等元数据:

get /website/blog/1/_source

更新整个文档,再次put该文档即可:

put /website/blog/1
{
    "password":"lisi",
    "city":"henan"
}

在内部,es将旧文档标记为已删除,并增加一个全新的文档。尽管不能再对旧版本文档进行访问,但它并不会立即消失,当继续索引更多数据时,es会在后台清理这些已删除的文档。

部分更新文档,用_update关键字。将接收到的文档与现有文档合并,覆盖现有字段,增加新字段。有doc和script两种方式。doc更简单,但script能支持更多功能。

doc方式:

post /website/blog/1/_update
{
    "doc":{
        "password":"abc123",
        "title":"woshititle"
    }
}

此时id=1的文档数据为

{
    "password": "abc123",
    "city": "henan",
    "title": "woshititle"
}

script方式:

post /website/blog/1/_update
{
    "script": {
        "source": "ctx._source.title='haizeiwang';ctx._source.birthday='1993/04/25';"
    }
}

此时id=1的文档数据为

{
    "password": "abc123",
    "city": "henan",
    "title": "haizeiwang",
    "birthday": "1993/04/25"
}

一次取回多个文档,用_mget。既可以一次从单个索引中取多个文档,也可以一次从多个索引中取多个文档。即使某一个文档不存在,也不会报错:

一次从单个索引中取多个文档:

get /website/blog/_mget
{
    "docs": [{
        "_id": 1
    },{
        "_id": 123
    },{
        "_id": 1234
    }]
}

_id指定文档的id。也可以省略docs数组,用ids数组,如下

get /website/blog/_mget
{
    "ids": [1,123,1234]
}

一次从多个索引中取多个文档:因为多个文档在多个索引中,所以需要指定每个文档所属的索引

get /_mget
{
    "docs": [{
        "_index": "website",
        "_type": "blog",
        "_id": 1
    },{
        "_index": "spark",
        "_type": "index",
        "_id": 1
    }]
}

如上,docs 数组包含要返回的多个文档信息,主要是用于指定index的_index、用于指定type的_type、用于指定id的_id。

批量操作,用_bulk。允许在单次请求中依次执行多个index、update、delete操作:

post _bulk
{"index":{"_index":"spark","_type":"index","_id" :"2"}}
{"name":"nimabi"}
{"index":{"_index":"spark","_type":"index","_id":"3"}}
{"age":"18"}
{"update":{"_index":"spark","_type":"index","_id":"2"}}
{"doc":{"age":"25"}}
{"delete":{"_index":"spark","_type":"index","_id":"3"}}

多索引查询:

在所有索引中搜索:get /_search

在spark索引中搜索:get /spark/_search

在spark索引中搜索index类型:get /spark/index/_search

在spark和website索引中搜索:get /spark,website/_search

在以s开头的索引中搜索:get /s*/_search

在spark和website索引中搜索index和blog类型:get /spark,website/index,blog/_search

在所有索引中搜索index和blog类型:get /_all/index,blog/_search

text和keyword的区别:

text和keyword都表示字符串类型(从5.x版本开始,废弃了string类型,拆分为text和keyword)

text类型的值会被分析器处理(默认分析器是standard,中文的话需要引入ik分析器),并放入倒排索引。不能用于排序、聚合(即根据此字段排序会报错),除非显式指定 fielddata=true。

keyword类型的值不会被分析器处理,可用于排序、聚合

某字符串会被某分析器处理成什么样子:

post /_analyze

{
    "analyzer": "standard",
    "text": "I want to be a hero"
}

post /_analyze
{
    "analyzer": "ik_max_word",
    "text": "我是需要测试的字符串"
}

其中analyzer的值是要使用的分析器,text值是要测试的字符串。ik分词器不是预置的,需要自己安装。

某字符串值已经post进某index某type,如何查看分词情况:

get /${index}/${type}/${id}/_termvectors?fields=${fields_name}

如 get /posts/doc/1/_termvectors?fields=message,其中posts是index,doc是type,1是id,message是对应的字段名

在es中,如果想对一个字符串类型的字段既执行match query,又执行term query,则可以设置该字段type属性为text,同时需要设置其fields属性,值是一个json对象,json对象中有一个key,名称通常是keyword或者raw,值同样是一个json对象,key是type,值是keyword。

示例如下,既想match query name字段,又想term query name字段:

put /my_index/_mapping/_doc
{
    "properties":{
        "name":{
            "type":"text",
            "fields":{
                "keyword":{
                    "type":"keyword"
                }
            }
        }
    }
}

text类型字段默认是不能用来做排序字段的,如果必须依此字段排序,有2种解决方案:

假如字段名是name,

第一种方案:在put mapping时设置该字段的fields属性。我们就可以通过name.keyword来排序了。这种方案比较好,因为不仅可以排序了,还可以term query了,一举两得。

第二种方案:在put mapping时设置该字段的fielddata属性值为true。我们就可以通过name字段排序了。

常用的js事件的更多相关文章

  1. 微信中一些常用的js事件积累

    1.网页图片集左右滑动查看图片,如下样例: jjs效果 var pictures = []; angular.forEach(pitctures,function(k,i){         pict ...

  2. 几个常用的JS鼠标键盘事件例子

    首先普及一下鼠标左右键值的相关方法: 1.event.x 鼠标横轴  2.event.y 鼠标纵轴  3.event.keycode 键盘值  4.events.button==0 默认.没有按任何按 ...

  3. js事件绑定细节说明

    javascript绑定事件: 经常用jQuery去写,时间长了对原生态的js事件绑定的知识会慢慢淡化或者遗忘了,必须翻出来再次总结,今天再次把js原生态事件的处理做个总结. 从最初开始,谁刚接触ja ...

  4. Node.js 事件

    Node.js 事件 Node.js 所有的异步I/O 操作在完成时都会发送一个事件到事件队列. Node.js里面的许多对象都会分发事件:一个net.Server对象会在每次有新连接时分发一个事件, ...

  5. JQuery常用实用的事件[较容易忽略的方法]

     JQuery常用实用的事件 注:由于JQuery片段较多就没有用插入代码文本插入,请见谅!JQuery 事件处理ready(fn)代码: $(document).ready(function(){ ...

  6. JS中的函数、Bom、DOM及JS事件

    本期博主给大家带来JS的函数.Bom.DOM操作,以及JS各种常用的数据类型的相关知识,同时,这也是JavaScript极其重要的部分,博主将详细介绍各种属性的用法和方法. 一.JS中的函数 [函数的 ...

  7. js事件流机制冒泡和捕获

    JavaScript与HTML之间的交互是通过事件实现的.事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间. 事件流 从页面中接收事件的顺序称为事件流. IE --> 事件冒泡流 Netsc ...

  8. js事件绑定的几种方式

    在JavaScript中,有三种常用的绑定事件的方法: 在DOM元素中直接绑定: 在JavaScript代码中绑定: 绑定事件监听函数 一. 在DOM元素中直接绑定 这里的DOM元素,可以理解为HTM ...

  9. 深入浅出js事件

    深入浅出js事件 一.事件流 事件冒泡和事件捕获分别由微软和网景公司提出,这两个概念是为了解决页面中事件流(事件发生顺序)的问题. <div id="outer"> & ...

随机推荐

  1. 使用多个DNS供应商以缓解DDoS攻击

        随着不安全物联网(IoT)设备的激增,针对域名系统(DNS)供应商的分布式拒绝服务(DDoS)攻击在数量和规模上正在不断增加.这些攻击随之影响依赖于这些供应商进行域名解析的网站.虽然DNS供应 ...

  2. jQuery插件slides实现无缝轮播图特效

    初始化插件: slides是一款基于jQuery无缝轮播图插件,支持图内元素动画,可以自定义动画类型 1 2 3 4 5 6 7 8 9 10 $(".slideInner").s ...

  3. 多目标遗传算法 ------ NSGA-II (部分源码解析)介绍

    NSGA(非支配排序遗传算法).NSGA-II(带精英策略的快速非支配排序遗传算法),都是基于遗传算法的多目标优化算法,是基于pareto最优解讨论的多目标优化. 在官网: http://www.ii ...

  4. [HMLY]12.iOS中的Protocol

    最近工作中遇到一个比较迷惑的事情,在我利用runtime获取类的属性的时候,由于类实现了一个自定义协议,导致遍历出来的属性中包含了NSObject协议中的property.查来查去,只是知道和prot ...

  5. 7 -- Spring的基本用法 -- 10...

    7.10 高级依赖关系配置 组件与组件之间的耦合,采用依赖注入管理:但基本类型的成员变量值,应直接在代码中设置. Spring支持将任意方法的返回值.类或对象的Field值.其他Bean的getter ...

  6. Spark Graphx编程指南

    问题导读1.GraphX提供了几种方式从RDD或者磁盘上的顶点和边集合构造图?2.PageRank算法在图中发挥什么作用?3.三角形计数算法的作用是什么?Spark中文手册-编程指南Spark之一个快 ...

  7. iOS -OC调用js页面

    我们这边和h5商量好传递一个结构体参数过去,然后由于解析的问题,导致我这里传递的参数,到h5那边不执行那边的方法 -(void)loginCallBack { NSDictionary *dic; u ...

  8. VS辅助工具

    tfs签入策略修改工具Team Foundation Server 2015 Power Tools(tfpt) 添加签入禁止策略 \*/bin \*/obj \*/Release \*/Debug ...

  9. Maven之(二)Maven生命周期

    我们在开发项目的时候,不断地在编译.测试.打包.部署等过程,maven的生命周期就是对所有构建过程抽象与统一,生命周期包含项目的清理.初始化.编译.测试.打包.集成测试.验证.部署.站点生成等几乎所有 ...

  10. (Nginx学习一)安装和启动及对应文件夹介绍

    nginx 安装和启动及对应文件夹介绍 1 安装 官网下载nginx文件  http://nginx.org/en/download.html 解压即可 2 文件夹介绍 在解压后nginx压缩包后发现 ...