1.添加文档
PUT /bujingyi/user/1
{
"name":"不经意",
"age":24,
"desc":"伤痛开花,苦难结果,思维灵动,人生丰盈",
"tags":["直男","技术","爱学习"]
}
2.获取数据,GET(最简单的获取)
GET /bujingyi/user/1
简单的条件查询:
GET /bujingyi/user/_search?q=name:不经意
上图的查询结果中有一个字段"_score" : 2.561446,这个是一个匹配度。假如我们条件查询出来有多条数据,那这个这个字段值越高,则说明匹配度越高,所以在实际业务中,我们可以根据这个做权重处理,或者排序!!!!!
3.更新数据,PUT,不推荐,若有字段忘记填了,则自动置空。
PUT /bujingyi/user/1
{
"name":"不经意最帅",
"age":30,
"desc":"伤痛开花,苦难结果,思维灵动,人生丰盈",
"tags":["靓女","广东人","爱猫人士"]
}
4.更新数据,POST _search,比PUT更灵活,想改哪个字段就改哪个
POST /bujingyi/user/1/_update
{
"doc":{
"age":23,
"tags":["直男","湖南人","技术宅"]
}
}
5.花式查询,复杂操作
5.1 普通查询(查询name字段带有不经意的文档):
GET /bujingyi/user/_search
{
"query": {
"match": {
"name": "不经意"
}
}
}
5.2 如果只查询name和desc两个字段呢(默认查询所有,现在做结果过滤,不要垃圾信息)?看下图:
GET /bujingyi/user/_search
{
"query": {
"match": {
"name": "不经意"
}
},
"_source": ["name","desc"]
}
5.3 如何进行排序?默认是根据_score匹配分值进行降序排序的,但如果我们指定一个字段进行asc或者desc排序呢?这里我使用age来进行降序,如下图:
GET /bujingyi/user/_search
{
"query": {
"match": {
"name": "不经意"
}
},
"_source": ["name","age","desc"],
"sort": [
{
"age": {
"order": "desc"
}
}
]
}
5.4 在实际开发中,我们经常用到分页查询。那在elasticsearch中怎么做到分页呢?如下图(对包含不经意的文档进行分页,总数是5条):
GET /bujingyi/user/_search
{
"query": {
"match": {
"name": "不经意"
}
},
"_source": ["name","age","desc"],
"sort": [
{
"age": {
"order": "asc"
}
}
],
"from": 0,
"size": 2
}
上图即是一个es的分页查询,添加了from和size属性,其中from是指分页的起始索引,size是指分页容量。(es的索引从0开始,分页是基于查询后的结果,这里我的条件查询结果有5条,那么索引为0,1,2,3,4。from=0,size=2即是指取出查询结果的第一条和第二条)
5.5 下面继续,布尔值查询,也就是多条件查询:
GET /bujingyi/user/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "不经意"
}
},
{
"match": {
"age": 14
}
}
]
}
}
}
其中bool代表此查询为布尔查询,也就是多条件查询。
而must则是and的意思,就是后面集合里的所有条件都要满足:
must(and),所有的条件都要符合,相当于where id=1 and name=xxx
should(or),满足一个条件即可,相当于 where id=1 or name=xxx
must_not(!=),所有条件必须满足不等于,相当于where id!=1 and name!=xxx
GET /bujingyi/user/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"name": "芒果"
}
},
{
"match": {
"age": 14
}
}
]
}
}
}
GET /bujingyi/user/_search
{
"query": {
"bool": {
"must_not": [
{
"match": {
"name": "芒果"
}
},
{
"match": {
"age": 14
}
}
]
}
}
}
5.6 接下来,我们使用过滤查询,也就是过滤器filter:
查询name带有芒果或者age等于14,并筛选出13<age<=20的文档
GET /bujingyi/user/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"name": "芒果"
}
},
{
"match": {
"age": "14"
}
}
],
"filter": {
"range": {
"age": {
"gt": 13,
"lte": 20
}
}
}
}
}
}
5.7 记得创建的文档里还有tags这个字段,是一个字符串数组吧,那如何查询tags包含某个词的文档呢?看下图:
我来查询tags里包含芒果的文档,实际上,在搜索的时候,默认的分词器将芒果两个字分成了“芒”和“果”两个字再去匹配的,多个条件用空格隔开即可,如"tags": "芒果 仓鼠",只要满足其中一个结果就会被查出。
GET /bujingyi/user/_search
{
"query": {
"match": {
"tags": "芒果"
}
}
}
5.8 再来讲一下精确查询term!!term查询是直接通过倒排索引指定的词条进行精确的查找!!!看下面:
①term:通过倒排索引指定的词条进行精确的查找,配合keyword类型的字段,都不分词,直接匹配
②match:查询之前会通过分词器解析,解析后再进行查询
两个类型:text(会被分词器解析)和keyword(不会被分词器解析)
GET /bujingyi/user/_search
{
"query": {
"bool": {
"should": [
{
"term": {
"age": 14
}
},
{
"term": {
"age": 13
}
}
]
}
}
}
5.9 高亮查询!!!好玩又实用的功能!!!!!!
GET /bujingyi/user/_search
{
"query": {
"match": {
"name": "不经意"
}
},
"highlight": {
"fields": {
"name":{}
}
}
}
5.10 自定义高亮条件!!!好玩!!
上面的高亮查询,默认是将搜索条件在搜索结果对应的字段中使用<em></em>套起来,但是在应用场景中,有可能需要别的样式,比如颜色?大小?间距?这些都可以自定义!!!!
GET /bujingyi/user/_search
{
"query": {
"match": {
"name": "不经意"
}
},
"highlight": {
"pre_tags": "<span class='test' style='background:red;color:green;font-size:16px'>",
"post_tags": "</span>",
"fields": {
"name":{}
}
}
}
上述pre_tags和post_tags属性可以自定义高亮的前缀和后缀,这样我们就可将需要高亮的部分自定义样式了!!!!!!!!