ES中常用查询解释

ES中常用查询解释

项目中间经常使用es进行一些查询,这里通过一些例子简单说明一下es中常见的几种查询,以下通过products索引来对match,term,bool查询进行讲解说明

js 复制代码
PUT /products
{
  "mappings": {
    "properties": {
      "product_id": { "type": "integer" },
      "name": { "type": "text" },
      "category": { "type": "keyword" },
      "price": { "type": "float" }
    }
  }
}

示例数据

json 复制代码
[
  {
    "product_id": 1,
    "name": "iPhone 13 Pro",
    "category": "Electronics",
    "price": 1099
  },
  {
    "product_id": 2,
    "name": "Samsung Galaxy",
    "category": "Electronics",
    "price": 899
  },
  {
    "product_id": 3,
    "name": "Nike Running Shoes",
    "category": "Sportswear",
    "price": 99
  },
  {
    "product_id": 4,
    "name": "Sony Headphones",
    "category": "Electronics",
    "price": 199
  },
  {
    "product_id": 5,
    "name": "Canon EOS R5",
    "category": "Photography",
    "price": 3499
  },
  {
    "product_id": 6,
    "name": "Adidas Soccer Ball",
    "category": "Sports",
    "price": 20
  },
  {
    "product_id": 7,
    "name": "Logitech Keyboard",
    "category": "Electronics",
    "price": 79
  },
  {
    "product_id": 8,
    "name": "Dell Laptop",
    "category": "Electronics",
    "price": 1299
  }
]

1. Match 查询:

查询条件:

json 复制代码
{
  "query": {
    "match": {
      "name": "Electronics"
    }
  }
}

查询结果:

json 复制代码
[
  {
    "product_id": 1,
    "name": "iPhone 13 Pro",
    "category": "Electronics",
    "price": 1099
  },
  {
    "product_id": 2,
    "name": "Samsung Galaxy",
    "category": "Electronics",
    "price": 899
  },
  {
    "product_id": 7,
    "name": "Logitech Keyboard",
    "category": "Electronics",
    "price": 79
  },
  {
    "product_id": 8,
    "name": "Dell Laptop",
    "category": "Electronics",
    "price": 1299
  }
]

2. Term 查询:

查询条件:

json 复制代码
{
  "query": {
    "term": {
      "category.keyword": "Electronics"
    }
  }
}

查询结果:

json 复制代码
[
  {
    "product_id": 1,
    "name": "iPhone 13 Pro",
    "category": "Electronics",
    "price": 1099
  },
  {
    "product_id": 2,
    "name": "Samsung Galaxy",
    "category": "Electronics",
    "price": 899
  },
  {
    "product_id": 4,
    "name": "Sony Headphones",
    "category": "Electronics",
    "price": 199
  },
  {
    "product_id": 7,
    "name": "Logitech Keyboard",
    "category": "Electronics",
    "price": 79
  },
  {
    "product_id": 8,
    "name": "Dell Laptop",
    "category": "Electronics",
    "price": 1299
  }
]

3. Bool 查询:

查询条件:

json 复制代码
{
  "query": {
    "bool": {
      "must": [
        { "match": { "category": "Electronics" }},
        { "range": { "price": { "gte": 200 }}}
      ],
      "must_not": [
        { "term": { "name.keyword": "Samsung Galaxy" }}
      ]
    }
  }
}

查询结果:

json 复制代码
[
  {
    "product_id": 1,
    "name": "iPhone 13 Pro",
    "category": "Electronics",
    "price": 1099
  },
  {
    "product_id": 4,
    "name": "Sony Headphones",
    "category": "Electronics",
    "price": 199
  },
  {
    "product_id": 8,
    "name": "Dell Laptop",
    "category": "Electronics",
    "price": 1299
  }
]

Filter 查询:

查询条件:

json 复制代码
{
  "query": {
    "bool": {
      "filter": [
        { "range": { "price": { "lte": 100 }}}
      ]
    }
  }
}

查询结果:

json 复制代码
[
  {
    "product_id": 3,
    "name": "Nike Running Shoes",
    "category": "Sportswear",
    "price": 99
  },
  {
    "product_id": 6,
    "name": "Adidas Soccer Ball",
    "category": "Sports",
    "price": 20
  },
  {
    "product_id": 7,
    "name": "Logitech Keyboard",
    "category": "Electronics",
    "price": 79
  }
]

其实filter查询是bool查询的一种,bool查询通过结合filter,must,should,must_not关键字可以完成很多灵活的查询。

Bool查询filter,must,should,must_not关键字分析

通过以下示例来了解bool查询中filter,must,should,must_not关键字。

