一个集群是由一个或多个节点组成的集合。下面的三个节点就组成了一个集群。每一个集群都有一个默认的名字,这里默认是elasticsearch,我之前命名的集群名字是haozz。master、slave1、slave2是自定义的节点的名字,每一个节点都是能够存储数据、参与集群索引数据以及搜索数据的独立数据。
以上可以这样理解:索引相当于MySql里的一个DataBase,类型相当于一个Table,文档相当于一条数据。
和索引相关的有两个高阶概念:
分片的好处在于,假设一个索引的数据量很大,会造成硬盘压力很大,搜索速度会出现瓶颈,就可以将索引分成多个分片,从而分摊压力,可以提高搜索和其他操作的效率。备份的好处就在于当一个分片出现问题时备份的分片可以代替工作,提高ES的可用性,备份的分片也可以执行搜索操作,分摊压力。ES默认在创建索引时会创建5个分片,1个备份,分片只能在创建时指定,后期不能修改,备份数量是可以修改的。
ES采用RESRFul API风格,基本格式为:
http://:/<索引>/<类型>/<文档id>
url中的每一个元素都是他的一些基本概念,而且都是名词。动词以常用HTTP动词决定:GET/PUT/POST/DELETE。
可以在head插件中创建索引(非结构化):
选择索引 - 新建索引 - 输入索引名称,即可创建索引,并且可以指定分片数量和备份数量,索引的名称需要小写并且不能有下划线。创建完成后回到概览,可以看到之前创建的索引:
其中每一个方框都是ES索引的分片,粗框的是主分片,细框的是备份。按照序号分组。之所以说刚才创建的索引是非结构化的,是因为索引信息中的mappings数据是空的:
其实就可以理解为刚才创建的索引里面的数据是空的,没有任何内容。可以在符合查询中输入索引/类型/_mappings(比如:terminals/china/_mappings)格式的请求地址,然后输入json格式的请求数据,就可以在索引中创建数据,或者直接在postman中请求:
其中:
number_of_shards 索引分片数
number_of_replicas:索引备份数
而且如果请求的索引已经存在,会报错:index [terminals/lBSRLksDQk6oLPEMcLP4Qw] already exists。
数据插入可以分为指定文档id插入和自动生成文档id插入。
指定文档id插入:postman中url:http://192.168.124.34:9200/terminals/china/1,用PUT方法,请求体为:
{
"en_name":"pudong",
"city":"shanghai",
"create_date":"2019-05-15 00:00:01"
}
head中可以查询到如下数据:
自动生成id的话,postman中url:http://192.168.124.34:9200/terminals/china,用POST方法,请求体不变:
可以看到生成的id是自动生成的字符串。
postman中url:http://192.168.124.34:9200/terminals/china/1/_update,用POST方法,请求体为:
{
"doc":{
"en_name":"pudongz-zhangjiang"
}
}
其中修改的url需要加上_update,请求体需要doc关键字,结果为:
postman中选择DELETE请求即可。
删除索引的话也可以直接在head插件中操作。
直接使用GET请求即可。
postman中 url:http://192.168.124.34:9200/terminals/_search,用POST方法,查询所有请求体为:
{
"query":{
"match_all":{}
},
"from":1,
"size":10
}
结果:
其中from和size指定起始点和查询数量,可以用来分页。
查询关键字:
{
"query":{
"match":{
"city":"shanghai"
}
},
"from":1,
"size":10
}
还可以加上sort指定字段和方式用于排序。
关键字aggs:
{
"aggs":{
"group_by_city":{
"terms":{
"field":"_id"
}
}
}
}
好像不能使用text类型字段进行聚合。查询结果中会根据聚合信息进行汇总。也可以根据多个字段进行聚合。
子条件查询又分为:
Query Context:在查询条件中,除了判断文档是否满足查询条件外,ES还会计算一个_score来标识匹配程度,旨在判断目标文档和查询条件匹配的有多好。分为全文本查询和字段级别查询。全文本查询针对文本类型数据,字段级别查询针对结构化数据,如数字、日期等。
习语匹配关键字:"match_parase"。习语匹配就是比如我搜索的title是"ElasticSearch入门",那么匹配的结果中就会包含"ElasticSearch"和"入门"的数据。
多个字段模糊匹配关键字:"multi_match",可以传入数组作为匹配的字段。
Filter Context:在查询过程中,只判断该文档是否满足条件,只有yes或no。
关键字:"bool'。
ES中的查询太多了,还有复合查询等等。