和ES的交互方式取决于你是否使用JAVA
1)java api:如果你正在使用Java,在代码中你可以使用 ElasticSearch 内置的两个客户端:节点客户端(Node client)、传输客户端(Transport client)。Java客户端默认端口是9300,并且使用ES的原生传输协议和集群进行交互。
2)RESTful API with JSON over HTTP:所有其他语言可以使用RESTful API 通过端口9200和 ElasticSearch 进行通信。一个 ElasticSearch 请求和任何 HTTP 请求一样由若干相同的部件组成:
curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'
被 < > 标记的部件 | 含义 |
VERB | 适当的 HTTP 方法 或 谓词 : GET`、 `POST`、 `PUT`、 `HEAD 或者 `DELETE`。 |
PROTOCOL | http 或者 https`(如果你在 ElasticSearch 前面有一个 `https 代理) |
HOST | ElasticSearch 集群中任意节点的主机名,或者用 localhost 代表本地机器上的节点。 |
PORT | 运行 ElasticSearch HTTP 服务的端口号,默认是 9200 。 |
PATH | API 的终端路径(例如 _count 将返回集群中文档数量)。Path 可能包含多个组件,例如:_cluster/stats 和 _nodes/stats/jvm 。 |
QUERY_STRING | 任意可选的查询字符串参数 (例如 pretty 将格式化地输出 JSON 返回值,使其更容易阅读) |
BODY | 一个 JSON 格式的请求体 (如果请求需要的话) |
在 ES 中,用户的一切操作和行为都是围绕 REST 风格的 HTTP API 进行的。ES 中所有接口的语义都严格遵守 REST 规范。
一、索引:
1、创建索引 PUT /player
2、删除索引 DELETE /player
3、查看所有索引 GET /_cat/indices?v , ?v 的意思 显示列出项 的title
4、查看节点健康 get /_cat/health?v
二、新增文档:
1、POST:通过 POST 新增文档:POST /索引/类型 文档
只能新增文档,Index 并不需要提前建好; POST 不保证幂等性,因此每次的 POST 请求都会在系统新增一条文档。对于新增的文档,系统会自动生成一个唯一 ID。如
POST /wtyy-test/user
{
"name":"张三",
"age":18,
"address":"北京"
}
对于以上请求来说,通过 POST
把对应的数据存储在了索引 wtyy-test
中。对于用户指定的 Index,如果不存在,ES 会自动建立对应的 Index。
2、PUT:通过 PUT 新增文档:PUT /索引/类型/id 文档
可以使用 POST /索引/类型 不带id 的方式自动生成id,put不支持不带id的写法,通过PUT 新增数据需要手动指定该条数据的唯一 id。这个唯一 id 不必要是数字,任何合法字符串均可。注意id如果存在会更新文档,如果只插入不更新可以在后面 加上 /_create (这时候会提示已经存在)
PUT /wtyy-test/user/1
{
"name":"王五",
"age":22,
"address":"湖北"
}
上述的 /wtyy-test/user/1
中的 1即为id
三、修改文档:
1、POST:POST /索引/类型/id 文档
1) post 虽然叫做修改,但是 在带有id 的情况下 和 put 几乎一样(id 存在就是 全量 修改,不存在就是 新增)。
POST /wtyy-test/user/1
{
"name":"王五",
"age":25,
"address":"湖北",
"school":"测试学校"
}
2)post 可以 指定_update ,指定更新字段,并且 可以带_create:POST /索引/类型/id/_update {"doc":{字段}}
POST /wtyy-test/user/1/_update
{
"doc":{
"name":"王五1",
"age":1
}
}
2、 PUT:PUT /索引/类型/id 文档
PUT 保证幂等性。因此在提交的时候需要指定一个唯一 id,对于同一个唯一 id 来说,无论 PUT 多少次,ES 只会修改这个 id 对应文档的内容,而不会新增文档;我们可以用 PUT + 指定唯一 id 的方式,来修改和更新文档。如:
PUT /wtyy-test/user/AXVuBYO2QnB0qZbmUT69
{
"name":"李四",
"age":20,
"address":"重庆"
}
四、删除文档:DELETE ,语法:DELETE /索引/类型/id。如:
DELETE /wtyy-test/user/AXVuBYIcQnB0qZbmUT68
DELETE 也是幂等性操作,在使用的时候也需要指定唯一 ID。es 的删除是 是假删除并且在下一次merge的时候真删除
五、批处理bulk:一次可以进行多个新增、更新和删除等修改行为的动作。bulk的格式:action:index/create/update/delete 后面如果有请求体就跟上请求体。
1)delete 没有请求体。
2)create 和 update 只有在指定的状态才能成功 create 创建 ,update 更新。
3)批处理中的一个 失败不影响 其他的 执行。
4)update 需要 doc 包一层
5)index 有create 和 update 的 功能,并且支持 又或者 没有 doc 包一层都支持。
POST _bulk
{"index" : { "_index" : "es-test"} }
{"message" : "this is my blog"}
{"create" : { "_index" : "es-test", "_id" : "3"} }
{"message" : "this is my blog"}
{"delete" : { "_index" : "es-test", "_id" : "2"} }
{"update" : {"_id" : "1", "_index" : "test"} }
{"message" : "this is my blog"}
以上包含了 4 种操作 index
、create
、delete
和 update
。 其中 index
、create
和 update
都包含两行,一行是具体的操作,一行是文档内容。index
和 create
的区别在于,create 会携带一个唯一 id,如果该 id 存在,则插入失败。
六、常见问题:
1、遇到 Fielddata is disabled on text fields by default 异常的 解决方案,因为text类型默认没有正排索引,所以不支持排序 和聚合 ,遇到这种 异常的时候 需要制定 开启正排索引。倒排索引用于搜索,正排索引用于排序和聚合。开启正排索引的方法。
put user/_mapping/student/
{
"properties": {
"sex": {
"type":"text",
"fielddata":true
}
}
}