Elasticsearch查询——布尔查询Bool Query

Elasticsearch在2.x版本的时候把filter查询给摘掉了,因此在query dsl里面已经找不到filter query了。其实es并没有完全抛弃filter query,而是它的设计与之前的query太重复了。因此直接给转移到了bool查询中。

Bool查询现在包括四种子句,must,filter,should,must_not。

为什么filter会快?

看上面的流程图就能很明显的看到,filter与query还是有很大的区别的。

比如,query的时候,会先比较查询条件,然后计算分值,最后返回文档结果;

而filter则是先判断是否满足查询条件,如果不满足,会缓存查询过程(记录该文档不满足结果);满足的话,就直接缓存结果。

综上所述,filter快在两个方面:

  • 1 对结果进行缓存
  • 2 避免计算分值

bool查询的使用

Bool查询对应Lucene中的BooleanQuery,它由一个或者多个子句组成,每个子句都有特定的类型。

must

返回的文档必须满足must子句的条件,并且参与计算分值

filter

返回的文档必须满足filter子句的条件。但是不会像Must一样,参与计算分值

should

返回的文档可能满足should子句的条件。在一个Bool查询中,如果没有must或者filter,有一个或者多个should子句,那么只要满足一个就可以返回。minimum_should_match参数定义了至少满足几个子句。

must_nout

返回的文档必须不满足must_not定义的条件。

如果一个查询既有filter又有should,那么至少包含一个should子句。

bool查询也支持禁用协同计分选项disable_coord。一般计算分值的因素取决于所有的查询条件。

bool查询也是采用more_matches_is_better的机制,因此满足must和should子句的文档将会合并起来计算分值。

{
    "bool" : {
        "must" : {
            "term" : { "user" : "kimchy" }
        },
        "filter": {
            "term" : { "tag" : "tech" }
        },
        "must_not" : {
            "range" : {
                "age" : { "from" : 10, "to" : 20 }
            }
        },
        "should" : [
            {
                "term" : { "tag" : "wow" }
            },
            {
                "term" : { "tag" : "elasticsearch" }
            }
        ],
        "minimum_should_match" : 1,
        "boost" : 1.0
    }
}

bool.filter的分值计算

在filter子句查询中,分值将会都返回0。分值会受特定的查询影响。

比如,下面三个查询中都是返回所有status字段为active的文档

第一个查询,所有的文档都会返回0:

GET _search
{
  "query": {
    "bool": {
      "filter": {
        "term": {
          "status": "active"
        }
      }
    }
  }
}

下面的bool查询中包含了一个match_all,因此所有的文档都会返回1

GET _search
{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "term": {
          "status": "active"
        }
      }
    }
  }
}

constant_score与上面的查询结果相同,也会给每个文档返回1:

GET _search
{
  "query": {
    "constant_score": {
      "filter": {
        "term": {
          "status": "active"
        }
      }
    }
  }
}

使用named query给子句添加标记

如果想知道到底是bool里面哪个条件匹配,可以使用named query查询:

{
    "bool" : {
        "should" : [
            {"match" : { "name.first" : {"query" : "shay", "_name" : "first"} }},
            {"match" : { "name.last" : {"query" : "banon", "_name" : "last"} }}
        ],
        "filter" : {
            "terms" : {
                "name.last" : ["banon", "kimchy"],
                "_name" : "test"
            }
        }
    }
}

参考

1 bool查询
2 《Elasticsearch IN Action》

本文转自博客园xingoo的博客,原文链接:Elasticsearch查询——布尔查询Bool Query,如需转载请自行联系原博主。

时间: 2024-11-02 15:02:50

Elasticsearch查询——布尔查询Bool Query的相关文章

sql模糊查询怎样查询列名在字段中的查询

问题描述 sql模糊查询怎样查询列名在字段中的查询 select album, aritst as a from CD where album like '%a%' album artist 都是列名 CD 是表名, 我题目的意思是 如何让 like '%a%' 中的a 代表的是artist的别名 而不是 字母a 解决方案 直接将a定义为变量 set n='a' select album, aritst as @n from CD where album like '%' + @n + '%'

