I.基础概念:
1. Node与 Cluster
Elasticsearch本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 Elasticsearch实例。
单个 Elasticsearch实例称为一个节点(node)。一组节点构成一个集群( cluster)。
2. index索引
Elasticsearch会索引所有字段,经过处理后写入一个倒排索引( Inverted Index)。查找数据的时侯,直接查找该索引。
所以, Elasticsearch数据管理的顶层单位就叫做 Index(索引)。它是单个数据库的同义词。每个 Index(即数据库)的名字必须是小写。
可以将index理解为mysql中的数据库( database),方便我们理解后续的概念。
3.document文档
index里面单条的记录称为 Document(文档)。许多条 Document构成了一个 Index。
Document使用JsoN格式表示,下面是一个例子
{
"user":"张三",
"desc":"数据库管理
}
同一个 Index里面的 Document,不要求有相同的结构( scheme),但是最好保持相同,这样有利于提高搜索效率。
4.type类型
Document可以分组,比如 shouji 这个index里面,可以按系统分组(安卓和ios),也可以按品牌分组(小米和华为)。这种分组就叫做Type,它是虚拟的逻辑分组,用来过滤Document.
不同的Type应该有相似的结构(schema),举例来说,id字段不能在这个组是字符串,在另一个组是数值。这是与关系型数据库的表的一个区别。性质完全不同的数据(比如products和logs)应该存成两个index,而不是一个index里面的两个Type(虽然可以做到)根据 elastcisearch官方规划, Elastic6.x版只允许每个Index包含个type, 7.x版将会彻底移除Type. 因此在6.x版本中,我们将type统一设置为默认值_doc.
II.操作ES
浏览器:127.0.0.1:5601 找到Dev Tools
1.集群运行状况检查
GET /_cat/health?v
2.获取集群中的节点列表
GET /_cat/nodes?v
3.列出所有索引
GET /_cat/indices?v
III.index索引操作
官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-create-index.html
1.创建索引
1.1新建 Index,可以直接向 Elastic服务器发出PUT请求。下面的例子是新建一个名叫 goods的 Index。
PUT /goods
服务器返回一个JSON对象,里面的acknowledged字段表示操作成功
{
"acknowledged" : true,
"shards_acknowledged" : true,
"index" : "goods"
}
命名规则:
仅小写
不能包括\ / * ? " < > | ``(空格字符) , #
7.0之前的索引可能包含冒号(:),但已过时,并且在7.0+中不支持
不能以 - _ + 开始
不能为.或..
不能超过255个字节
1.2创建索引的同时指定索引配置参数
PUT /twitter
{
"settings" : {
"number_of_shards" : 3,
"number_of_replicas" : 2
}
}
PUT /test
{
"settings" : {
"number_of_shards" : 1
},
"mappings" : {
"properties" : {
"field1" : { "type" : "text" }
}
}
}
相关参数说明:
"number_of_shards" : 3,//分片数
"number_of_replicas" : 2//每个分片的备份数
"field1" : { "type" : "text" }//字段类型
2.删除索引
delete请求 删除index
DELETE /goods
IV.Document文档操作
官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html
1. 创建文档
1.1 手动指定id, body必填
PUT /customer/_doc/1
{
"name" : "zhangsan",
"age" : 18
}
返回结果:
{
"_index" : "customer",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
1.2 自动指定id, body必填
POST /customer/_doc/
{
"name" : "lisi",
"age" : 23
}
返回结果:
{
"_index" : "customer",
"_type" : "_doc",
"_id" : "Mnpky28BnRKpK68FOSu4",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 1,
"_primary_term" : 1
}
您可以使用_doc或_create资源为新的JSON文档建立索引。使用 _create保证仅在文档不存在时才对其建立索引。要更新现有文档,必须使用该_doc资源。
如果指定的索引不存在,默认情况下索引操作将自动创建它并应用任何配置的索引模板。如果不存在映射,则索引操作创建一个动态映射。默认情况下,如果需要,新字段和对象将自动添加到映射中。
自动索引创建由该action.auto_create_index 设置控制。此设置默认为true,它允许自动创建任何索引。您可以修改此设置以显式允许或阻止与指定模式匹配的索引的自动创建,或者将其设置为 false完全禁用自动索引的创建。指定您要允许的模式的逗号分隔列表,或在每个模式之前加上 +或 - 以指示是应允许还是禁止它。指定列表后,默认行为是不允许。
PUT _cluster/settings
{
"persistent": {
"action.auto_create_index": "twitter,index10,-index1*,+ind*"①
}
}
①允许自动创建名为twitter或index10的索引,阻止创建与index1*模式匹配的索引,并允许创建与ind*模式匹配的任何其他索引。模式是按照指定的顺序匹配的。
PUT _cluster/settings
{
"persistent": {
"action.auto_create_index": "false" ②
}
}
②完全禁用自动创建索引。
PUT _cluster/settings
{
"persistent": {
"action.auto_create_index": "true" ③
}
}
③允许自动创建任何索引。这是默认设置。
您可以通过使用_create资源或将op_type参数设置为create来强制执行创建操作。在这种情况下,如果索引中已经存在具有指定ID的文档,则索引操作将失败。
2. 查询文档
GET /customer/_doc/1
3.修改文档
put 更新时原有的值也要传入,否则没有传入字段的就消失了
PUT /customer/_doc/1/
{
"name" : "zhangsan",
"age" : 30
}
3.2 POST
POST /customer/_update/1
{
"name" : "123",
"age" : 30
}
报错为x_content_parse_exception:
解决:
POST /customer/_update/1
{
"doc" : {
"name" : "123",
"age" : 30
}
}
es文档的局部更新其实是在更新时传递一个叫doc的文档对象参数,里面写着你要修改的文档json数据,然后到了es的内部,把旧文档读出来,文档参数和旧文档做一个数据上的合并,字段相同就覆盖,字段不同就新增,生成新的文档,把旧文档标记成deleted,新文档重新写入es
4. 删除文档
DELETE /customer/_doc/1
5.批量操作
5.1 批量添加 更新 删除
POST _bulk
{ "index" : { "_index" : "test", "_id" : "1" } }
{ "field1" : "value1" }
{ "delete" : { "_index" : "test", "_id" : "2" } }
{ "create" : { "_index" : "test", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_index" : "test"} }
{ "doc" : {"field2" : "value2"} }
5.2 批量查找
重新创建一个
POST /goods/_doc/_bulk
{"index" : {"_id" : 1}}
{"title": "MI5", "des" : "zuixinxMI5"}
{"index" : {"_id" : 2}}
{"title": "iphonex", "des" : "zuixinxiphonex"}
{"index" : {"_id" : 3}}
{"title": "meizu6pro", "des" : "zuixinxmeizu6pro"}
查询
GET /goods/_doc/_mget
{"ids" : [1,2,3]}
V.基本搜索
GET /goods/_search
查询结果:
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "goods",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"title" : "MI5",
"des" : "zuixinxMI5"
}
},
{
"_index" : "goods",
"_type" : "_doc",
"_id" : "2",
"_score" : 1.0,
"_source" : {
"title" : "iphonex",
"des" : "zuixinxiphonex"
}
}
]
}
}
查询结果说明:
took - Elasticsearch执行搜索的时间 (以毫秒为单位)
timed-out - 告诉我们搜索是否超时
_shards - 告诉我们搜索了多少个分片,以及搜索成功/失败分片的计数
hits - 搜索结果
hits.total - 符合我们搜索条件的文档总数
hits.hits - 实际的搜索结果数组(默认为前10个文档)
hits.sort - 对结果进行排序(如果按分数排序则丢失)
hits.score_max_score - 暂时忽略这些字段
真的标题搜索:
GET /goods/_search?q=title:MI5
查询所有:
GET /goods/_search
{
"query" : {
"match_all" : {}
}
}
查询MI5
GET /goods/_search
{
"query" : {
"match" : {"title" : "MI5"}
}
}
查询其它
官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/search.html
GET /goods/_search
{
"query" : {
"term" : { "title" : "MI5" }
}
}
GET /goods/_search
{
"from" : 0,
"size" : 10,
"sort" : {"id" : "asc"}
"query" : {
"term" : {"title" : "MI5"}
}
}
from--size 相当于mysql的limit
sort--排序