ElasticSearch第七篇:ES花式查询(重点),高亮查询(重点,好玩实用)!以及文档简单的增删查改

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属性可以自定义高亮的前缀和后缀,这样我们就可将需要高亮的部分自定义样式了!!!!!!!!

猜你喜欢

转载自blog.csdn.net/weixin_46792649/article/details/106472578