ElasticSearch 组合过滤器

  1、布尔过滤器

    前篇文章中(term精确查找)的两个例子都是单个过滤器(filter)的使用方式。 在实际应用中,我们很有可能会过滤多个值或字段。比方说,怎样用 Elasticsearch 来表达下面的 SQL ?

    

    这种情况下,我们需要 bool (布尔)过滤器。 这是个 复合过滤器(compound filter) ,它可以接受多个其他过滤器作为参数,并将这些过滤器结合成各式各样的布尔(逻辑)组合。

    一个 bool 过滤器由三部分组成:

    

    

    must
    所有的语句都 必须(must) 匹配,与 AND 等价。
    must_not
    所有的语句都 不能(must not) 匹配,与 NOT 等价。
    should
    至少有一个语句要匹配,与 OR 等价。

    只须将它们置入 bool 过滤器的不同部分即可,一个 bool 过滤器的每个部分都是可选的(例如,我们可以只有一个 must 语句),而且每个部分内部可以只有一个或一组过滤器。

    用 Elasticsearch 来表示本部分开始处的 SQL 例子,将两个 term 过滤器置入 bool 过滤器的 should 语句内,再增加一个语句处理 NOT 非的条件:

GET /my_store/products/_search
{
   "query" :
   {
      "bool" :
      {
              "should" :
              [
                 { "term" : {"price" : 20}},
                 { "term" : {"productID" : "XHDK-A-1293-#fJ3"}}
              ],
              "must_not" : {"term" : {"price" : 30} }
      }
   }
}

    

    

    在 should 语句块里面的两个 term 过滤器与 bool 过滤器是父子关系,两个 term 条件需要匹配其一。

    如果一个产品的价格是 30 ,那么它会自动被排除,因为它处于 must_not 语句里面。

    结果返回了 2 个命中结果,两个文档分别匹配了 bool 过滤器其中的一个条件

 

  2、嵌套布尔过滤器

    

    尽管 bool 是一个复合的过滤器,可以接受多个子过滤器,需要注意的是 bool 过滤器本身仍然还只是一个过滤器。 这意味着我们可以将一个 bool 过滤器置于其他 bool 过滤器内部,

    这为我们提供了对任意复杂布尔逻辑进行处理的能力。

    对于以下这个 SQL 语句:

    

    我们将其转换成一组嵌套的 bool 过滤器:

GET /my_store/products/_search
{
   "query" :
   {
      "bool" :
      {
              "should" :
              [
                 { "term" : {"productID" : "XHDK-A-1293-#fJ3"}},
                 { "bool" :
                    {
                      "must" :
                      [
                        { "term" : {"productID" : "JODL-X-1937-#pV7"}},
                        { "term" : {"price" : 30}}
                      ]
                    }
                 }
              ]
      }
   }
}

    

    因为 term 和 bool 过滤器是兄弟关系,他们都处于外层的布尔逻辑 should 的内部,返回的命中文档至少须匹配其中一个过滤器的条件。

    这两个 term 语句作为兄弟关系,同时处于 must 语句之中,所以返回的命中文档要必须都能同时匹配这两个条件。

时间: 2024-10-31 00:11:13

ElasticSearch 组合过滤器的相关文章

elasticsearch 过滤器的种类