假设我们的索引products包含以下数据:

product_id name category price
1 iPhone 13 Pro Electronics 1099
2 Samsung Galaxy Electronics 899
3 Nike Running Shoes Sportswear 99
4 Sony Headphones Electronics 199
5 Canon EOS R5 Photography 3499
6 Adidas Soccer Ball Sports 20
7 Logitech Keyboard Electronics 79
8 Dell Laptop Electronics 1299

Filter 查询示例:

1. 价格低于等于100,并且属于电子产品的:

json 复制代码
{
  "query": {
    "bool": {
      "filter": [
        { "range": { "price": { "lte": 100 }}},
        { "term": { "category.keyword": "Electronics" }}
      ]
    }
  }
}

2. 不是电子产品的,并且价格在200到1000之间的:

json 复制代码
{
  "query": {
    "bool": {
      "filter": [
        { "term": { "category.keyword": "Electronics" }},
        { "range": { "price": { "gte": 200, "lte": 1000 }}}
      ],
      "must_not": [
        { "term": { "category.keyword": "Electronics" }}
      ]
    }
  }
}

3. 价格在100到500之间,或者是运动类别的:

json 复制代码
{
  "query": {
    "bool": {
      "filter": [
        { "range": { "price": { "gte": 100, "lte": 500 }}},
        { "term": { "category.keyword": "Sportswear" }}
      ],
      "should": [
        { "range": { "price": { "gte": 100, "lte": 500 }}},
        { "term": { "category.keyword": "Sportswear" }}
      ],
      "minimum_should_match": 1
    }
  }
}

4. 不是电子产品,并且价格不高于1000,或者是相机类别的:

json 复制代码
{
  "query": {
    "bool": {
      "filter": [
        { "term": { "category.keyword": "Electronics" }},
        { "range": { "price": { "lte": 1000 }}}
      ],
      "must_not": [
        { "term": { "category.keyword": "Electronics" }}
      ],
      "should": [
        { "term": { "category.keyword": "Photography" }}
      ],
      "minimum_should_match": 1
    }
  }
}

在通过以上示例了解之后,有一个疑问就是如果四个关键字同时使用,那么他们之间都会对结果产生什么影响呢?以及他们之间的执行顺序呢?

在查找了一些资料之后,发现没有明确的资料阐述四个关键字的具体执行顺序,但是可以通过分析几个关键字分别在查询阶段和评分阶段的作用来发现以下结果。

  • filter和must_not只作用于查询阶段,不影响评分阶段
  • must和should会影响评分
  • 查询文档如果符合filter条件会被返回,查询文档结果如果不符合must条件不会被返回,查询文档如果匹配must_not,那么不会被返回

总结

因此总结来看filter,must,must_not作用于查询阶段,must,should作用于评分阶段。简单来说就是,通过filter,must,must_not关键字用来缩小匹配到的文档集合,再根据must,should对符合查询条件的结果进行评分最终返回结果集合。所以我们可以简单理解filter,must,must_not会先执行,并且执行顺序一样,should只在评分阶段使用(这里说的顺序只作为理解来看)。

相关推荐
怕浪猫3 分钟前
前端对接聊天 API:我用 React 做了一个比 ChatGPT 还好看的界面
前端·后端·面试
IT_陈寒8 分钟前
深入理解Python:核心原理与最佳实践
前端·人工智能·后端
墨神谕40 分钟前
Elasticsearch 倒排索引底层原理详解:从 Term Dictionary、FST 到海量数据性能优化
大数据·elasticsearch·搜索引擎
我命由我1234543 分钟前
5-2.Python 编码进阶 - 字符串进阶(拼接、普通格式化、普通格式化数字精度控制、快速格式化、遍历、常用方法)
java·开发语言·后端·python·学习·java-ee·学习方法
专业程序开发源43 分钟前
django视听资源推荐系统16690-计算机课程设计、毕业设计
vue.js·spring boot·后端·python·django·php·课程设计
多客:duokelijie1 小时前
婚恋交友小程序合规梳理:上线运营需要准备哪些资质与许可手续?
后端·mysql·微信小程序·前端框架·uni-app·php·持续部署
yunwei371 小时前
eBPF 实例教程:使用内核跟踪点监控 GPU 驱动活动
linux·后端·性能优化
高频因子挖掘机1 小时前
别再手动维护股票名称映射表:用 Python 查询交易所元数据
后端·github·api
我的xiaodoujiao1 小时前
Django 权限系统项目实战详细图文教程 2--环境搭建
后端·python·django
高频因子挖掘机2 小时前
QuantDash 明明安装成功,为什么 Python 还是无法 import?
后端·github·api