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. [基础]RHEL6下LINUX服务器批量部署

      包准备:xinetd,tftp-server,dhcp,httpd,system-config-kickstart,syslinux,nfs   试验环境: 本机地址:192.168.46.98 ...

  2. .Net程序员学用Oracle系列(9):系统函数(上)

    <.Net程序员学用Oracle系列:导航目录> 本文大纲 1.字符函数 1.1.字符函数简介 1.2.语法说明及案例 2.数字函数 2.1.数字函数简介 2.2.语法说明及案例 3.日期 ...

  3. springmvc中返回页面,只在iframe中跳转,而不是整个页面,解决方法。

    问题描述:在我写的主页面中用到了iframe,其中在iframe中有一个button点击提交,然后在Controller中返回页面的时候,是在iframe中打开的,而不是整个页面. 最开始我想用aja ...

  4. 讲解——Trie树(字典树)

          Trie树(字典树) 一.引入 字典是干啥的?查找字的. 字典树自然也是起查找作用的.查找的是啥?单词. 看以下几个题: 1.给出n个单词和m个询问,每次询问一个单词,回答这个单词是否在单 ...

  5. 初步使用nodejs(一)

    初步使用nodejs(一) 首先打开 https://nodejs.org/,点击INSTALL下载安装 安装完成后 打开CMD 输入node –v 验证是否正常 至此,NODEJS安装完成. 下载W ...

  6. centos搭建svn服务器

    1.在centos6.5上面搭建svn服务器,安装svn服务器:yum install subversion 2.在任意目录下创建仓库目录,这里放在/data/mypros目录下 3.执行命令:svn ...

  7. [ An Ac a Day ^_^ ] [kuangbin带你飞]专题八 生成树 UVA 10600 ACM Contest and Blackout 最小生成树+次小生成树

    题意就是求最小生成树和次小生成树 #include<cstdio> #include<iostream> #include<algorithm> #include& ...

  8. hdu 1536 S-Nim (简单sg函数)

    题意:首先输入K 表示一个集合的大小  之后输入集合 表示对于这对石子只能去这个集合中的元素的个数 之后输入 一个m 表示接下来对于这个集合要进行m次询问 之后m行 每行输入一个n 表示有n个堆  每 ...

  9. shrio初体验(1)

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #e6427a } p.p2 { margin: 0.0px 0 ...

  10. centos 6.5 安装composer

    1.下载composer curl -sS https://getcomposer.org/installer | php ps:如果出现php无法运行的情况,请先把PHP加入环境变量,具体操作参考& ...