ES中的Mapping


Mapping就是对索引库中索引的字段名称及其数据类型进行定义,类似于mysql中的表结构信息,但ES中的mapping比数据库灵活很多,它可以动态识别字段。一般不需要指定mapping字段都可以,因为ES会自动根据数据格式识别它的类型,如果你需要对某些字段添加特殊属性(如:定义使用其他分词器、是否分词、是否存库等),就必须手动添加mapping


查询索引库中mapping信息:


curl -XPUT http://localhost:9200/index/type/_mapping?pretty


Kibanan中查询mapping信息:


GET /index/type/_mapping



pretty关键字


在任意的查询字符串中增加pretty参数,会让ES美化输出(pretty-print)JSON响应以便更加容易阅读。_source字段不会被美化,它的样子与我们输入的一致。




GET关键字查询检索文档


通常,GET请求将返回文档的全部,存储在_source参数中。但可能你感兴趣的只是其中某个字段,请求个别字段可以使用_source参数,多个字段可以使用逗号分隔


GET /index/type/id?_source=age,name


若你只想得到_source字段而不是其他的的元数据,可以这样请求:


GET /index/type/id/_source


检查文档的个数:


GET /index/type/_count





插入新文档


ES中_index、_type、_id唯一确定一个文档,要想保证文档是新加入的,最简单的方式就是使用POST方法让ES自动生成唯一的id


POST /index/type/


{...}



如果想使用自定义的id插入新文档,我们必须告诉ES应该在_index、_type、_id三者都不同时才接受请求,为了做到这一点有两种方法,


第一种方法使用on_type查询参数:


PUT /index/type/id?on_type=create


{...}


第二种方法在URL后加/_create做为端点:


PUT /index/type/id/_create


{...}


如果请求成功的创建了一个新文档ES会返回正常的元数据且响应状态码是201 Created


如果包含该_index、_type、_id的文档已经存在,ES将返回409 Conflict响应状态




检索新文档


ES检索多个文档依旧非常快,合并多个请求可以避免每个单独的网络开销。如果你需要从ES中检索多个文档,相对于一个一个的检索,更快的方式是在一个请求中使用multi-get或者mget API。


mget API参数是一个docs数组,数组的每个节点定义一个文档的_index、_type、_id元数据,如果你只想检索一个或几个确定的字段,也可以定义一个_source参数

GET /_mget 

 

  { 

 

  "docs":[ 

 

  { 

 

  "_index":"index", 

 

  "_type":"type", 

 

  "_id":2 

 

  }, 

 

  { 

 

  "_index":"index", 

 

  "_type":"type2", 

 

  "_id":1, 

 

  "_source":"views" 

 

  } 

 

  ] 

 

  }


响应体也包含一个docs数组,每个文档还包含一个响应,它们按照请求定义的顺序排列。每个这样的响应与单独使用get request响应体相同


如果你想检索的文档在同一个_index中(甚至在同一个_type)中,你就可以在URL中定义一个默认的/_index或者/_index/_type,


GET /index/type/_mget 

 

  { 

 

  "docs":[ 

 

  {"_id":2}, 

 

  {"_type":"pageviews","_id":1} 

 

  ] 

 

  }

当然,如果所有文档具有相同的_index和_type,你可以通过简单的ids数组来代替完整的docs数组


GET /index/type/_mget 

 

  { 

 

  "ids":["2","1"] 

 

  }