ElasticSearch查询详解(9大最常见ElasticSearch查询)

ElasticSearch查询详解(9大最常见ElasticSearch查询)-mikechen

ElasticSearch查询定义

Elasticsearch查询提供了一种强大的检索数据方式,这种检索方式称之为Query DSL,采用基于 RESTful 风格的接口封装成 JSON 格式的对象。

 

ElasticSearch查询语法

语法格式如下:

GET /索引名/_search {

json格式请求体数据

}

 

Elasticsearch常见查询

1.查询所有(match_all)

match_all:查询全部内容,不指定任何查询条件。

例如查询所有:

GET mikechen/_search
{
  "query": {
    "match_all": {}
  }
}

如果是针对某个字段查询:

GET mikechen/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "balance": {
        "order": "desc"
      }
    }
  ]
}

 

2.关键词查询(term)

term和match 是最常用的两个查询,term是代表完全匹配,也就是精确查询,搜索前不会再对搜索词进行分词拆解。

term属于精确匹配,只能查单个词,如果我只想精确匹配 love China这个词:

GET /mikechen/_search
{
"query": {
    "term": {
      "title": "love China"
    }
  }
}

term就精确匹配 love China这个词。

 

3.关键词查询(terms)

terms:相当于多个term检索, 类似于SQL中in关键字的用法, 即在某些给定的数据中检索。

{
    "query":{
        "terms":{
            "keyword":[
                "mikechen",
                "互联网架构"
            ]
        }
    }
}

 

4.范围查询(range)

range 关键字: 用来指定查询指定范围内的文档。

比如:查询年龄字段大于等于18,小于30的数据:

{
    "query":{
        "range":{
            "age":{
                "gte":18,
                "lt":30
            }
        }
    }
}

备注,大于、小于等判断标识为:

gt:>    gte:>=   lt:<       lte:<=

 

5.前缀查询(prefix)

前缀查询(prefix):返回包含指定前缀的所有文档。

比如:查询名字为mikechen开头的,可以使用prefix 查询:

GET /user/_search
{
    "query": {
        "prefix": {
            "name": "mikechen"
        }
    }
}

 

6.通配符查询(wildcard)

通配符查询指的就是:匹配字段被通配符表达式匹配的文档。

比如::*代表0个或多个字符:

GET /user/_search 
{
  "query": {
    "wildcard":{ "name":"mikechen*"}
  }
}

比如:? 代表任意1个字符等:

GET /user/_search
{
  "query": {
    "wildcard": { "name": "mike?chen"}
  }
}

 

7.正则查询(Regexp)

正则查询其实很容易理解,就是用正则表达式来匹配查询,可以实现比 通配符查询 更复杂的模式进行查询。

比如:

POST /mikechen/book/_search
{
    "query": {
        "regexp" : {
            "authors" : "t[a-z]*y"
        }
    }
}

 

8.复合查询

在实际应用当中,有时候搜索条件复杂,我们可以使用复合查询,也叫组合查询。

主要是bool查询,bool query 可以将任意多个简单查询组装在一起,有四个关键字可供选择:

1)must

文档必须匹配 must 选项下的查询条件。

2)should

文档可以匹配 should 下的查询条件,也可以不匹配。

3)must_not

文档必须不满足 must_not 选项下的查询条件。

4)filter

类似于 must,但是 filter 不评分,只是过滤数据。

示例:查询name 属性中必须包含 java以及info信息含有mikechen互联网架构的书籍。

GET books/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "name": {
              "value": "java"
            }
          }
        }
      ],
      "should": [
        {
          "match": {
            "info": "mikechen互联网架构"
          }
        }
      ]
    }
  }
}

 

9.模糊查询(Fuzzy Queries)

模糊查询是一种误拼写时的fuzzy模糊搜索技术,用于搜索的时候可能输入的文本会出现误拼写的情况。

比如:输入”方财兄“,这时候也要匹配到“方才兄”。

GET /blogs_index/_search
{
    "query": {
        "fuzzy" : {
            "author": {
                "value": "方财兄",
                "fuzziness": 1,
                "prefix_length": 1,
                "max_expansions": 100
            }
        }
    }
}

 

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法