文档
文档就是索引中的数据,以JSON形式存储,可以是复杂的结构。
一个文档不仅有数据,还包含了元数据(metadata),三个必须的元数据节点是:
节点 | 说明 |
_index | 文档存储的地方 |
_type | 文档代表的对象的类 |
_id | 文档的唯一标识 |
_index
类似关系型数据库中的数据库,是存储和索引关联数据的地方
事实上,我们的数据存储在索引的分片中,index只是一个或者多个分片组合的逻辑空间,但是对于我们程序而言,不需要关注分片,就任务数据存储在索引中即可。
_type
可以看做关系型数据库中的表,一个索引可以存储多个表,但是es6以后,去掉了type的概念,默认一个索引只存储一种类型的数据,所以索引也可以看做一个表了
_id
数据的唯一标识符,如果不指定,es会自动生成32位的随机字符串
查询响应
pretty
除了使用elasticsearch-head插件,postman等工具,我们还可以直接在网页上请求es数据,但是展示结果不太友好。
可以添加一个pretty参数来友好展示数据
指定响应数据
添加_source参数
也可以在请求地址后直接添加/_source/id,只请求数据,不返回索引元数据
也可以再追加_source参数,按需返回字段
判断文档是否存在
get请求中,如果文档不存在,found参数返回false
也可以使用head请求
如果文档不存在,则状态码为404,文档存在状态码为200
批量操作
批量查询,插入、修改、删除等
_bulk操作
请求格式
{"action":{ metadata }}\n
{request body }\n
{"action":{ metadata }}\n
{request body }\n
{"action":{ metadata }}\n
{request body }\n
#注意 最后一行的回车不能丢
示例:批量插入
{"create":{"_index":"my_test_index"}}
{"id":2001,"name":"name1","age":12}
{"create":{"_index":"my_test_index"}}
{"id":2002,"name":"name2","age":20}
{"create":{"_index":"my_test_index"}}
{"id":2003,"name":"name3","age":24}
批量删除:
{"delete":{"_index":"my_test_index","_id":"swQszIEBNosuSpkicpe-"}}
{"delete":{"_index":"my_test_index","_id":"tgQPzYEBNosuSpkiCpcS"}}
{"delete":{"_index":"my_test_index","_id":"twQPzYEBNosuSpkiCpcS"}}
分页
es接受两个分页参数,类似mysql中的limit
size:结果数,默认是10
form:跳过开始的结果数,默认是0
GET {索引}/_search?size=2&from=1
深度分页:es是基于分片的,假设有5个分片,from=100,size=10。则会根据排序规则从5个分片中各取回100+10条数据数据,然后汇总成550条数据后选择最后面的10条数据。越往后的分页,执行的效率越低。
ES为了避免深分页,默认不允许查询10000条以后的数据。
映射
前面我们插入es数据,都是由es自动判断类型,但有时候需要我们明确字段类型,否则自动判断的类型和实际需求是不相符的。
自动判断的规则如下:
JSON中的数据 | 判断类型 | ES类型 |
true /false | boolean | boolean |
123 | long | byte、short、integer、long |
123.45 | double | float、double |
2022-07-05 | date | date |
"字符串及其他类型" | string | string、text、keyword |
结构化查询
term
terms
range
exists
match
bool
过滤查询
filter
查询语句要比过滤语句更耗时,不仅要查询匹配的文档还要计算文档的相关性,并且查询结果不可缓存,做精确匹配搜索时,最好用过滤语句,因为过滤语句可以缓存数据。