Elasticsearch 组合查询的使用

这篇具有很好参考价值的文章主要介绍了Elasticsearch 组合查询的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这里介绍Elasticsearch 中的组合查询的使用细节,Elasticsearch支持类似于在SQL中使用AND、OR以及NOT的运算符,可以通过组合嵌套这些条件进行复杂的数据筛选。

数据准备

复用上篇文章的mapping和数据供这里的demo使用。
mapping:

PUT /phones
{
  "mappings": {
    "properties": {
      "price":{
        "type":"long"
      },
      "color":{
        "type": "keyword"
      },
      "brand":{
        "type": "keyword"
      },
      "release_date":{
        "type": "date"
      }
    }
  }
}

数据:

PUT /phones/_bulk
{"index":{}}
{"price":100,"color":"白色","brand":"小米","release_date":"2022-02-06"}
{"index":{}}
{"price":150,"color":"白色","brand":"小米","release_date":"2022-02-06"}
{"index":{}}
{"price":200,"color":"黑色","brand":"小米","release_date":"2022-02-08"}
{"index":{}}
{"price":250,"color":"黑色","brand":"小米","release_date":"2022-02-08"}
{"index":{}}
{"price":300,"color":"白色","brand":"华为","release_date":"2022-02-08"}
{"index":{}}
{"price":400,"color":"黑色","brand":"华为","release_date":"2022-02-10"}
{"index":{}}
{"price":500,"color":"灰色","brand":"华为","release_date":"2022-02-11"}
{"index":{}}
{"price":250,"color":"白色","brand":"苹果","release_date":"2022-02-11"}
filter的用法

在使用filter查询的时候,会使用一个二进制数组bitset保存倒排索引中的document list,符合条件的document置为1,不符合的document对应的位置为0,并且会将filter的bitset缓存起来,相同的filter条件进来的话会直接读取之前的bitset缓存,当document有新增或者修改的时候,Elasticsearch会维护对应的bitset。
filter是仅仅过滤需要的数据,不会使用TF/IDF进行分数计算。
filter会在普通的query之前执行,这是filter的效率更快,可以先过滤掉一些数据。

组合查询中的使用:查询品牌是小米,且价格大于等于200的手机。

GET /phones/_search
{
    "query":{
        "bool":{
            "must":{
                "term":{
                    "brand":"小米"
                }
            },
            "filter":{
                "range":{
                    "price":{
                        "gte":200
                    }
                }
            }
        }
    }
}

单独使用filter:搜索价格大于400的手机。
query里面不能直接用filter,需要包一层constant_score,表示忽略评分

GET /phones/_search
{
    "query":{
        "constant_score":{
            "filter":{
                "range":{
                    "price":{
                        "gte":400
                    }
                }
            }
        }
    }
}
bool组合查询

在bool中可以嵌套should、must、must_not,它们分别sql中的or、and、not条件。

搜索品牌是小米或者华为且发布日期不能是2022-02-08的手机。

GET /phones/_search
{
    "query":{
        "constant_score":{
            "filter":{
                "bool":{
                    "should":[
                        {
                            "term":{
                                "brand":"小米"
                            }
                        },
                        {
                            "term":{
                                "brand":"华为"
                            }
                        }
                    ],
                    "must_not":[
                      {
                          "term":{
                            "release_date":"2022-02-08"
                          }
                      }
                    ]
                }
            }
        }
    }
}

搜素品牌是苹果 或者品牌是小米且颜色为黑色的手机

GET /phones/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "brand": {
              "value": "苹果"
            }
          }
        },
        {
          "bool": {
            "must": [
              {
                "term": {
                  "brand": {
                    "value": "小米"
                  }
                }
              },
              {
                "term": {
                  "color": {
                    "value": "黑色"
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}
should和must 用法的总结

must和should平级的话,should的条件是不参与过滤数据的,只参与分数计算。这时的分数是must和should搜索对应的分数加起来除以must和should的总和。
默认情况下should的条件是可以一个都不满足的,可以通过mininum_should_match指定should中必须满足的条件个数。当没有must的时候,should必须匹配一个。

单独使用should:查询发布日期是2022-02-10或2022-02-11的手机

GET /phones/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "release_date": {
              "value": "2022-02-10"
            }
          }
        },
        {
          "term": {
            "release_date": {
              "value": "2022-02-11"
            }
          }
        }
      ]
    }
  }
}

should和must同时使用,可以看到不存在满足should中条件的数据,但只要满足must条件的数据都会被返回。

GET /phones/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "brand": {
              "value": "三星"
            }
          }
        },
        {
          "term": {
            "color": {
              "value": "绿色"
            }
          }
        }
      ],
      "must": [
        {
          "term": {
            "price": {
              "value": 250
            }
          }
        }
      ]
    }
  }
}
评分权重自定义

默认情况下每个must和should条件的权重都是1,可以通过boost进行权重的修改。

这里必须要满足的条件是发布时间为2022-02-08,由于是term查询所以分数最低的是1,价格为200所占评分权重最高。文章来源地址https://www.toymoban.com/news/detail-475239.html

