12 搜索之DSL--基础查询


1 DSL介绍

Elasticsearch提供了基于JSON的完整查询DSL(Domain Specific Language)来定义查询。
将查询DSL视为查询的AST(抽象语法树),它由两种子句组成:

  • 叶子查询子句(Leaf query clauses)
    在特定字段中查找特定值, 例如match,term或range查询

  • 复合查询子句(Compound query clauses)
    以逻辑方式组合多个叶子、复合查询为一个查询(例如bool或dis_max查询),

查询和过滤的区别

查询:用于检查内容与条件是否匹配,并且计算_score元字段表示匹配度。查询的结构中以query参数来开始执行内容的查询。

过滤:不计算匹配得分,只是简单的决定文档是否匹配。过滤往往会被elasticsearch自动缓存起来提高性能。

查询的子句中也可以传递filter参数。

2 数据准备

  1. 准备一个商品的索引
PUT goods
{
   
   
  "mappings": {
   
   
    "properties": {
   
   
      "id":{
   
   
        "type": "long"
      },
      "name":{
   
   
        "type": "text",
        "analyzer": "ik_max_word"
      },
      "category":{
   
   
        "type": "keyword"
      },
      "price":{
   
   
        "type": "float"
      },
      "content":{
   
   
       "type": "text",
        "analyzer": "ik_max_word"
      },
      "create_at":{
   
   
        "type": "date",
        "format": ["yyyy-MM-dd hh:mm:ss"]
      }
    }
  }
}
  1. 插入数据
PUT goods/_doc/1
{
   
   
  "id":1,
  "name": "苹果手机12",
  "category":"手机",
  "price":8999.00,
  "content":"Apple iPhone 12 Pro Max (A2412) 256GB 海蓝色 支持移动联通电信5G 双卡双待手机",
  "create_at":"2020-12-12 12:00:00"
  
}
PUT goods/_doc/2
{
   
   
  "id":2,
  "name": "华为手机P40",
  "category":"手机",
  "price":7999.00,
  "content":"华为p40 5G手机 亮黑色 8+128G全网通",
  "create_at":"2020-12-11 12:00:00"
  
}

3 文本查询

基本语法

GET /索引库名/_search
{
   
   
    "query":{
   
   
        "查询类型":{
   
   
            "查询条件":"查询条件值"
        }
    }
}
  • 查询类型:
    • 例如:match_allmatchtermrange 等等
  • 查询条件:查询条件会根据类型的不同,写法也有差异,后面详细讲解

3.1 match 查询

3.1.1 查询所有(match_all)
GET goods/_search
{
   
   
  "query": {
   
   "match_all": {
   
   }}
}
{
   
   
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
   
   
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
   
   
    "total" : {
   
   
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
   
   
        "_index" : "goods",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
   
   
          "id" : 1,
          "name" : "苹果手机12",
          "category" : "手机",
          "price" : 8999.0,
          "content" : "Apple iPhone 12 Pro Max (A2412) 256GB 海蓝色 支持移动联通电信5G 双卡双待手机",
          "create_at" : "2020-12-12 12:00:00"
        }
      },
      {
   
   
        "_index" : "goods",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
   
   
          "id" : 2,
          "name" : "华为手机P40",
          "category" : "手机",
          "price" : 7999.0,
          "content" : "华为p40 5G手机 亮黑色 8+128G全网通",
          "create_at" : "2020-12-11 12:00:00"
        }
      }
    ]
  }
}

可以不指定索引库:查询所有的索引库

GET _search
{
   
   
  "query": {
   
   "match_all": {
   
   }}
}
3.1.2 match_none

这是match_all查询的逆函数,该查询不匹配任何文档

3.1.3 match query(匹配查询)

用于执行全文查询的标准查询,包括模糊匹配和短语或接近查询。
match类型查询,会把查询条件进行分词,然后进行查询,多个词条之间是or的关系(默认)

or
GET goods/_search?
{
   
   
  "query": {
   
   
    "match": {
   
   
      "content": {
   
   
        "query": "华为手机",
        "operator": "or"   # 默认就是or
      }
    }
  }
}

查询结果: 两条记录都查出来了

{
   
   
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
   
   
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
   
   
    "total" : {
   
   
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 0.96994376,
    "hits" : [
      {
   
   
        "_index" : "goods",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.96994376,
        "_source" : {
   
   
          "id" : 2,
          "name" : "华为手机P40",
          "category" : "手机",
          "price" : 7999.0,
          "content" : "华为p40 5G手机 亮黑色 8+128G全网通",
          "create_at" : "2020-12-11 12:00:00"
        }
      },
      {
   
   
        "_index" : "goods",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.16613919,
        "_source" : {
   
   
          "id" : 1,
          "name" : "苹果手机12",
          "category" : "手机",
          "price" : 8999.0,
          "content" : "Apple iPhone 12 Pro Max (A2412) 256GB 海蓝色 支持移动联通电信5G 双卡双待手机",
          "create_at" : "2020-12-12 12:00:00"
        }
      }
    ]
  }
}

  • 华为手机,经过分词分为:华为,手机
  • 搜索的时候,content字段中包含手机,或者华为这两个词就可以被匹配出来
and
GE
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值