jjzjj

ES中 minimum_should_match 的用法和误区

Elastic开源社区 2024-02-29 原文

背景

写这篇文章是因为有个同学在群里发了这么一张截图,图中讲的两点关于``的描述,我看了一眼,两个都是错的。

目前互联网上的文章质量参差不齐,这也算是为了提高网络博客的质量进一己之力吧。

上述截图中的两个认知误区

1、不能简单的说 7.0 版本之后 默认值是 0 或者 1

minimum_should_match是ES组合查询中的一个常用参数,参数指定should子句返回的文档必须匹配的子句的数量或百分比。注意这里可以输具体的数量,也可以是百分数指定。并且满足以下两个条件:

  • 如果bool查询包含至少一个should子句,而没有must或 filter子句,则默认值为1。即此时minimum_should_match如果没有显示的配置,should子句中的条件必须至少满足一个。
  • 如果bool查询包包含mustfilter子句,则minimum_should_match默认值为0,即:此时minimum_should_match如果没有显示的配置,此时should子句中可以不满足任何条件。

2、minimum_should_match并不是非用不可

minimum_should_match可以控制查询精度,在should和must联合查询查询时必须使用”,这句话的描述也存在问题。下面通过一个习题案例,来证明:

Task:
假设有movie_data索引包含如下文档:

{
  "minutes": 136,
  "movie_id": "1893",
  "title": "Star Wars: Episode I - The Phantom Menace",
  "tags": [
    "prophecy",
    "senate",
    "queen",
    "taskmaster",
    "galaxy",
    "apprentice",
    "taxes",
    "space opera"
  ],
  "revenue": 924317558,
  "release_date": "1999-05-19T06:00:00.000Z",
  "budget": 115000000,
  "avg_score": 6.3
}

movie_data索引上写一个单独的搜索,满足以下要求:

  • title 字段包含memy
  • tags字段带有romantic comedy标签的文档得分权重高于标签中不包含romantic comedy标签的文档。

答案

GET movie_data/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "title": "my me"
          }
        }
      ],
      "should": [
        {
          "match": {
            "tags.keyword": {
              "query": "romantic comedy",
              "boost": 10
            }
          }
        }
      ]
    }
  }
}

分析

这里只针对should子句展开分析,也就是题目的第二个要求。此题答案中同事包含了mustshould子句。

题目中只是说tags字段如果带有romantic comedy标签,那么它的得分权重更高。但是并没有要求带有romantic comedy标签是个必要条件。换句话说,就是带有romantic comedy标签,那么提高评分权重,如果不带,那么什么也不做。

答案中并未显示的配置minimum_should_match参数,所以此时minimum_should_match的默认值是0。即should子句中的条件可以完全不满足。也就是说should子句不会对最终结果的文档数产生影响。那么当前子句的语义则为:带有romantic comedy标签的文档,权重提升10倍,如果不带,也没有关系。

推荐阅读:

有关ES中 minimum_should_match 的用法和误区的更多相关文章

  1. ruby-on-rails - rspec should have_select ('cars' , :options => ['volvo' , 'saab' ] 不工作 - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request

  2. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  3. ES基础入门 - 2

    ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear

  4. ruby - 有人可以解释一下在 Ruby 中注入(inject)的真实、通俗易懂的用法吗? - 2

    我正在学习Ruby,遇到了inject。我正处于理解它的风口浪尖,但当我是那种需要真实世界的例子来学习一些东西的人时。我遇到的最常见的例子是人们使用inject来添加一个(1..10)范围的总和,我不太关心这个。这是一个任意的例子。在实际程序中我会用它做什么?我正在学习,所以我可以继续使用Rails,但我不必有一个以Web为中心的示例。我只需要一些我可以全神贯注的目标。谢谢大家。 最佳答案 inject有时可以通过它的“其他”名称reduce更好地理解。它是一个对Enumerable进行操作(迭代一次)并返回单个值的函数。它有许多有

  5. ruby - 使用法拉第上传文件 - 2

    我在尝试使用Faraday将文件上传到网络服务时遇到问题。我的代码:conn=Faraday.new('http://myapi')do|f|f.request:multipartendpayload={:file=>Faraday::UploadIO.new('...','image/jpeg')}conn.post('/',payload)尝试发布后似乎没有任何反应。当我检查响应时this是我所看到的:#:post,:body=>#,#,@opts={}>,#],@index=0>>,#>],@ios=[#,#,@opts={}>,#],@index=0>,#],@index=0>

  6. ruby - rspec: raise_error 用法来匹配错误信息 - 2

    我使用raise(ConfigurationError.new(msg))引发错误我试着用rspec测试一下:expect{Base.configuration.username}.toraise_error(ConfigurationError,message)但这行不通。我该如何测试呢?目标是匹配message。 最佳答案 您可以使用正则表达式匹配错误消息:it{expect{Foo.bar}.toraise_error(NoMethodError,/private/)}这将检查NoMethodError是否由privateme

  7. 【ChatGPT】ChatGPT 的 N 种用法 - 2

    目录ChatGPT简介技术原理应用未来发展ChatGPT的10 种用法ChatGPT简介ChatGPT是一种基于深度学习的大型语言模型,由OpenAI公司开发。技术原理GPT是GenerativePre-trainedTransformer的缩写,意为生成式预训练变压器。它的技术原理是使用了一个基于注意力机制的变压器(Trans

  8. ruby - 为什么 `Symbol#match` 的行为与 `String#match` 和 `Regexp#match` 不同? - 2

    String#match和Regexp#match在匹配成功时返回一个MatchData:"".match(//)#=>#//.match("")#=>#//.match(:"")#=>#但是Symbol#match返回匹配位置(如String#=~)::"".match(//)#=>0为什么Symbol#match表现不同?有用例吗? 最佳答案 我将其报告为Ruby核心中的错误:https://bugs.ruby-lang.org/issues/11991.让我们看看他们会怎么说。更新被质疑的行为似乎是一个错误。似乎从Ruby2.

  9. ruby - 是否有 Rack::Session::Cookie 用法的基本示例? - 2

    我找不到任何使用Rack::Session::Cookie的简单示例,并且希望能够将信息存储在cookie中,并在以后的请求中访问它并让它过期.这些是我能找到的唯一示例:HowdoIset/getsessionvarsinaRackapp?http://rack.rubyforge.org/doc/classes/Rack/Session/Cookie.html这是我得到的:useRack::Session::Cookie,:key=>'rack.session',:domain=>'foo.com',:path=>'/',:expire_after=>2592000,:secret=

  10. ruby , `match' : invalid byte sequence in UTF-8 - 2

    我对UTF-8编码有一些问题。我在这里阅读了一些帖子,但它仍然无法正常工作。这是我的代码:#!/bin/envruby#encoding:utf-8defdeterminefile=File.open("/home/lala.txt")file.eachdo|line|puts(line)type=line.match(/DOG/)puts('aaaaa')iftype!=nilputs(type[0])breakendendend这是我文件的前3行:;?lalalalal60000065535-1362490443-0000006334-0000018467-0000000041en

随机推荐