ElasticSearch 3. 高级查询

接上一篇Kibana基本操作,传送门:ElasticSearch 2. Kibana基本操作

本票学习ES rest API 高级查询语法

基于7.2版本,之前创建了索引库user,本次重新创建了映射如下:

PUT /user/_mapping
{
  "properties": {
    "username": {
      "type": "text"
    },
    "password": {
      "type": "keyword",
      "index": false
    },
    "age": {
      "type": "integer"
    }
  }
}

正文:

查询文档

1. 基本查询

POST /索引库名/_search
{
  "query": {
    "查询类型": {
      "查询条件": "查询条件值"
    }
  }
}

这里query对象里面可以有不同的查询类型,基本类型有:

  • match_all 查询所有

    POST /user/_search
    {
         "query": {
           "match_all": {}
         }
    }
    
  • term 词条匹配

    用于精确值匹配,这些精确值可能是数字、时间、布尔或者那些未分词的字符串,类似于mysql的=

    POST /user/_search
    {
         "query": {
           "term": {
             "username": "zw"
           }
         }
    }
    
  • terms 多词条匹配

    类似于mysql的in语句

    POST /user/_search
    {
      "query": {
        "terms": {
          "_id": [1,2]
        }
      }
    }
    
  • match 匹配查询

    类似于mysql的like语句,但并不是**%值%**的模糊查询模式。

    当配置了分词器时,会先分词然后按照分词进行查询,多个词条之间是or的关系。

    现在没有配置分词器,使用效果就相当于=。

    POST /user/_search
    {
      "query": {
         "match": {
             "username": "加油努力奋斗"
         }
      }
    }
    

    or关系变为and关系:

    POST /user/_search
    {
      "query": {
         "match": {
             "username": {
               "query": "加油努力奋斗",
               "operator": "and"
             }
         }
      }
    }
    
  • multi_match 多字段匹配查询

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

    POST /user/_search
    {
      "query": {
        "multi_match": {
          "query": "加油努力奋斗",
          "fields": [
            "username",
            "password"
          ]
        }
      }
    }
    

返回结果解释:(来自百度)

贴一个返回结果:

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "user",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "password" : "1234567",
          "username" : "lss"
        }
      }
    ]
  }
}
  • took:查询花费时间,单位是毫秒
  • time_out:是否超时
  • _shards:分片信息
  • hits:搜索结果总览对象
    • total:搜索到的总条数
    • max_score:所有结果中文档得分的最高分
    • hits:搜索结果的文档对象数组,每个元素是一条搜索到的文档信息
      • _index:索引库
      • _type:文档类型
      • _id:文档id
      • _score:文档得分
      • _source:文档的源数据

2. 查询结果集过滤

​ es查询默认查询出所有的字段放在_source中,例如:

{
    "_index" : "user",
    "_type" : "_doc",
    "_id" : "2",
    "_score" : 0.9808292,
    "_source" : {
        "username" : "zw",
        "password" : "1234567"
    }
 }

可以通过使用_source属性来指定查询部分字段

  • 查询时使用_source属性指定查询字段

    POST /user/_search
    {
        "_source": "username",
        "query": {
           "term": {
             "username": "zw"
           }
        }
    }
    

    相当于:select username from user where username = ‘zw’

    返回:

    {
        	"_index" : "user",
        	"_type" : "_doc",
        	"_id" : "2",
        	"_score" : 0.9808292,
        	"_source" : {
            	"username" : "zw"
        	}
    }
    
  • includes和excludes

    • includes:来指定想要显示的字段

    • excludes:来指定不想要显示的字段

      # 查询username、password字段
      POST /user/_search
      {
        "_source": {
          "includes": [
            "username",
            "password"
          ]
        },
        "query": {
          "match_all": {}
        }
      }
      
      # 查询排除password字段
      POST /user/_search
      {
        "_source": {
          "excludes": "password"
        },
        "query": {
          "match_all": {}
        }
      }
      

3. 范围查询

使用range属性,支持大于、小于、大于等于、小于等于操作。

关键字:

操作符说明
gt大于
gte大于等于
lt小于
lte小于等于

语法:

POST /索引库名/_search
{
  "query": {
    "range": {
      "FILED字段": {
        "gte":,
        "lte":}
    }
  }
}

