文档中的基本操作
1. 原有的文档上更新
POST /dangdang/book/1/_update
{
"doc":{
"name":"try harder"
}
}
表示在原有的文档上进行修改,需要结合"_update"和"doc"使用,如果只是利用下面的方式:会把原文档给覆盖掉,而且其他的字段都会变为空。
POST /dangdang/book/1/
{
"name":"try harder"
}
2. 添加字段
POST /dangdang/book/1/_update
{
"doc":{
"name":"try harder",
"cuihua": "be better"
}
}
3. 通过脚本的方式修改字段
POST /dangdang/book/1/_update
{
"script":"ctx._source.price += 5"
}
4.删除文档
DELETE /dangdang/book/1
5. 批量更新-注意不会因为一个操作而影响后面的操作
POST /dangdang/book/_bulk
{"index":{"_id": "3"}}
{"name":"zhangshan", "content":"this is good xiaohei", "price" : 23.23, "update":"2012-12-12"}
{"index":{}}
{"name":"lisi", "content":"this is good lisi", "price" : 23.23, "update":"2012-12-12"}
{"delete":{"_id":"5"}}
ES中的高级检索方式
一种是通过URL参数进行搜索,另一种是通过DSL(Domain Specified Lanauage)进行搜索。官方更推荐使用第二种方式,因为第二种方式是基于传递JSON作为请求体(request body)格式与ES进行交互,这种方式更强大,更简洁。
1. URL方式
- 查询所有: GET /ems/emp/_search?q=*
- 按照所有并基于年龄降序排序: GET /ems/emp/_search?q=*&sort=age:desc
- 查询所有排序并返回指定记录数:GET /ems/emp/_search?q=*&sort=age:desc?size=2&from = 0
2. 使用DSL(特殊领域查询语句)方式(Request Body)方式检索 推荐
(1)查询所有(match_all)
GET /ems/emp/_search
{
"query":{"match_all":{}}
}
(2)查询结果中返回指定条数(size)
GET /ems/emp/_search
{
"query":{"match_all":{}},
"size":4
}
(3) 分页查询(from)
GET /ems/emp/_search
{
"query":{"match_all":{}},
"size":2,
"from": 4
}
(4) 排序查找(sort)
GET /ems/emp/_search
{
"query":{
"match_all":{}
},
"sort":[
{
"age:"{
"order":"desc"
}
}
],
"size":2,
"from":0
}
(5) 查询结果中返回指定字段(_source)
GET /ems/emp/_search
{
"query":{"match_all":{}},
"_source":["account_number","balance"],
"size": 2,
"from":0,
"sort":[
{
"age":{
"order":"asc"
}
}
]
}
(6)关键字查询(term)
GET /ems/emp/_search
{
"query":{
"term":{
"content":{
"value":"框架"
}
}
}
}
- 除了text类型以外的所有类型均不分词
- ES默认使用的标准分词器(英文单词分词 中文单字分词)
(7) 范围查询(range)
GET /ems/emp/_search
{
"query":{
"range":{
"age":{
"gte":8,
"lte":30
}
}
}
}
(8)前缀查询(prefix)
GET /ems/emp/_search
{
"query":{
"prefix":{
"content":{
"value":"框架"
}
}
}
}
(8)通配符匹配(wildcard)
GET /ems/emp/_search
{
"query":{
"wildcard":{
"content":{
"value":"spr??ing*"
}
}
}
}
(9) 多id查询(ids) 类似于批量查询
GET /ems/emp/_search
{
"query":{
"ids":{
"values":["1", "2", "3"]
}
}
}
(10) 模糊查询(fuzzy)
fuzzy关键字:用来模糊查询含有指定关键字的文档 注意:允许出现的错误必须在0-2之间 spring 至 spoong 但是spooong不能匹配到
- 关键词的长度:0..2必须全部匹配
- 3..5 允许出现一个长度的错误编辑距离
- > 5 允许出现两个长度的错误编辑距离
GET /ems/emp/_search
{
"query":{
"fuzzy":{
"content":"spoong"
}
}
}
(11)布尔查询(bool)-重点掌握:可以组合上面的一切查询
- bool关键字: 用来组合多个条件实现复杂查询: boolb表达式查询
- must: 相当于&&同时成立
- should:相当于||成立一个就行
- must_not:相当于!不能满足任何一个
GET /ems/emp/_search
{
"query":{
"bool":{
"must":[
{
"term":{
"content":{
"value":"开"
}
}
}
],
"must_not":[
{
"ids":{
"values":["1"]
}
}
]
}
}
}
(12) 多字段查询 (multi_match) 可分词查询 但无法指定分词器
输入一个词 可以从多个字段中进行查询-还是多字段分词查询,先分词再查询(对于框架,如果文章中既包含了框又包含了架,那得分一定是最高的,排在最前面,其他的只包含框或者只包含架的也会被检索呈现)
GET /ems/emp/_search
{
"query":{
"multi_match":{
"query":"中国",
"fields":["name", "content"]
}
}
}
GET /ems/emp/_search
{
"query":{
"multi_match":{
"query":"张小五",
"fields":["name", "content"]
}
}
}
会拿着 张 小 五 这三个同时去content里搜 但是会拿着张小五去name里搜
(13) 多字段分词查询(query_string):先分词然后再去搜索,但是可以指定分词器
GET /ems/emp/_search
{
"query":{
"query_string":{
"query":"这是一个框架",
"fields":["name","content"],
"analyzer": "simple"
}
}
}
上述方式可以指定分词器,默认为标准分词器(单字分词), simple:也就是所有的文字都分在一块
(14) 高亮查询(highlight)
GET /ems/emp/_search
{
"query":{
"term":{
"content":{
"value":"开"
}
}
},
"highlight":{
"fields":{"content":{}},
"pre_tags":["<span style='color:red'>"],
"post_tags":["/<span"]
}
}
只在content的结果中高亮,返回的匹配结果前添加自己指定的html标签即可,底层是拿出整篇文章,再分词,再对可以匹配上搜索的关键字,会自动在前后自动加上指定的标签。
GET /ems/emp/_search
{
"query":{
"term":{
"content":{
"value":"开"
}
}
},
"highlight":{
"fields":{"*":{}},
"pre_tags":["<span style='color:red'>"],
"post_tags":["/<span"],
"require_field_match":false
}
}
用*修饰表示所有的都会高亮,但是name中的不会,因为如果name为keyword的话,它不会被分词,也就不会被高亮显示。默认的高亮都是基于搜索的结果实现的, 可以设置,"require_field_match":false 关闭资源的搜索匹配。只要字段中有*,就都会去高亮。