Elasticsearch 之 数据索引

对于提供全文检索的工具来讲,索引时一个关键的过程——只有经过索引操做,才能对数据进行分析存储、建立倒排索引,从而让使用者查询到相关的信息。html

本篇就ES的数据索引操做相关的内容展开:数据库

更多内容参考:Elasticsearch资料汇总app

索引操做

最简单的用法就是指定索引操做的index索引、type类型、ID(须要区分动词的索引和名次的索引),参考下面的例子:框架

$ curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{
    "user" : "kimchy", "post_date" : "2009-11-15T14:12:12", "message" : "trying out Elasticsearch" }'

这样就在索引twitter中的tweet类型中存储了id为1的数据。curl

索引操做的结果为:elasticsearch

{ "_shards" : { "total" : 10, "failed" : 0, "successful" : 10 }, "_index" : "twitter", "_type" : "tweet", "_id" : "1", "_version" : 1, "created" : true }

上面的_shards中描述了分片相关的信息,即当前一共有10个分片(5个主分片,5个副分片,而且都可用);以及index、type、id、version相关的信息。工具

自动建立索引

若是上面执行操做前,ES中没有twitter这个索引,那么默认会直接建立这个索引;而且type字段也会自动建立。也就是说,ES并不须要像传统的数据库事先定义表的结构post

每一个索引中的类型都有一个mapping映射,这个映射是动态生成的,所以当增长新的字段时,会自动增长mapping的设置。性能

经过在配置文件中设置action.auto_create_index为false,能够关闭自动建立index这个功能。url

自动建立索引功能,也能够设置黑名单或者白名单,好比:

设置action.auto_create_index为 +aaa*,-bbb*,'+'号意味着容许建立aaa开头的索引,'-'号意味着不容许建立bbb开头的索引

关于版本号

版本号维护了一个文档的状态,咱们只会针对最高版本号的文档进行操做。

文档号不只能够在文档中进行存储,也能够在外部维护版本号,具体的参考官方文档吧....

操做类型op_type

ES经过参数op_type提供“缺乏即加入”的功能,即若是ES中没有该文档,就进行索引;若是有了,则报错返回。

若是已经存在id为1的文档,则会报错,直接使用_create API,效果同样:

自动建立ID:

按照最上面的例子来讲,ES会把咱们指定的文档id作为ID。若是不指定ID,那么就会随机分配一个:

路由routing

ES是经过路由来进行查询的,通常一个查询会通过下面的过程:

1 节点接收请求,广播给每一个分片

2 分片接收请求,进行计算,返回结果

3 合并消息,返回

若是咱们设置了路由信息,就至关于告诉了ES,该去哪一个分片查询数据,也就取消了广播合并这个过程,从而提升了查询的效率。使用方法:

$ curl -XPOST 'http://localhost:9200/twitter/tweet?routing=kimchy' -d '{
    "user" : "kimchy", "post_date" : "2009-11-15T14:12:12", "message" : "trying out Elasticsearch" }'

路由是经过哈希来实现的,若是咱们在索引的时候直接指定routing的值,就会按照这个值计算哈希值,分配分片;若是不指定,就会根据ID来分配。因为通常状况下ID都是随机生成的,这样就能够保证默认状况下分片的数据负载是相同的。若是咱们须要在特定的分片保存特定的内容,就可使用路由指定分片。不过这样作,往后随着数据量的增长,也可能会致使某个分片压力过大。

另外,也能够在定义mapping的时候,直接设置routing的相关值。这样这个类型中的数据若是不指定routing的值,默认就会使用mapping中定义的那个路由值。

parent设置父子关系

ES中可能会涉及到一些文档的从属关系,使用parent参数,能够设置这种关系:

$ curl -XPUT localhost:9200/blogs/blog_tag/1122?parent=1111 -d '{
    "tag" : "something" }'

_timestamp设置时间戳

时间戳字段能够也能够在索引操做时指定:

$ curl -XPUT localhost:9200/twitter/tweet/1?timestamp=2009-11-15T14%3A12%3A12 -d '{
    "user" : "kimchy", "message" : "trying out Elasticsearch" }'

若是没有手动指定时间戳,_source中也不存在时间戳,就会设置为索引指定的时间。不过须要指定mapping中的_timestamp设置为enable

PUT my_index { "mappings": { "my_type": { "_timestamp": { "enabled": true } } } }

ttl文档过时

ES中也能够设置文档自动过时,过时是设置一个正的时间间隔,而后以_timestamp为基准,若是超时,就会自动删除。

若是设置为时间戳:

curl -XPUT 'http://localhost:9200/twitter/tweet/1?ttl=86400000' -d '{
    "user": "kimchy", "message": "Trying out elasticsearch, so far so good?" }'

若是设置为日期数学表达式:

curl -XPUT 'http://localhost:9200/twitter/tweet/1?ttl=1d' -d '{
    "user": "kimchy", "message": "Trying out elasticsearch, so far so good?" }'

也能够在JSON字段中指定:

curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{
    "_ttl": "1d", "user": "kimchy", "message": "Trying out elasticsearch, so far so good?" }'

手动刷新

因为ES并非一个实时索引搜索的框架,所以数据在索引操做后,须要等1秒钟才能搜索到。这里的搜索是指进行检索操做。若是你使用的是get这种API,就是真正的实时操做了。他们之间的不一样是,检索可能还须要进行分析和计算分值相关性排序等操做。

为了在数据索引操做后,立刻就能搜索到,也能够手动执行refresh操做。只要在API后面添加refresh=true便可。

这种操做仅推荐在特殊状况下使用,若是在大量因此操做中,每一个操做都执行refresh,那是很耗费性能的。

Timeout超时

分片并非随时可用的,当分片进行备份等操做时,是不能进行索引操做的。所以须要等待分片可用后,再进行操做。这时,就会出现必定的等待时间,若是超过等地时间则返回并抛出错误,这个等待时间能够经过timeout设置:

$ curl -XPUT 'http://localhost:9200/twitter/tweet/1?timeout=5m' -d '{
    "user" : "kimchy", "post_date" : "2009-11-15T14:12:12", "message" : "trying out Elasticsearch" }'

 

以上即是索引操做相关的知识,还有一些高级的知识,好比分片和版本号详细的用法,因为对ES仍是理解的不够透彻,就先不作过多的讲述了,省得错误太多。

若有异议,还请多多指正。

相关文章
相关标签/搜索