举例查询user年纪age大于1小于3的数据:

POST /user/_search
{
  "query": {
    "range": {
      "age": {
        "gte": 1,
        "lte": 3
      }
    }
  }
}

4. 模糊查询

使用fuzzy属性

语法:

POST /索引库名/_search
{
  "query": {
    "fuzzy": {
      "FILED字段": "值"
    }
  }
}

例如:查询名称包含s的user

POST /user/_search
{
  "query": {
    "fuzzy": {
      "username": "s"
    }
  }
}

fuzzy自动将拼写错误的搜索文本,进行纠正,纠正以后去尝试匹配索引中的数据

它允许用户搜索词条与实际词条出现偏差,但是偏差的编辑距离不得超过2:

使用fuzziness属性设置最大纠正编辑距离

例如:我们新增数据{“username”:“phone”}

查询:

POST /user/_search
{
  "query": {
    "fuzzy": {
      "username": "phoen"
    }
  }
}

设置最大纠错距离:

POST /user/_search
{
  "query": {
    "fuzzy": {
      "username": {
        "value": "phoen",
        "fuzziness": 2
      }
    }
  }
}

返回:

{
 	"_index" : "user",
 	"_type" : "_doc",
 	"_id" : "gjHSjXkBMRMNNQHn6wqf",
 	"_score" : 1.7868738,
 	"_source" : {
 		"username" : "phone"
	}
}

5. 组合查询

使用bool关键字,包含must(与)、must_not(非)、should(或)三种关系,可进行组合查询。

语法:

POST /user/_search
{
  "query": {
    "bool": {
      "must": {
          "查询类型1":{
            "查询条件":"查询条件值"
          },
          "查询类型n":{
            "查询条件":"查询条件值"
          }
      },
      "must_not": {
          "查询类型1":{
            "查询条件":"查询条件值"
          },
          "查询类型n":{
            "查询条件":"查询条件值"
          }
      },
      "should": {
          "查询类型1":{
            "查询条件":"查询条件值"
          },
          "查询类型n":{
            "查询条件":"查询条件值"
          }
      }
    }
  }
}

怎么理解呢,must(与)、must_not(非)、should(或)中可以写多个查询属性,must中的查询属性都是and关系,以此类推must_not中都是not关系,should中都是or的关系

举例:查询user表中username=zs 或username=ls且age!=7、的数据

POST /user/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "username": "zs"
          }
        },
        {
          "term": {
            "username": "ls"
          }
        }
      ],
      "must_not": {
        "term": {
          "age": 7
        }
      }
    }
  }
}

排序

通过sort属性设置字段排序,通过order设置排序方式

语法:

POST /索引库名/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "FIELD字段1": {
        "order": "desc"
      },
      "FIELD字段2": {
        "order": "asc"
      }
    }
  ]
}

举例:

POST /user/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    },
    {
      "_id" : {
        "order": "asc"
      }
    }
  ]
}

高亮

在使用match查询的同时,加上一个highlight属性:

  • pre_tags:前置标签
  • post_tags:后置标签
  • fields:需要高亮的字段

在配置使用分词器的情况下使用,会作用于匹配到的分词

未配置分词器的情况下使用,作用于整个字段

例子:

POST /user/_search
{
  "query": {
    "match": {
      "username": "ls"
    }
  },
  "highlight": {
    "pre_tags": "<font color='red'>",
    "post_tags": "</font>",
    "fields": {
      "username": {}
    }
  }
}

返回:

{
    "_index" : "user",
    "_type" : "_doc",
    "_id" : "gDGjjXkBMRMNNQHnWQpt",
    "_score" : 1.7227666,
    "_source" : {
    	"username" : "ls",
    	"password" : "123456",
    	"age" : 7
    },
    "highlight" : {
    	"username" : [
    	"<font color='red'>ls</font>"
    	]
    }
},
...

分页查询

使用size,from。语法:

POST /索引库名/_search
{
  "query": {
    "match_all": {}
  },
  "size": 2,
  "from": 0
}

size:每页数量

from:当前页起始索引, from = (pageNum - 1) * size



后续学习es集群知识和搭建集群以及es java客户端

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值