ElasticSearch学习笔记二

文档中的基本操作

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 关闭资源的搜索匹配。只要字段中有*,就都会去高亮。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值