es是一个分布式的文档数据库,索引的文档都是以json序列化形式存贮的,而不是像关系型数据库那样是列数据行的形式存贮的。
在es 7.0之前,常把es和关系型数据库的名词做如下映射
es mysql
index (索引) datasource(数据库)
type (类型) table
mapping column
document row
es的index相当于关系数据库的数据库,而type 相当于表,mapping表示某个type的字段的定义,document这相当于表的每条数据,
即一个index下面有多个type,多个type可以定义自己的mapping属性,而某个document则是一个json序列化后的数据
但在es7.0后,官方文档废弃type这层概念,理由是es同一个index下,不同的type,其实在都是根据_type元属性来区别的,在搜索的时候,根据_type来过滤,推荐同一个索引不同的type的mapping中字段要尽量相同,如果差异较大,则推荐定义不同的索引。文档的字段差异较少,有利于提高es的存贮空间的利用率和压缩率。而且不同的type中的mapping的相同名称的字段,在底层都存贮在同一个字段中。所以同名的字段的mapping必须相同否则会无法创建mapping。所以官方在7.0后,type不再被推荐使用。只有一个默认的type 是 “_doc”,即一个 index,一个type(默认_doc)。
1.如何和es交互
1.1 使用java client
es提供了java的sdk,可以通过java对es进行操作,java客户端分低级客户端,和高级客户端,还有已经不推荐使用的transport client。这些我们后续再细说。
2.1 使用restful api
es提供restful api接口,可通过http请求直接访问。
我们可以通过 curl,postman,kibana的dev-tools等工具轻易的和es进行交互。
例如curl请求格式如下
3.创建索引
**es的index我们可以预先定义好,包括索引的设置,mapping的定义,别名等。**也可以直接用默认的设置,直接添加文档,es会自动帮我们创建索引。帮我们定义mapping,但默认的不一定符合我们的需求。当然我们可以根据相关的api后续再去更改索引的配置
index的创建包括三部分:
settings:索引的基本配置,包括分片数,每个分片对应的复制数量,分词器等
mapping:属性的类型及其相关定义
aliases:索引别名的定义
这用kibana 的dev-tools工具,建立的一个简单的索引,它是一个简化的类似于curl的表达式。
查询我们刚刚创建的索引
GET my-index-000001
1
{
"my-index-000001" : {
"aliases" : { },
"mappings" : {
"properties" : {
"title" : {
"type" : "text",
"analyzer" : "my_analyzer",
"search_analyzer" : "my_stop_analyzer",
"search_quote_analyzer" : "my_analyzer"
}
}
},
"settings" : {
"index" : {
"routing" : {
"allocation" : {
"include" : {
"_tier_preference" : "data_content"
}
}
},
"number_of_shards" : "1",
"provided_name" : "my-index-000001",
"creation_date" : "1616323948983",
"analysis" : {
"filter" : {
"english_stop" : {
"type" : "stop",
"stopwords" : "_english_"
}
},
"analyzer" : {
"my_analyzer" : {
"filter" : [
"lowercase"
],
"type" : "custom",
"tokenizer" : "standard"
},
"my_stop_analyzer" : {
"filter" : [
"lowercase",
"english_stop"
],
"type" : "custom",
"tokenizer" : "standard"
}
}
},
"number_of_replicas" : "1",
"uuid" : "MXPZfJoPR9WfiCXYwTFJIg",
"version" : {
"created" : "7110199"
}
}
}
}
}
我们也可以直接往索引里面添加文档,es会自动帮我们创建索引
添加文档格式需要注意:
索引名后面必须加+ _doc,
1表示是文档的_id的值,可以理解为文档的唯一表示,该值可以是数字也可以是字符串,如果没有指定的话,es会自动创建一个不重复的字符串。
es自动定义的index如下
{
"my-index-000002" : {
"aliases" : { },
"mappings" : {
"properties" : {
"address" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"age" : {
"type" : "long"
},
"name" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
},
"settings" : {
"index" : {
"routing" : {
"allocation" : {
"include" : {
"_tier_preference" : "data_content"
}
}
},
"number_of_shards" : "1",
"provided_name" : "my-index-000002",
"creation_date" : "1620562449845",
"number_of_replicas" : "1",
"uuid" : "I225Hg5wSXuJLn86BHhWZQ",
"version" : {
"created" : "7110199"
}
}
}
}
}
更加详细的用法请参考官方文档:
https://www.elastic.co/guide/en/elasticsearch/reference/7.10/documents-indices.html