elasticsearch之查询过滤 elasticsearch elastic-search xixicat 2月13日发布 推荐 1 推荐 收藏 2 收藏,289 浏览 序 本文主要记录es的查询过滤的使用. 使用过滤器 过滤器不影响评分,而评分计算让搜索变得复杂,而且需要CPU资源,因而尽量使用过滤器,而且过滤器容易被缓存,进一步提升查询的整体性能. post_filter(先查询再过滤) { "query": { "match":{"title&q

Elasticsearch基础教程

http://blog.csdn.net/cnweike/article/details/33736429 基础概念 Elasticsearch有几个核心概念.从一開始理解这些概念会对整个学习过程有莫大的帮助. 接近实时(NRT) Elasticsearch是一个接近实时的搜索平台.这意味着,从索引一个文档直到这个文档可以被搜索到有一个轻微的延迟(一般是1秒). 集群(cluster) 一个集群就是由一个或多个节点组织在一起.它们共同持有你整个的数据.并一起提供索引和搜索功能.一个集群由一个唯一

ElasticSearch常用结构化搜索

最近,需要用到ES的一些常用的结构化搜索命令,因此,看了一些官方的文档,学习了一下.结构化查询指的是查询那些具有内在结构的数据,比如日期.时间.数字都是结构化的. 它们都有精确的格式,我们可以对这些数据进行逻辑操作,比较常见的操作包括比较时间区间,或者获取两个数字间的较大值. 精确查询 当进行精确查询时,过滤器filter是十分重要的,因为它们效率非常高,过滤器不计算相关性(直接跳过了整个记分阶段)而且很容易进行缓存. 过滤数字 我们首先看 term filter,它最常用,可以用来处理数字,布

最完整的Elasticsearch 基础教程

基础概念 Elasticsearch有几个核心概念.从一开始理解这些概念会对整个学习过程有莫大的帮助. 接近实时(NRT)        Elasticsearch是一个接近实时的搜索平台.这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是1秒).           集群(cluster)        一个集群就是由一个或多个节点组织在一起,它们共同持有你整个的数据,并一起提供索引和搜索功能.一个集群由一个唯一的名字标识,这个名字默认就是 "elasticsearch&

[转]组合过滤

https://es.xiaoleilu.com/080_Structured_Search/10_compoundfilters.html 这里有个完整文档 组合过滤 前面的两个例子展示了单个过滤器的使用.现实中,你可能需要过滤多个值或字段,例如,想在 Elasticsearch 中表达这句 SQL 吗? SELECT product FROM products WHERE (price = 20 OR productID = "XHDK-A-1293-#fJ3") AND (pri

Python Elasticsearch api

描述:ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.下面介绍了利用Python API接口进行数据查询,方便其他系统的调用. 安装API 1 pip install elasticsearch 建立es连接 1 2 from elasticsearch import Elasticsearch es = Elasticsearch([{'host':'10.10.13.12','port':9200}])

(转载)Elasticsearch基础教程

转自 http://blog.csdn.net/cnweike/article/details/33736429 基础概念 Elasticsearch有几个核心概念.从一开始理解这些概念会对整个学习过程有莫大的帮助. 接近实时(NRT)        Elasticsearch是一个接近实时的搜索平台.这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是1秒).           集群(cluster)        一个集群就是由一个或多个节点组织在一起,它们共同持有你整

Elasticsearch 基础笔记

资料篇 主站 中文指南 基础篇 简介 Elasticsearch是一个使用JAVA开发,基于Apache Lucene(TM)的开源搜索引擎. 分布式的实时文件存储,每个字段都被索引并可被搜索 分布式的实时分析搜索引擎 可以扩展到上百台服务器,处理PB级结构化或非结构化数据 索引(_index) ES中索引概念的区分 索引(名词) 它是相关文档存储的地方,一个索引(index)就像是传统关系数据库中的数据库. 索引(动词) 「索引一个文档」表示把一个文档存储到索引(名词)里,以便它可以被检索或者

Elasticsearch入门基础(1)

基础概念 Elasticsearch有几个核心概念.从一开始理解这些概念会对整个学习过程有莫大的帮助. 接近实时(NRT) Elasticsearch是一个接近实时的搜索平台.这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是1秒). 集群(cluster) 一个集群就是由一个或多个节点组织在一起,它们共同持有你整个的数据,并一起提供索引和搜索功能.一个集群由一个唯一的名字标识,这个名字默认就是 "elasticsearch".这个名字是重要的,因为一个节点只能通