session-hibernate4为什么在执行save ()后直接查询直接查询不到数据?

问题描述 hibernate4为什么在执行save ()后直接查询直接查询不到数据? hibernate4为什么在执行save ()后直接查询直接查询不到数据 同样的配置在hibernate3这样是能查询到数据的,换到hibernate4就是查不到, 就像save()操作没有把对象缓存一样,这样是为什么呀?下面是配置 <property name="dialect"> org.hibernate.dialect.MySQL5InnoDBDialect </proper

网站收录查询_PageRank查询_ALEXA查询_综合查询

网站收录查询_PageRank查询_ALEXA查询_综合查询 <% Dim domain, Url, Url1, strPage, StrPage1 Dim xmldom, SD, SITE, dimg domain = request.QueryString("domain") if domain = "" then domain = ".net">www.lrjz.net" domain=replace(domain,&

JPQL动态查询(模糊查询)中通配符与动态变量联合使用的限制

JPQL动态查询(模糊查询)中 通配符 与 动态变量 联合使用 的限制: JPQL动态查询 参数不存在问题解决: 错误使用方式=>形如如下代码: 1/2: public Item fuzzySearch(String name) { String queryString = "SELECT i FROM Item i WHERE i.name LIKE '%:param%'"; Query query = em.createQuery(queryString); query.se

Yii框架参数化查询中IN查询只能查询一个的解决方法

本文实例讲述了Yii框架参数化查询中IN查询只能查询一个的解决方法.分享给大家供大家参考,具体如下: 在yii框架中使用参数化进行IN查询时,结果不如所愿 $sql =<<<SQL SELECT id FROM tb WHERE id IN(:ids) SQL; $db = GeneralService::getSlaveDB(); $result = $db->createCommand($sql)->query([':ids' => '1013,1015,1017'

plsql-PLSQL循环嵌套查询,查询结果一直不打印输出

问题描述 PLSQL循环嵌套查询,查询结果一直不打印输出 declare -- Local variables here i integer := 1; currentdate timestamp; ninsdate timestamp; nseqid number; ndate varchar2(10); nspid varchar2(10); po INTEGER; begin ndate := '201506'; nspid := '33474'; po:=0; select sysdat

公交查询如何实现 换乘查询 站点查询 路线查询 的功能

问题描述 公交查询如何实现 换乘查询 站点查询 路线查询 的功能 公交查询如何实现 换乘查询 站点查询 路线查询 的功能 谁有具体代码 急求 解决方案 这得有gis技术的支持吧? 解决方案二: 微信公众平台天气查询,火车票查询,快递查询,小黄鸡,翻译,公交查询的实现微信公众平台天气查询,火车票查询,快递查询,小黄鸡,翻译,公交查询的实现

c# 数据库表连接查询-C#代码中查询数据库查询两个连接起来的表怎么获取数据并把数据放到DataSet中?

问题描述 C#代码中查询数据库查询两个连接起来的表怎么获取数据并把数据放到DataSet中? 以下是获取所有信息的代码函数: public static DataSet GetAllInfos() { string sql = "select InfoID,InfoTitle,InfoTime,InfoContent,i.AccountID,a.AccountName from Info as i inner join Account as a on i.AccountID = a.Accoun

字符-php中模糊查询出现查询不匹配

问题描述 php中模糊查询出现查询不匹配 模糊查询,查询出来的结果跟输入的字符不一样.我昨天查询'生',出现结果有俩个'生产部'.'销售部'.查询我用的是 like '%字符%'.哪位可以帮忙解决.谢谢. 解决方案 销售部也能查询出来?你确认你显示的字段和你查询的字段同一个?还是查询的另外一个字段,显示的和查询字段不一样什么的 解决方案二: $sql=""select R_AddressR_NoR_IDR_DescR_Status from A_Repository where R_A