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. Android开发(25)--framebyframe帧动画并实现启动界面到主界面的跳转

    Drawable animation可以加载Drawable资源实现帧动画.AnimationDrawable是实现Drawable animations的基本类.推荐用XML文件的方法实现Drawa ...

  2. Facebook开源的基于SQL的操作系统检测和监控框架:osquery daemon详解

    osqueryd osqueryd(osquery daemon)是可以定期执行SQL查询和记录系统状态改变的驻守程序. osqueryd能够根据配置手机归档查询结果,并产生日志. 同时也可以使用系统 ...

  3. 基于WCF的RESTFul WebAPI如何对传输内容实现压缩

    前言 WCF作为通迅框架可以很容易地实现对消息的压缩,且方法不止一种,主要解决方法主要有以下四种: 1.通过自定义MessageEncoder和MessageEncodingBindingElemen ...

  4. [ios2] ios7UI适配 【转】

    http://blog.csdn.net/toss156/article/details/11843873#comments (1)如果应用程序始终隐藏 status bar 那么恭喜呢,你在UI上需 ...

  5. UITabelview的删除

    删除的效果 Automatic Bottom Fade left middle none right top 简单删除 先删除数据源里的数据,然后再删除cell,否者会报错 let indexPath ...

  6. Angularjs实现简单分页

    一个后台中总需要一款分页,那我为了自己方便使用,实现如下效果 我把这个组件命名为tm.pagination,原因是因为起名真的太难起了.而且我网名也叫天名, TM就这样了吧.github地址https ...

  7. pickle.dump()

    封装是一个将Python数据对象转化为字节流的过程,拆封是封装的逆操作,将字节文件或字节对象中的字节流转化为Python数据对象,不要从不收信任的数据源中拆封数据.可以封装和拆封几乎任何Python数 ...

  8. oracle登录时shared memory realm does not exist的解决方法

    解决办法:1.用CMD进入命令行2.sqlplus /nolog 3.conn / as sysdba4.startup   然后用sqlplus进入命令  

  9. 【LeetCode】23. Merge k Sorted Lists

    合并k个已合并链表. 思路:先把链表两两合并,直到合并至只有一个链表 /** * Definition for singly-linked list. * struct ListNode { * in ...

  10. emacs 使用教程

    http://www.cnblogs.com/liuchaogege/p/4464211.html