GET /phones/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "release_date": {
              "value": "2022-02-08"
            }
          }
        }
      ],
      "should": [
        {
          "term": {
            "brand": {
              "value": "华为"
              , "boost": 2
            }
          }
        },
        {
          "term": {
            "price": {
              "value": "200",
              "boost": 5
            }
          }
        }
      ]
    }
  }
}

到了这里,关于Elasticsearch 组合查询的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Elasticsearch之聚合查询介绍与使用(附RestAPI代码案例)

    前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将介绍Elasticsearch搜索引擎之聚合查询的介绍与使用,这块内容不作为面试中的重点。 如果文章有什么需要改进的地方还请大佬不吝赐教 👏👏。 小威在此先感谢各位大佬啦~~🤞🤞 🏠个人主页:小威

    2023年04月13日
    浏览(43)
  • 【MySQL】不允许你不会使用组合查询

    🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📆 未来很长,值得我们全力奔赴更美好的生活✨ 😁大家好呀,今天是我第N次写MySQL,也是最近才学习MySQL,也想着记录一

    2024年02月15日
    浏览(43)
  • Elasticsearch Boolean Query查询介绍

    前言 ES 和 Solr 的底层都是基于Apache Lucene 实现,bool 查询的底层实现是Lucene 的 BooleanQuery,其可以组合多个子句查询,类似 SQL 语句里面的 OR 查询。 查询介绍 在 ES 里面 Boolean 查询封装了 4 种 API 接口能力,可以单独使用,也可以组合使用,总结如下: 函数 描述 must query 关键

    2024年02月13日
    浏览(46)
  • 【Elasticsearch系列】5分钟掌握查询原理-lucece查询逻辑介绍

    🎬作者简介:大家好,我是蓝胖子🥇 ☁️博客首页:CSDN主页蓝胖子的编程梦 🌄每日一句:既然选择了追求,就不要哭泣。坚持一下,扛过今天,幸福就更近一步 大家好,我是蓝胖子,最近在做一些elasticsearch 慢查询优化的事情,通常用分析elasticsearch 慢查询的时候可以通

    2024年02月22日
    浏览(41)
  • 【ElasticSearch】 ElasticSearch serverless架构介绍(查询写入分离,计算存储分离)

    ElasticSearch 推出了全新的serverless架构,将查询(search)和写入(indexing)分离,将计算(computing)和存储(storage)分离,极大提高了 ES 的可运维性,降低了学习成本。本文将先介绍下serverless含义,再介绍ElasticSearch serverless架构。 在serverless架构下,用户只需关注业务逻辑,无需管理服务

    2024年01月24日
    浏览(47)
  • 从根上理解elasticsearch(lucene)查询原理(1)-lucece查询逻辑介绍

    大家好,最近在做一些elasticsearch 慢查询优化的事情,通常用分析elasticsearch 慢查询的时候可以通过profile api 去分析,分析结果显示的底层lucene在搜索过程中使用到的函数调用。所以要想彻底弄懂elasticsearch慢查询的原因,还必须将lucene的查询原理搞懂,今天我们就先来介绍下

    2024年02月04日
    浏览(38)
  • elasticsearch 笔记三:查询建议介绍、Suggester、自动完成

    1. 查询建议是什么? 查询建议,为用户提供良好的使用体验。主要包括: 拼写检查; 自动建议查询词(自动补全) 拼写检查如图: 自动建议查询词(自动补全): 2. ES 中查询建议的 API 查询建议也是使用_search 端点地址。在 DSL 中 suggest 节点来定义需要的建议查询 示例 1:

    2024年02月03日
    浏览(31)
  • 【Elasticsearch】ES精确查询和范围查询,ES时间字段排序实例,ES倒排索引介绍

    termQuery matchQuery 模糊查询 multiMatchQuery 多个字段模糊查询 如果时间字段写入时用的类型是Text,可以用“时间字段.keyword”来处理 #查询前传入分页参数 #分页后拿到总记录数 把文档D对应到的映射转换为到文档ID的映射,每个都对应着一系列的文档,这些文

    2024年02月15日
    浏览(113)
  • ElasticSearch中关于Nasted嵌套查询的介绍:生动案例,通俗易懂,彻底吸收

    题注:随着对ES接触的越来越深入,发现此前了解的ES知识点有点单薄,特此寻来ES知识点汇总成的一个思维导图,全面了解自己掌握了哪些,未掌握哪些。此外,作者斌并没有足够的精力学习ES全部的知识点,只能见缝插针,在工作中遇到陌生的点再去深入了解。 本文则是针

    2024年02月03日
    浏览(39)
  • Python组合模式介绍、使用方法

    概念: 组合模式(Composite Pattern)是一种结构型设计模式,它通过将对象组合成树状结构来表示“整体/部分”层次结构,让客户端可以以相同的方式处理单个对象和组合对象。 功能: 统一对待组合对象和叶子对象 方便添加/删除节点 简化客户端代码 优点: 可以更方便地添加

    2024年02月15日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包