一、简单的CURD操作
先创建一个文档
### 创建索引
PUT /xwhy
查看索引信息
GET /xwhy
创建文档
### 创建文档 /索引/类型/id (id属于主键唯一标识,不能重复)
PUT /xwhy/user/1
{
"username":"mark",
"age":21,
"sex":"男"
}
可以对字段的值进行修改然后在执行上述命令,值就会修改,修改一次,版本号会增加一次
也可以不指定id,使用post方式会随机生成一个不会重复的id
删除索引
DELETE /xwhy
高级查询:
1、根据id进行查询:
GET /xwhy/user/4
2、查询当前所有类型的文档
GET /xwhy/user/_search
3、根据多个ID批量查询
### 查询多个id分别为1、2
GET /xwhy/user/_mget
{
"ids":["1","2"]
}
复杂查询条件
1、查询年龄为年龄25岁
GET /xwhy/user/_search?q=age:25
2、查询年龄30岁-60岁之间
### 注意TO一定要大写
GET /xwhy/user/_search?q=age[30 TO 60]
3、查询年龄30岁-60岁之间 并且年龄降序、从0条数据到第1条数据
GET /xwhy/user/_search?q=age[30 TO 60]&sort=age:desc&from=0&size=1
4、查询年龄30岁-60岁之间 并且年龄降序、从0条数据到第1条数据,展示name和age字段
GET /xwhy/user/_search?q=age[30 TO 60]&sort=age:desc&from=0&size=1&_source=name,age
DSL语言
es中的查询请求有两种方式,一种是简易版的查询,另外一种是使用JSON完整的请求体,叫做结构化查询(DSL)。
由于DSL查询更为直观也更为简易,所以大都使用这种方式。
DSL查询是POST过去一个json,由于post的请求是json格式的,所以存在很多灵活性,也有很多形式。
根据名称精确查询姓名
GET /xwhy/user/_search
{
"query": {
"term": {
"name": "xiaoming"
}
}
}
##term是代表完全匹配,即不进行分词器分析,文档中必须包含整个搜索的词汇
根据汽车名称模糊查询
GET /xwhy/user/_search
{
"from": 0,
"size": 2,
"query": {
"match": {
"car": "奥迪"
}
}
}
##match查询相当于模糊匹配,只包含其中一部分关键词就行
Term与Match区别
Term查询不会对字段进行分词查询,会采用精确匹配。
Match会根据该字段的分词器,进行分词查询。
使用filter过滤年龄
GET /xwhy/user/_search
{
"query": {
"bool": {
"must": [{
"match_all": {}
}],
"filter": {
"range": {
"age": {
"gt": 21,
"lte": 51
}
}
}
}
},
"from": 0,
"size": 10,
"_source": ["name", "age"]
}
二、版本控制
1.为什么要进行版本控制
为了保证数据再多线程操作下的准确性,es使用version字段乐观锁来进行版本控制。
2.悲观锁和乐观锁(CAS无所机制)
悲观锁:假设会发生并发冲突,屏蔽一切可能违反数据准确性的操作
乐观锁:假设不会发生并发冲突,只在提交操作是检查是否违反数据完整性。
如果在修改时候传入的version是7 但是 查看当前版本是6 不一致! 修改时候 哪个线程执行的块 哪个就改了
悲观锁需要等待 效率低一些
3.内部版本控制和外部版本控制
内部版本控制:_version自增长,修改数据后,_version会自动的加1 解决并发情况下的一致性问题
外部版本控制:为了保持_version与外部版本控制的数值一致
使用version_type=external检查数据当前的version值是否小于请求中的version值