一.新增文档
(不指定文档id,会随机生成一个id)
如果是7.x版本的es,不需要指定type,全部改成 _doc, _doc是默认的type类型
而且一个索引只有一个类型。
第一种。
post /index/type
{
"field1":"value1",
"field2":"value2"
}
第二种
put或者post /index/type/自定义文档id
{
"field1":"value1",
"field2":"value2"
}
二.修改文档
第一种,使用put新增的类型,需要指定文档,如果id在es中已存在,则视为更新,没有视为新增,更新将会覆盖掉对于id的文档下所有field的现有数据,如果新文档没指定字段的,将会被置空,所以用这种方式要写出所有的field,不建议使用。
put /index/type/id
{
"field1":"value1"
"field2":"value2"
.....
}
第二种,使用post的方法,其中id是文档id
使用这种方式,只需要将修改的field和value写进去,其余的将不会变化,推荐使用。
post / index/type/{{Id}}/_update
{
"doc":{
"field":"value"
}
}
三.查询文档
1.精确搜索,指定文档id
get /index/type/id
2.匹配搜索全部(不指定搜索内容,在最后加上_search即可,7.x版本的不需要指定type)
get /index/_search
3.指定搜索内容进行搜索,es7不需要指定type,以前版本自行加上(下面三种写法都可以)
第一种
get /index/_search?q=name:李四
第二种
get /index/_search?q=name=李四
第三种
get /index/_search
{
"query":{
#这里的match还可以有别的很多类型
#还可以是must,相当于mysql的=,must_not必须不是,相当于mysql的不等于, should相当于mysql的or,
#可以使用bool来做多条件精确查询
"match": {
"name":"李四"
},
#新增过滤器,范围查询
"filter":{
"range":{
"age":{
#查询age字段大于等于10岁,并且小于20岁的数据
"lt":20,
"gte":10
}
}
}
},
##_source相当于mysql的select,结果过滤,过滤不需要的字段
"_source":["name","desc"],
##使用sort来进行排序,可以指定多个排序方式
"sort":[
"age":{
"order":"desc"
}
],
#from和size相当于mysql的limit的两个参数,从哪开始,查多少个数据
"from":0,
"size":10
}
四.各种搜索条件附加
搜索是es最重要的一个模块,所以关于搜索的dsl语句这块,多写了一点,后续会继续补充。
4.1 or和and 条件查询
需求:如果我们要获取people这个索引下,name属性是张三或者李四,或者必须包含张三李四的文档,那么我们可以这样写
#获取name含有张三或者李四的文档
get /people/_doc/_search
{
"query":{
"match":{
"name":"张三 李四"
}
}
}
#获取name必须包含张三和李四的文档
get /people/_doc/_search
{
"query":{
"match":{
"name":{
"query":"张三 李四",
#这个属性默认是or,所以可以不写
"operator":"and"
}
}
}
}
4.2 选择命中的词条个数
需求:搜索全部文档,文档的desc属性中必须包含(排球,运动,出汗)这三个关键字中的至少两个字的时候,才显示出来,这种情况下可以分析出满足要求的结果有四种,即1(排球,运动),2(运动,出汗),3(排球,出汗),4(排球,运动,出汗),这种情况下无法使用4.1中的or和and来进行一刀切处理,这种情况就可以使用4.2的方法进行处理。
#获取name含有张三或者李四的文档
get /people/_doc/_search
{
"query":{
"match":{
"desc":"排球 运动 出汗",
#至少匹配两个
"mininum_should_match":2
}
}
}
其中,上面的"mininum_should_match":2表示至少满足两个搜索条件,也可以使用百分比来表示,比如排球,运动,出汗三个关键字,那么每个关键字的权重就是33.33%,如果设置"mininum_should_match":“34%”就代表只用匹配到的只要包含一个关键字就可以,大于66.66%表示必须包含两个及以上的关键字才可以,以此类推。
4.3 多属性条件的匹配
需求:上面针对了一个属性field的三种可能性进行了筛选,可能会出现多个属性的过滤。比如,查出name字段是张三,age字段是20,sex字段是man的三个条件中,满足其中两个以上的才显示出来,这个需求,就无法通过4.2实现。
#获取name字段是张三,age字段是20,sex字段是man三个条件中两个以上的所有文档
get /people/_doc/_search
{
"query":{
"bool":{
"should":[
{
"match":{
"name":"张三"
}
},
{
"match":{
"age":20
}
},
{
"match":{
"sex":"man"
}
}
],
"mininum_should_match":2
}
}
}