MySQL, Oracle, Linux, 软件架构及大数据技术知识分享平台

网站首页 > 精选文章 / 正文

ElasticSearch入门四:高级查询操作

2025-01-11 13:39 huorong 精选文章 4 ℃ 0 评论

一、高级查询操作

Elasticsearch提供了基于JSON提供完整的查询DSL来定义查询

1.1 match_all查询所有文档

GET http://127.0.0.1:9200/student/_search
{
    "query":{
        "match_all":{}
    }
}
复制代码

这里的query代表一个查询对象,里面可以有不同的查询属性。match_all是查询类型,例如:match_all(代表查询所有)、match、term、range 等等,至于 {} 里面的查询条件可以根据不同的类型,有不同的写法 返回结果的字段说明:

{
  "took" : 1116, # 查询花费的时间,单位是毫秒
  "timed_out" : false, # 操作是否超时
  "_shards" : { # 分片信息
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
     "total": {
         "value": 3,
         "relation": "eq" # eq 表示计数准确, gte表示计数不准确
     },
    "max_score" : 1.0,
    "hits" : [ # 查询命中的结果
       ...
      }
    ]
  }
}
复制代码

1.2 match匹配查询

match匹配类型查询,会把查询条件进行分词,然后进行查询,多个词条之间是or的关系。

GET http://127.0.0.1:9200/student/_search
{
  "query": {
    "match": {
        "name":"zhangsan"
    }
  }
}
复制代码

1.3 multi_match字段匹配查询

multi_match与match类似,不同的是它可以在多个字段中查询。

GET http://127.0.0.1:9200/student/_search
{
  "query": {
    "multi_match": {
        "query": "zhangsan",
        "fields": ["name","nickname"]
    }
  }
}
复制代码

查询name字段和nickname字段值为zhangsan的文档

1.4 term关键字精准查询

term查询,精确的关键词匹配查询,不对查询条件进行分词。

GET http://127.0.0.1:9200/student/_search
{
  "query": {
      "term": {
      "name": {
          "value": "zhangsan"
      }
    }
  }
}
复制代码

1.5 terms多关键字精准查询

terms 查询和 term 查询一样,但它允许你指定多值进行匹配。 如果这个字段包含了指定值中的任何一个值,那么这个文档满足条件。

GET http://127.0.0.1:9200/student/_search
{
  "query": {
      "terms": {
         "name": {
            "value": ["zhangsan","wangwu"]
         }
      }
  }
}
复制代码

1.6 指定结果显示某些字段

默认情况下,Elasticsearch在搜索的结果中,会把文档中保存在_source的所有字段都返回。如果我们只想获取其中的部分字段,我们可以添加_source的过滤。

GET http://127.0.0.1:9200/student/_search
{
  "_source": ["name","nickname"], 
  "query": {
    "terms": {
      "nickname": ["zhangsan"]
    }
  }
}
复制代码

上面就指定了结果只显示name和nickname字段。

1.7 includes和excludes过滤字段

我们同样的可以通过:

  • includes:来指定想要显示的字段
  • excludes:来指定不想要显示的字段
GET http://127.0.0.1:9200/student/_search
{
  "_source": {
      "includes": ["name","nickname"]
  }, 
  "query": {
    "terms": {
      "nickname": ["zhangsan"]
    }
  }
}

# or

{
  "_source": {
      "excludes": ["age"]
  }, 
  "query": {
    "terms": {
      "nickname": ["zhangsan"]
    }
  }
}

复制代码

1.8 组合查询

bool把各种其它查询通过must(必须 )、must_not(必须不)、should(应该)的方式进行组合。

GET http://127.0.0.1:9200/student/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "zhangsan"
          }
        }
      ],
      "must_not": [
        {
          "match": {
            "age": "40"
          }
        }
      ],
      "should": [
        {
          "match": {
            "sex": "男"
          }
        }
      ]
    }
  }
}
复制代码

1.9 范围查询

range 查询找出那些落在指定区间内的数字或者时间。range查询允许以下字符:

操作符

说明

gt

大于>

gte

大于等于>=

lt

小于<

lte

小于等于<=

例如查询年龄大于等于30,小于等于35

GET http://127.0.0.1:9200/student/_search
{
  "query": {
    "range": {
      "age": {
        "gte": 30,
        "lte": 35
      }
    }
  }
}
复制代码

1.10 模糊查询

返回包含与搜索字词相似的字词的文档。

编辑距离是将一个术语转换为另一个术语所需的一个字符更改的次数。这些更改可以包括:

  • 更改字符(box → fox)
  • 删除字符(black → lack)
  • 插入字符(sic → sick)
  • 转置两个相邻字符(act → cat)

为了找到相似的术语,fuzzy查询会在指定的编辑距离内创建一组搜索词的所有可能的变体或扩展。然后查询返回每个扩展的完全匹配。 通过fuzziness修改编辑距离。一般使用默认值AUTO,根据术语的长度生成编辑距离。

GET http://127.0.0.1:9200/student/_search
{
  "query": {
    "fuzzy": {
      "title": {
        "value": "zhangsan"
      }
    }
  }
}

Tags:gt lt 大于小于

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言